diff --git a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp index f2ba6571a..efbef9bc2 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp @@ -179,6 +179,12 @@ std::vector WrappedVulkan::GetImplicitRenderPassBarriers(u if(IsDepthAndStencilFormat(c.format)) barrier.subresourceRange.aspectMask = (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT); + if(c.type == VK_IMAGE_TYPE_3D) + { + barrier.subresourceRange.baseArrayLayer = 0; + barrier.subresourceRange.layerCount = 1; + } + barrier.newLayout = atts[i].layout; // search back from this subpass to see which layout it was in before. If it's diff --git a/renderdoc/driver/vulkan/wrappers/vk_misc_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_misc_funcs.cpp index 306b10b2c..cb64e55ea 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_misc_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_misc_funcs.cpp @@ -694,6 +694,18 @@ VkResult WrappedVulkan::vkCreateFramebuffer(VkDevice device, record->imageAttachments[i].barrier.image = GetResourceManager()->GetCurrentHandle(attRecord->baseResource); record->imageAttachments[i].barrier.subresourceRange = attRecord->viewRange; + + ImageLayouts *layout = NULL; + { + SCOPED_LOCK(m_ImageLayoutsLock); + layout = &m_ImageLayouts[attRecord->GetResourceID()]; + } + + if(layout->imageInfo.extent.depth > 1) + { + record->imageAttachments[i].barrier.subresourceRange.baseArrayLayer = 0; + record->imageAttachments[i].barrier.subresourceRange.layerCount = 1; + } } } } diff --git a/util/test/demos/vk/vk_texture_zoo.cpp b/util/test/demos/vk/vk_texture_zoo.cpp index bbf5c8576..83c5ffb56 100644 --- a/util/test/demos/vk/vk_texture_zoo.cpp +++ b/util/test/demos/vk/vk_texture_zoo.cpp @@ -1077,6 +1077,7 @@ void main() pipeCreateInfo.depthStencilState.depthCompareOp = VK_COMPARE_OP_ALWAYS; pipeCreateInfo.depthStencilState.front.compareOp = VK_COMPARE_OP_ALWAYS; + renderPassCreateInfo.attachments[0].initialLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; renderPassCreateInfo.attachments[0].finalLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; VkPipelineShaderStageCreateInfo msps[(size_t)DataType::Count]; @@ -1103,18 +1104,32 @@ void main() vkBeginCommandBuffer(cmd, vkh::CommandBufferBeginInfo()); + VkImageAspectFlags aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + + if(t.isDepth) + { + aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT; + + if(t.fmt.viewFmt == VK_FORMAT_S8_UINT || t.fmt.viewFmt == VK_FORMAT_D16_UNORM_S8_UINT || + t.fmt.viewFmt == VK_FORMAT_D24_UNORM_S8_UINT || + t.fmt.viewFmt == VK_FORMAT_D32_SFLOAT_S8_UINT) + aspectMask |= VK_IMAGE_ASPECT_STENCIL_BIT; + } + + vkh::cmdPipelineBarrier( + cmd, { + vkh::ImageMemoryBarrier( + 0, VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | + VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, + VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, + t.res.image, vkh::ImageSubresourceRange(aspectMask)), + }); + if(!t.canRender && !t.isDepth) { TEST_WARN("Need data for test %s %s, but it's not a renderable/depthable format", t.fmt.name.c_str(), MakeName(t).c_str()); - vkh::cmdPipelineBarrier( - cmd, { - vkh::ImageMemoryBarrier(0, VK_ACCESS_SHADER_READ_BIT, VK_IMAGE_LAYOUT_UNDEFINED, - VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, t.res.image, - vkh::ImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT)), - }); - vkEndCommandBuffer(cmd); Submit(99, 99, {cmd}); @@ -1276,18 +1291,6 @@ void main() if(viewType == VK_IMAGE_VIEW_TYPE_3D) viewType = VK_IMAGE_VIEW_TYPE_2D_ARRAY; - VkImageAspectFlags aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; - - if(t.isDepth) - { - aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT; - - if(t.fmt.viewFmt == VK_FORMAT_S8_UINT || t.fmt.viewFmt == VK_FORMAT_D16_UNORM_S8_UINT || - t.fmt.viewFmt == VK_FORMAT_D24_UNORM_S8_UINT || - t.fmt.viewFmt == VK_FORMAT_D32_SFLOAT_S8_UINT) - aspectMask |= VK_IMAGE_ASPECT_STENCIL_BIT; - } - vkCreateImageView( device, vkh::ImageViewCreateInfo(t.res.image, viewType, t.fmt.viewFmt, {}, vkh::ImageSubresourceRange(aspectMask, mp, 1, sl, 1)),