Как создать 1D текстуру в Vulkan - PullRequest
0 голосов
/ 31 марта 2020

У меня проблема с созданием 1D текстуры, и я не знаю, как ее решить.

Текстура с плавающей точкой pData[256][4].

Код выглядит так:

    VkDeviceSize imageSize = 256 * 4 * 4;


    uint32_t texMemSize = ftsize;   


    VkBuffer stagingBuffer;

    VkDeviceMemory stagingMemory;


    VkBufferCreateInfo bufferCreateInfo = {};

    bufferCreateInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;

    bufferCreateInfo.size = imageSize;

    bufferCreateInfo.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;

    bufferCreateInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;




    if (vkCreateBuffer(device, &bufferCreateInfo, nullptr, &stagingBuffer) != VK_SUCCESS) {

        throw std::runtime_error("failed to create buffer!");

    }


    VkMemoryAllocateInfo memAllocInfo2 = { };

    memAllocInfo2.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;


    VkMemoryRequirements memReqs2 = {};

    vkGetBufferMemoryRequirements(device, stagingBuffer, &memReqs2);

    memAllocInfo2.allocationSize = memReqs2.size;

    memAllocInfo2.memoryTypeIndex = findMemoryType(memReqs2.memoryTypeBits, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);


    if (vkAllocateMemory(device, &memAllocInfo2, nullptr, &stagingMemory) != VK_SUCCESS) {

        throw std::runtime_error("failed to allocate memory 2!");

    }

    vkBindBufferMemory(device, stagingBuffer, stagingMemory, 0);


    void* data;

    vkMapMemory(device, stagingMemory, 0, imageSize, 0, &data);

    memcpy(data, pData, static_cast<size_t>(imageSize));

    vkUnmapMemory(device, stagingMemory);


    delete pData;


    //

    VkImageCreateInfo imageInfo = {};
    imageInfo.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
    imageInfo.imageType = VK_IMAGE_TYPE_1D;
    imageInfo.extent.width = static_cast<uint32_t>(256);
    imageInfo.extent.depth = 1;
    imageInfo.extent.height = 1;
    imageInfo.mipLevels = 1;
    imageInfo.arrayLayers = 1;
    imageInfo.format = VK_FORMAT_R32G32B32A32_UINT;
    imageInfo.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
    imageInfo.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
    imageInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
    imageInfo.samples = VK_SAMPLE_COUNT_1_BIT;
    imageInfo.flags = 0; // Optional 
    imageInfo.tiling = VK_IMAGE_TILING_OPTIMAL;

    if (vkCreateImage(device, &imageInfo, nullptr, &tftextureImage) != VK_SUCCESS) {

        throw std::runtime_error("failed to create image!");

    }

Код всегда дает мне ошибку времени выполнения "не удалось создать изображение", я пытался изменить некоторые вещи, такие как формат, экстент и т. Д. c, но я не могу ее решить.

Я считаю, что ошибка только в части imageInfo, потому что первый работает нормально.

...