Set IMAGE_ASPECT_STENCIL correctly in barrier subresource ranges

This commit is contained in:
baldurk
2016-01-12 22:40:51 +01:00
parent 60c4542bf9
commit c81e407046
2 changed files with 26 additions and 12 deletions
+7 -5
View File
@@ -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,
+19 -7
View File
@@ -966,6 +966,7 @@ bool VulkanReplay::RenderTextureInternal(TextureDisplay cfg, VkRenderPassBeginIn
VkImage liveIm = m_pDriver->GetResourceManager()->GetCurrentHandle<VkImage>(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<VkImage>(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<VkImage>(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