diff --git a/texturecubemap/texturecubemap.cpp b/texturecubemap/texturecubemap.cpp index 253127b8..bd3c2480 100644 --- a/texturecubemap/texturecubemap.cpp +++ b/texturecubemap/texturecubemap.cpp @@ -127,6 +127,7 @@ public: imageCreateInfo.tiling = VK_IMAGE_TILING_LINEAR; imageCreateInfo.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT; imageCreateInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE; + imageCreateInfo.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED; imageCreateInfo.flags = 0; VkMemoryAllocateInfo memAllocInfo = vkTools::initializers::memoryAllocateInfo(); @@ -186,7 +187,7 @@ public: cmdBuffer, cubeFace[face].image, VK_IMAGE_ASPECT_COLOR_BIT, - VK_IMAGE_LAYOUT_UNDEFINED, + VK_IMAGE_LAYOUT_PREINITIALIZED, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL); } @@ -213,12 +214,21 @@ public: // Image barrier for optimal image (target) // Optimal image will be used as destination for the copy + + // Set initial layout for all array layers of the optimal (target) tiled texture + VkImageSubresourceRange subresourceRange = {}; + subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + subresourceRange.baseMipLevel = 0; + subresourceRange.levelCount = 1; + subresourceRange.layerCount = 6; + vkTools::setImageLayout( cmdBuffer, cubeMap.image, VK_IMAGE_ASPECT_COLOR_BIT, - VK_IMAGE_LAYOUT_UNDEFINED, - VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); + VK_IMAGE_LAYOUT_PREINITIALIZED, + VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, + subresourceRange); // Copy cube map faces one by one for (uint32_t face = 0; face < 6; ++face) @@ -245,20 +255,23 @@ public: // Put image copy into command buffer vkCmdCopyImage( cmdBuffer, - cubeFace[face].image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, - cubeMap.image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - 1, ©Region); - - // Change texture image layout to shader read after the copy - cubeMap.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; - vkTools::setImageLayout( - cmdBuffer, - cubeMap.image, - VK_IMAGE_ASPECT_COLOR_BIT, + cubeFace[face].image, + VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, + cubeMap.image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - cubeMap.imageLayout); + 1, ©Region); } + // Change texture image layout to shader read after all faces have been copied + cubeMap.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; + vkTools::setImageLayout( + cmdBuffer, + cubeMap.image, + VK_IMAGE_ASPECT_COLOR_BIT, + VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, + cubeMap.imageLayout, + subresourceRange); + err = vkEndCommandBuffer(cmdBuffer); assert(!err);