Fixed image layout transitions and initial layouts and command buffer submissions for offscreen examples

This commit is contained in:
saschawillems 2016-03-13 16:04:39 +01:00
parent 01f0a1a574
commit 72e6cd8ee5
5 changed files with 77 additions and 46 deletions

View file

@ -195,6 +195,7 @@ public:
imageCreateInfo.tiling = VK_IMAGE_TILING_OPTIMAL;
imageCreateInfo.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
imageCreateInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
imageCreateInfo.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
imageCreateInfo.flags = VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT;
VkMemoryAllocateInfo memAllocInfo = vkTools::initializers::memoryAllocateInfo();
@ -231,12 +232,18 @@ public:
assert(!err);
// Image barrier for optimal image (target)
VkImageSubresourceRange subresourceRange = {};
subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
subresourceRange.baseMipLevel = 0;
subresourceRange.levelCount = 1;
subresourceRange.layerCount = 6;
vkTools::setImageLayout(
cmdBuffer,
shadowCubeMap.image,
VK_IMAGE_ASPECT_COLOR_BIT,
VK_IMAGE_LAYOUT_UNDEFINED,
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
VK_IMAGE_LAYOUT_PREINITIALIZED,
VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
subresourceRange);
err = vkEndCommandBuffer(cmdBuffer);
assert(!err);
@ -357,14 +364,14 @@ public:
// Depth stencil attachment
image.format = fbDepthFormat;
image.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
image.initialLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
image.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
VkImageViewCreateInfo depthStencilView = vkTools::initializers::imageViewCreateInfo();
depthStencilView.viewType = VK_IMAGE_VIEW_TYPE_2D;
depthStencilView.format = fbDepthFormat;
depthStencilView.flags = 0;
depthStencilView.subresourceRange = {};
depthStencilView.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
depthStencilView.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
depthStencilView.subresourceRange.baseMipLevel = 0;
depthStencilView.subresourceRange.levelCount = 1;
depthStencilView.subresourceRange.baseArrayLayer = 0;
@ -384,8 +391,8 @@ public:
vkTools::setImageLayout(
setupCmdBuffer,
offScreenFrameBuf.depth.image,
VK_IMAGE_ASPECT_DEPTH_BIT,
VK_IMAGE_LAYOUT_UNDEFINED,
VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT,
VK_IMAGE_LAYOUT_PREINITIALIZED,
VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
flushSetupCommandBuffer();
@ -481,7 +488,6 @@ public:
vkCmdDrawIndexed(offScreenCmdBuffer, meshes.scene.indexCount, 1, 0, 0, 0);
vkCmdEndRenderPass(offScreenCmdBuffer);
// Make sure color writes to the framebuffer are finished before using it as transfer source
vkTools::setImageLayout(
offScreenCmdBuffer,
@ -519,14 +525,6 @@ public:
1,
&copyRegion);
// Make sure transfer to cube map face is finished before sampling it in a shader
vkTools::setImageLayout(
offScreenCmdBuffer,
shadowCubeMap.image,
VK_IMAGE_ASPECT_COLOR_BIT,
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
// Transform framebuffer color attachment back
vkTools::setImageLayout(
offScreenCmdBuffer,
@ -572,11 +570,35 @@ public:
0);
vkCmdSetScissor(offScreenCmdBuffer, 0, 1, &scissor);
VkImageSubresourceRange subresourceRange = {};
subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
subresourceRange.baseMipLevel = 0;
subresourceRange.levelCount = 1;
subresourceRange.layerCount = 6;
// Change image layout for all cubemap faces to transfer destination
vkTools::setImageLayout(
offScreenCmdBuffer,
shadowCubeMap.image,
VK_IMAGE_ASPECT_COLOR_BIT,
VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
subresourceRange);
for (uint32_t face = 0; face < 6; ++face)
{
updateCubeFace(face);
}
// Change image layout for all cubemap faces to shader read after they have been copied
vkTools::setImageLayout(
offScreenCmdBuffer,
shadowCubeMap.image,
VK_IMAGE_ASPECT_COLOR_BIT,
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
subresourceRange);
err = vkEndCommandBuffer(offScreenCmdBuffer);
assert(!err);
}