diff --git a/renderdoc/driver/vulkan/vk_initstate.cpp b/renderdoc/driver/vulkan/vk_initstate.cpp index d8291c155..3e1777b89 100644 --- a/renderdoc/driver/vulkan/vk_initstate.cpp +++ b/renderdoc/driver/vulkan/vk_initstate.cpp @@ -1024,7 +1024,7 @@ bool WrappedVulkan::Prepare_InitialState(WrappedVkRes *res) VkImageAspectFlags aspectFlags = VK_IMAGE_ASPECT_COLOR_BIT; if (IsDepthStencilFormat(layout->format)) - aspectFlags = VK_IMAGE_ASPECT_DEPTH_BIT; + aspectFlags = IsDepthOnlyFormat(layout->format) ? VK_IMAGE_ASPECT_DEPTH_BIT : (VK_IMAGE_ASPECT_DEPTH_BIT|VK_IMAGE_ASPECT_STENCIL_BIT); VkImageMemoryBarrier srcimBarrier = { VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, NULL, @@ -1536,8 +1536,9 @@ bool WrappedVulkan::Serialise_InitialState(ResourceId resid, WrappedVkRes *) VkImageAspectFlags aspectFlags = VK_IMAGE_ASPECT_COLOR_BIT; - if (IsDepthStencilFormat(m_CreationInfo.m_Image[liveim->id].format)) - aspectFlags = VK_IMAGE_ASPECT_DEPTH_BIT; + VkFormat fmt = m_CreationInfo.m_Image[liveim->id].format; + if (IsDepthStencilFormat(fmt)) + aspectFlags = IsDepthOnlyFormat(fmt) ? VK_IMAGE_ASPECT_DEPTH_BIT : (VK_IMAGE_ASPECT_DEPTH_BIT|VK_IMAGE_ASPECT_STENCIL_BIT); VkImageMemoryBarrier srcimBarrier = { VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, NULL, @@ -1922,8 +1923,9 @@ void WrappedVulkan::Apply_InitialState(WrappedVkRes *live, VulkanResourceManager VkImageAspectFlags aspectFlags = VK_IMAGE_ASPECT_COLOR_BIT; - if (IsDepthStencilFormat(m_CreationInfo.m_Image[id].format)) - aspectFlags = VK_IMAGE_ASPECT_DEPTH_BIT; + VkFormat fmt = m_CreationInfo.m_Image[id].format; + if (IsDepthStencilFormat(fmt)) + aspectFlags = IsDepthOnlyFormat(fmt) ? VK_IMAGE_ASPECT_DEPTH_BIT : (VK_IMAGE_ASPECT_DEPTH_BIT|VK_IMAGE_ASPECT_STENCIL_BIT); VkImageMemoryBarrier dstimBarrier = { VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, NULL, diff --git a/renderdoc/driver/vulkan/vk_replay.cpp b/renderdoc/driver/vulkan/vk_replay.cpp index 33b4bf07a..9e4c4e1d8 100644 --- a/renderdoc/driver/vulkan/vk_replay.cpp +++ b/renderdoc/driver/vulkan/vk_replay.cpp @@ -966,6 +966,7 @@ bool VulkanReplay::RenderTextureInternal(TextureDisplay cfg, VkRenderPassBeginIn VkImage liveIm = m_pDriver->GetResourceManager()->GetCurrentHandle(cfg.texid); VkImageAspectFlags aspectFlags = VK_IMAGE_ASPECT_COLOR_BIT; + VkImageAspectFlags aspectFlagsBarrier = VK_IMAGE_ASPECT_COLOR_BIT; int displayformat = 0; uint32_t descSetBinding = 0; @@ -987,11 +988,12 @@ bool VulkanReplay::RenderTextureInternal(TextureDisplay cfg, VkRenderPassBeginIn if(IsDepthOnlyFormat(layouts.format)) { - aspectFlags = VK_IMAGE_ASPECT_DEPTH_BIT; + aspectFlagsBarrier = aspectFlags = VK_IMAGE_ASPECT_DEPTH_BIT; } else if(IsDepthStencilFormat(layouts.format)) { aspectFlags = VK_IMAGE_ASPECT_DEPTH_BIT; + aspectFlagsBarrier = VK_IMAGE_ASPECT_DEPTH_BIT|VK_IMAGE_ASPECT_STENCIL_BIT; // barriers must cover both aspects if(layouts.format == VK_FORMAT_S8_UINT || (!cfg.Red && cfg.Green)) { aspectFlags = VK_IMAGE_ASPECT_STENCIL_BIT; @@ -1147,7 +1149,7 @@ bool VulkanReplay::RenderTextureInternal(TextureDisplay cfg, VkRenderPassBeginIn 0, 0, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED, Unwrap(liveIm), - { aspectFlags, 0, 1, 0, 1 } + { aspectFlagsBarrier, 0, 1, 0, 1 } }; // ensure all previous writes have completed @@ -3427,12 +3429,17 @@ bool VulkanReplay::GetMinMax(ResourceId texid, uint32_t sliceFace, uint32_t mip, VkImage liveIm = m_pDriver->GetResourceManager()->GetCurrentHandle(texid); VkImageAspectFlags aspectFlags = VK_IMAGE_ASPECT_COLOR_BIT; + VkImageAspectFlags aspectFlagsBarrier = VK_IMAGE_ASPECT_COLOR_BIT; if(IsDepthStencilFormat(layouts.format)) - aspectFlags = VK_IMAGE_ASPECT_DEPTH_BIT; + { + aspectFlagsBarrier = aspectFlags = VK_IMAGE_ASPECT_DEPTH_BIT; + if(!IsDepthOnlyFormat(layouts.format)) + aspectFlagsBarrier |= VK_IMAGE_ASPECT_STENCIL_BIT; + } CreateTexImageView(aspectFlags, liveIm, iminfo); - VkImageView liveImView = (aspectFlags == VK_IMAGE_ASPECT_STENCIL_BIT ? iminfo.stencilView : iminfo.view); + VkImageView liveImView = iminfo.view; RDCASSERT(liveImView != VK_NULL_HANDLE); @@ -3522,7 +3529,7 @@ bool VulkanReplay::GetMinMax(ResourceId texid, uint32_t sliceFace, uint32_t mip, 0, 0, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_GENERAL, VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED, Unwrap(liveIm), - { aspectFlags, 0, 1, 0, 1 } + { aspectFlagsBarrier, 0, 1, 0, 1 } }; // ensure all previous writes have completed @@ -3639,8 +3646,13 @@ bool VulkanReplay::GetHistogram(ResourceId texid, uint32_t sliceFace, uint32_t m VkImage liveIm = m_pDriver->GetResourceManager()->GetCurrentHandle(texid); VkImageAspectFlags aspectFlags = VK_IMAGE_ASPECT_COLOR_BIT; + VkImageAspectFlags aspectFlagsBarrier = VK_IMAGE_ASPECT_COLOR_BIT; if(IsDepthStencilFormat(layouts.format)) - aspectFlags = VK_IMAGE_ASPECT_DEPTH_BIT; + { + aspectFlagsBarrier = aspectFlags = VK_IMAGE_ASPECT_DEPTH_BIT; + if(!IsDepthOnlyFormat(layouts.format)) + aspectFlagsBarrier |= VK_IMAGE_ASPECT_STENCIL_BIT; + } CreateTexImageView(aspectFlags, liveIm, iminfo); @@ -3721,7 +3733,7 @@ bool VulkanReplay::GetHistogram(ResourceId texid, uint32_t sliceFace, uint32_t m 0, 0, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_GENERAL, VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED, Unwrap(liveIm), - { aspectFlags, 0, 1, 0, 1 } + { aspectFlagsBarrier, 0, 1, 0, 1 } }; // ensure all previous writes have completed