Minor code cleanup, better naming and comments

This commit is contained in:
Sascha Willems 2020-07-19 12:13:42 +02:00
parent 8ed41c6ae8
commit 8526c204e7

View file

@ -158,34 +158,30 @@ public:
ktx_uint8_t *ktxTextureData = ktxTexture_GetData(ktxTexture); ktx_uint8_t *ktxTextureData = ktxTexture_GetData(ktxTexture);
ktx_size_t ktxTextureSize = ktxTexture_GetSize(ktxTexture); ktx_size_t ktxTextureSize = ktxTexture_GetSize(ktxTexture);
VkMemoryAllocateInfo memAllocInfo = vks::initializers::memoryAllocateInfo(); vks::Buffer sourceData;
VkMemoryRequirements memReqs;
// Create a host-visible staging buffer that contains the raw image data
VkBuffer stagingBuffer;
VkDeviceMemory stagingMemory;
// Create a host-visible source buffer that contains the raw image data
VkBufferCreateInfo bufferCreateInfo = vks::initializers::bufferCreateInfo(); VkBufferCreateInfo bufferCreateInfo = vks::initializers::bufferCreateInfo();
bufferCreateInfo.size = ktxTextureSize; bufferCreateInfo.size = ktxTextureSize;
// This buffer is used as a transfer source for the buffer copy
bufferCreateInfo.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT; bufferCreateInfo.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
bufferCreateInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE; bufferCreateInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
VK_CHECK_RESULT(vkCreateBuffer(device, &bufferCreateInfo, nullptr, &sourceData.buffer));
VK_CHECK_RESULT(vkCreateBuffer(device, &bufferCreateInfo, nullptr, &stagingBuffer)); // Get memory requirements for the source buffer (alignment, memory type bits)
VkMemoryRequirements memReqs;
// Get memory requirements for the staging buffer (alignment, memory type bits) vkGetBufferMemoryRequirements(device, sourceData.buffer, &memReqs);
vkGetBufferMemoryRequirements(device, stagingBuffer, &memReqs); VkMemoryAllocateInfo memAllocInfo = vks::initializers::memoryAllocateInfo();
memAllocInfo.allocationSize = memReqs.size; memAllocInfo.allocationSize = memReqs.size;
// Get memory type index for a host visible buffer // Get memory type index for a host visible buffer
memAllocInfo.memoryTypeIndex = vulkanDevice->getMemoryType(memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT); memAllocInfo.memoryTypeIndex = vulkanDevice->getMemoryType(memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
VK_CHECK_RESULT(vkAllocateMemory(device, &memAllocInfo, nullptr, &stagingMemory)); VK_CHECK_RESULT(vkAllocateMemory(device, &memAllocInfo, nullptr, &sourceData.memory));
VK_CHECK_RESULT(vkBindBufferMemory(device, stagingBuffer, stagingMemory, 0)); VK_CHECK_RESULT(vkBindBufferMemory(device, sourceData.buffer, sourceData.memory, 0));
// Copy texture data into staging buffer // Copy the ktx image data into the source buffer
uint8_t *data; uint8_t *data;
VK_CHECK_RESULT(vkMapMemory(device, stagingMemory, 0, memReqs.size, 0, (void **)&data)); VK_CHECK_RESULT(vkMapMemory(device, sourceData.memory, 0, memReqs.size, 0, (void **)&data));
memcpy(data, ktxTextureData, ktxTextureSize); memcpy(data, ktxTextureData, ktxTextureSize);
vkUnmapMemory(device, stagingMemory); vkUnmapMemory(device, sourceData.memory);
// Create optimal tiled target image // Create optimal tiled target image
VkImageCreateInfo imageCreateInfo = vks::initializers::imageCreateInfo(); VkImageCreateInfo imageCreateInfo = vks::initializers::imageCreateInfo();
@ -202,25 +198,17 @@ public:
imageCreateInfo.arrayLayers = 6 * cubeMapArray.layerCount; imageCreateInfo.arrayLayers = 6 * cubeMapArray.layerCount;
// This flag is required for cube map images // This flag is required for cube map images
imageCreateInfo.flags = VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT; imageCreateInfo.flags = VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT;
VK_CHECK_RESULT(vkCreateImage(device, &imageCreateInfo, nullptr, &cubeMapArray.image)); VK_CHECK_RESULT(vkCreateImage(device, &imageCreateInfo, nullptr, &cubeMapArray.image));
// Allocate memory for the cube map array image
vkGetImageMemoryRequirements(device, cubeMapArray.image, &memReqs); vkGetImageMemoryRequirements(device, cubeMapArray.image, &memReqs);
memAllocInfo.allocationSize = memReqs.size; memAllocInfo.allocationSize = memReqs.size;
memAllocInfo.memoryTypeIndex = vulkanDevice->getMemoryType(memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); memAllocInfo.memoryTypeIndex = vulkanDevice->getMemoryType(memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
VK_CHECK_RESULT(vkAllocateMemory(device, &memAllocInfo, nullptr, &cubeMapArray.deviceMemory)); VK_CHECK_RESULT(vkAllocateMemory(device, &memAllocInfo, nullptr, &cubeMapArray.deviceMemory));
VK_CHECK_RESULT(vkBindImageMemory(device, cubeMapArray.image, cubeMapArray.deviceMemory, 0)); VK_CHECK_RESULT(vkBindImageMemory(device, cubeMapArray.image, cubeMapArray.deviceMemory, 0));
VkCommandBuffer copyCmd = vulkanDevice->createCommandBuffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY, true); /*
We now copy the parts that make up the cube map array to our image via a command buffer
// Setup buffer copy regions for each face including all of its miplevels
std::vector<VkBufferImageCopy> bufferCopyRegions;
uint32_t offset = 0;
/*
Setup buffer copy regions to copy the data from the ktx file to our image
Cube map arrays in ktx are stored with a layout like this: Cube map arrays in ktx are stored with a layout like this:
- Mip Level 0 - Mip Level 0
- Layer 0 (= Cube map 0) - Layer 0 (= Cube map 0)
@ -242,6 +230,11 @@ public:
... ...
*/ */
VkCommandBuffer copyCmd = vulkanDevice->createCommandBuffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY, true);
// Setup buffer copy regions for each face including all of its miplevels
std::vector<VkBufferImageCopy> bufferCopyRegions;
uint32_t offset = 0;
for (uint32_t face = 0; face < 6; face++) { for (uint32_t face = 0; face < 6; face++) {
for (uint32_t layer = 0; layer < ktxTexture->numLayers; layer++) { for (uint32_t layer = 0; layer < ktxTexture->numLayers; layer++) {
for (uint32_t level = 0; level < ktxTexture->numLevels; level++) { for (uint32_t level = 0; level < ktxTexture->numLevels; level++) {
@ -262,39 +255,28 @@ public:
} }
} }
// Image barrier for optimal image (target)
// Set initial layout for all array layers (faces) of the optimal (target) tiled texture
VkImageSubresourceRange subresourceRange = {}; VkImageSubresourceRange subresourceRange = {};
subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
subresourceRange.baseMipLevel = 0; subresourceRange.baseMipLevel = 0;
subresourceRange.levelCount = cubeMapArray.mipLevels; subresourceRange.levelCount = cubeMapArray.mipLevels;
subresourceRange.layerCount = 6 * cubeMapArray.layerCount; subresourceRange.layerCount = 6 * cubeMapArray.layerCount;
vks::tools::setImageLayout( // Transition target image to accept the writes from our buffer to image copies
copyCmd, vks::tools::setImageLayout(copyCmd, cubeMapArray.image, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, subresourceRange);
cubeMapArray.image,
VK_IMAGE_LAYOUT_UNDEFINED,
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
subresourceRange);
// Copy the cube map faces from the staging buffer to the optimal tiled image // Copy the cube map array buffer parts from the staging buffer to the optimal tiled image
vkCmdCopyBufferToImage( vkCmdCopyBufferToImage(
copyCmd, copyCmd,
stagingBuffer, sourceData.buffer,
cubeMapArray.image, cubeMapArray.image,
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
static_cast<uint32_t>(bufferCopyRegions.size()), static_cast<uint32_t>(bufferCopyRegions.size()),
bufferCopyRegions.data() bufferCopyRegions.data()
); );
// Change texture image layout to shader read after all faces have been copied // Transition image to shader read layout
cubeMapArray.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; cubeMapArray.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
vks::tools::setImageLayout( vks::tools::setImageLayout(copyCmd, cubeMapArray.image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, cubeMapArray.imageLayout, subresourceRange);
copyCmd,
cubeMapArray.image,
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
cubeMapArray.imageLayout,
subresourceRange);
vulkanDevice->flushCommandBuffer(copyCmd, queue, true); vulkanDevice->flushCommandBuffer(copyCmd, queue, true);
@ -331,8 +313,8 @@ public:
VK_CHECK_RESULT(vkCreateImageView(device, &view, nullptr, &cubeMapArray.view)); VK_CHECK_RESULT(vkCreateImageView(device, &view, nullptr, &cubeMapArray.view));
// Clean up staging resources // Clean up staging resources
vkFreeMemory(device, stagingMemory, nullptr); vkFreeMemory(device, sourceData.memory, nullptr);
vkDestroyBuffer(device, stagingBuffer, nullptr); vkDestroyBuffer(device, sourceData.buffer, nullptr);
ktxTexture_Destroy(ktxTexture); ktxTexture_Destroy(ktxTexture);
} }