diff --git a/renderdoc/driver/vulkan/vk_initstate.cpp b/renderdoc/driver/vulkan/vk_initstate.cpp index dba9871e7..47d626ad7 100644 --- a/renderdoc/driver/vulkan/vk_initstate.cpp +++ b/renderdoc/driver/vulkan/vk_initstate.cpp @@ -1074,7 +1074,9 @@ bool WrappedVulkan::Prepare_InitialState(WrappedVkRes *res) RDCASSERTEQUAL(vkr, VK_SUCCESS); VkImageAspectFlags aspectFlags = VK_IMAGE_ASPECT_COLOR_BIT; - if(IsDepthStencilFormat(layout->format)) + if(IsStencilOnlyFormat(layout->format)) + aspectFlags = VK_IMAGE_ASPECT_STENCIL_BIT; + else if(IsDepthStencilFormat(layout->format)) aspectFlags = VK_IMAGE_ASPECT_DEPTH_BIT; VkImageMemoryBarrier srcimBarrier = { @@ -1089,6 +1091,9 @@ bool WrappedVulkan::Prepare_InitialState(WrappedVkRes *res) im->real.As(), {aspectFlags, 0, (uint32_t)layout->levelCount, 0, (uint32_t)layout->layerCount}}; + if(aspectFlags == VK_IMAGE_ASPECT_DEPTH_BIT && !IsDepthOnlyFormat(layout->format)) + srcimBarrier.subresourceRange.aspectMask |= VK_IMAGE_ASPECT_STENCIL_BIT; + // update the real image layout into transfer-source srcimBarrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL; @@ -1619,7 +1624,9 @@ bool WrappedVulkan::Serialise_InitialState(ResourceId resid, WrappedVkRes *) VkImageAspectFlags aspectFlags = VK_IMAGE_ASPECT_COLOR_BIT; VkFormat fmt = m_CreationInfo.m_Image[liveim->id].format; - if(IsDepthStencilFormat(fmt)) + if(IsStencilOnlyFormat(fmt)) + aspectFlags = VK_IMAGE_ASPECT_STENCIL_BIT; + else if(IsDepthStencilFormat(fmt)) aspectFlags = VK_IMAGE_ASPECT_DEPTH_BIT; VkImageMemoryBarrier srcimBarrier = { @@ -2069,7 +2076,9 @@ void WrappedVulkan::Apply_InitialState(WrappedVkRes *live, VkImageAspectFlags aspectFlags = VK_IMAGE_ASPECT_COLOR_BIT; VkFormat fmt = m_CreationInfo.m_Image[id].format; - if(IsDepthStencilFormat(fmt)) + if(IsStencilOnlyFormat(fmt)) + aspectFlags = VK_IMAGE_ASPECT_STENCIL_BIT; + else if(IsDepthStencilFormat(fmt)) aspectFlags = VK_IMAGE_ASPECT_DEPTH_BIT; VkImageMemoryBarrier dstimBarrier = { @@ -2084,6 +2093,9 @@ void WrappedVulkan::Apply_InitialState(WrappedVkRes *live, ToHandle(live), {aspectFlags, 0, 1, 0, (uint32_t)m_CreationInfo.m_Image[id].arrayLayers}}; + if(aspectFlags == VK_IMAGE_ASPECT_DEPTH_BIT && !IsDepthOnlyFormat(fmt)) + dstimBarrier.subresourceRange.aspectMask |= VK_IMAGE_ASPECT_STENCIL_BIT; + // loop over every mip for(int m = 0; m < m_CreationInfo.m_Image[id].mipLevels; m++) { diff --git a/renderdoc/driver/vulkan/vk_resources.cpp b/renderdoc/driver/vulkan/vk_resources.cpp index 282716670..2a0540e8d 100644 --- a/renderdoc/driver/vulkan/vk_resources.cpp +++ b/renderdoc/driver/vulkan/vk_resources.cpp @@ -235,6 +235,17 @@ bool IsDepthOnlyFormat(VkFormat f) return false; } +bool IsStencilOnlyFormat(VkFormat f) +{ + switch(f) + { + case VK_FORMAT_S8_UINT: return true; + default: break; + } + + return false; +} + bool IsSRGBFormat(VkFormat f) { switch(f) diff --git a/renderdoc/driver/vulkan/vk_resources.h b/renderdoc/driver/vulkan/vk_resources.h index 2dd9bb6d6..dff464b21 100644 --- a/renderdoc/driver/vulkan/vk_resources.h +++ b/renderdoc/driver/vulkan/vk_resources.h @@ -1064,6 +1064,7 @@ bool IsBlockFormat(VkFormat f); bool IsDepthStencilFormat(VkFormat f); bool IsDepthOnlyFormat(VkFormat f); bool IsStencilFormat(VkFormat f); +bool IsStencilOnlyFormat(VkFormat f); bool IsSRGBFormat(VkFormat f); bool IsUIntFormat(VkFormat f); bool IsSIntFormat(VkFormat f);