From 378d3e9a47148cbc22bf871e69795b66c8f56416 Mon Sep 17 00:00:00 2001 From: baldurk Date: Tue, 12 Jan 2016 22:51:09 +0100 Subject: [PATCH] When transitioning image subresources, set the range on each iteration --- renderdoc/driver/vulkan/vk_initstate.cpp | 8 ++++++++ renderdoc/driver/vulkan/vk_replay.cpp | 10 ++++++++++ 2 files changed, 18 insertions(+) diff --git a/renderdoc/driver/vulkan/vk_initstate.cpp b/renderdoc/driver/vulkan/vk_initstate.cpp index 3e1777b89..31f5ae473 100644 --- a/renderdoc/driver/vulkan/vk_initstate.cpp +++ b/renderdoc/driver/vulkan/vk_initstate.cpp @@ -1046,6 +1046,7 @@ bool WrappedVulkan::Prepare_InitialState(WrappedVkRes *res) for (size_t si = 0; si < layout->subresourceStates.size(); si++) { + srcimBarrier.subresourceRange = layout->subresourceStates[si].subresourceRange; srcimBarrier.oldLayout = layout->subresourceStates[si].newLayout; ObjDisp(cmd)->CmdPipelineBarrier(Unwrap(cmd), VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, false, 1, &barrier); } @@ -1094,6 +1095,7 @@ bool WrappedVulkan::Prepare_InitialState(WrappedVkRes *res) for (size_t si = 0; si < layout->subresourceStates.size(); si++) { + srcimBarrier.subresourceRange = layout->subresourceStates[si].subresourceRange; srcimBarrier.newLayout = layout->subresourceStates[si].newLayout; ObjDisp(cmd)->CmdPipelineBarrier(Unwrap(cmd), VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, false, 1, &barrier); } @@ -1830,6 +1832,7 @@ void WrappedVulkan::Apply_InitialState(WrappedVkRes *live, VulkanResourceManager for (size_t si = 0; si < m_ImageLayouts[id].subresourceStates.size(); si++) { + barrier.subresourceRange = m_ImageLayouts[id].subresourceStates[si].subresourceRange; barrier.oldLayout = m_ImageLayouts[id].subresourceStates[si].newLayout; ObjDisp(cmd)->CmdPipelineBarrier(Unwrap(cmd), VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, false, 1, &barrierptr); } @@ -1847,6 +1850,7 @@ void WrappedVulkan::Apply_InitialState(WrappedVkRes *live, VulkanResourceManager for (size_t si = 0; si < m_ImageLayouts[id].subresourceStates.size(); si++) { + barrier.subresourceRange = m_ImageLayouts[id].subresourceStates[si].subresourceRange; barrier.newLayout = m_ImageLayouts[id].subresourceStates[si].newLayout; barrier.dstAccessMask |= MakeAccessMask(barrier.newLayout); ObjDisp(cmd)->CmdPipelineBarrier(Unwrap(cmd), VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, false, 1, &barrierptr); @@ -1880,6 +1884,7 @@ void WrappedVulkan::Apply_InitialState(WrappedVkRes *live, VulkanResourceManager for (size_t si = 0; si < m_ImageLayouts[id].subresourceStates.size(); si++) { + barrier.subresourceRange = m_ImageLayouts[id].subresourceStates[si].subresourceRange; barrier.oldLayout = m_ImageLayouts[id].subresourceStates[si].newLayout; ObjDisp(cmd)->CmdPipelineBarrier(Unwrap(cmd), VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, false, 1, &barrierptr); } @@ -1897,6 +1902,7 @@ void WrappedVulkan::Apply_InitialState(WrappedVkRes *live, VulkanResourceManager for (size_t si = 0; si < m_ImageLayouts[id].subresourceStates.size(); si++) { + barrier.subresourceRange = m_ImageLayouts[id].subresourceStates[si].subresourceRange; barrier.newLayout = m_ImageLayouts[id].subresourceStates[si].newLayout; ObjDisp(cmd)->CmdPipelineBarrier(Unwrap(cmd), VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, false, 1, &barrierptr); } @@ -1957,6 +1963,7 @@ void WrappedVulkan::Apply_InitialState(WrappedVkRes *live, VulkanResourceManager for (size_t si = 0; si < m_ImageLayouts[id].subresourceStates.size(); si++) { + dstimBarrier.subresourceRange = m_ImageLayouts[id].subresourceStates[si].subresourceRange; dstimBarrier.oldLayout = m_ImageLayouts[id].subresourceStates[si].newLayout; dstimBarrier.srcAccessMask = VK_ACCESS_ALL_WRITE_BITS | MakeAccessMask(dstimBarrier.oldLayout); ObjDisp(cmd)->CmdPipelineBarrier(Unwrap(cmd), VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, false, 1, &barrier); @@ -1976,6 +1983,7 @@ void WrappedVulkan::Apply_InitialState(WrappedVkRes *live, VulkanResourceManager for (size_t si = 0; si < m_ImageLayouts[id].subresourceStates.size(); si++) { + dstimBarrier.subresourceRange = m_ImageLayouts[id].subresourceStates[si].subresourceRange; dstimBarrier.newLayout = m_ImageLayouts[id].subresourceStates[si].newLayout; dstimBarrier.dstAccessMask |= MakeAccessMask(dstimBarrier.newLayout); ObjDisp(cmd)->CmdPipelineBarrier(Unwrap(cmd), VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, false, 1, &barrier); diff --git a/renderdoc/driver/vulkan/vk_replay.cpp b/renderdoc/driver/vulkan/vk_replay.cpp index 9e4c4e1d8..2cff42fa3 100644 --- a/renderdoc/driver/vulkan/vk_replay.cpp +++ b/renderdoc/driver/vulkan/vk_replay.cpp @@ -1165,6 +1165,7 @@ bool VulkanReplay::RenderTextureInternal(TextureDisplay cfg, VkRenderPassBeginIn for (size_t si = 0; si < layouts.subresourceStates.size(); si++) { + srcimBarrier.subresourceRange = layouts.subresourceStates[si].subresourceRange; srcimBarrier.oldLayout = layouts.subresourceStates[si].newLayout; srcimBarrier.srcAccessMask = VK_ACCESS_ALL_WRITE_BITS | MakeAccessMask(srcimBarrier.oldLayout); vt->CmdPipelineBarrier(Unwrap(cmd), VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, false, 1, &barrier); @@ -1198,6 +1199,7 @@ bool VulkanReplay::RenderTextureInternal(TextureDisplay cfg, VkRenderPassBeginIn for (size_t si = 0; si < layouts.subresourceStates.size(); si++) { + srcimBarrier.subresourceRange = layouts.subresourceStates[si].subresourceRange; srcimBarrier.newLayout = layouts.subresourceStates[si].newLayout; srcimBarrier.dstAccessMask = MakeAccessMask(srcimBarrier.newLayout); vt->CmdPipelineBarrier(Unwrap(cmd), VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, false, 1, &barrier); @@ -3545,6 +3547,7 @@ bool VulkanReplay::GetMinMax(ResourceId texid, uint32_t sliceFace, uint32_t mip, for (size_t si = 0; si < layouts.subresourceStates.size(); si++) { + srcimBarrier.subresourceRange = layouts.subresourceStates[si].subresourceRange; srcimBarrier.oldLayout = layouts.subresourceStates[si].newLayout; vt->CmdPipelineBarrier(Unwrap(cmd), VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, false, 1, &barrier); } @@ -3574,6 +3577,7 @@ bool VulkanReplay::GetMinMax(ResourceId texid, uint32_t sliceFace, uint32_t mip, // image layout back to normal for (size_t si = 0; si < layouts.subresourceStates.size(); si++) { + srcimBarrier.subresourceRange = layouts.subresourceStates[si].subresourceRange; srcimBarrier.newLayout = layouts.subresourceStates[si].newLayout; srcimBarrier.dstAccessMask = MakeAccessMask(srcimBarrier.newLayout); vt->CmdPipelineBarrier(Unwrap(cmd), VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, false, 1, &barrier); @@ -3749,6 +3753,7 @@ bool VulkanReplay::GetHistogram(ResourceId texid, uint32_t sliceFace, uint32_t m for (size_t si = 0; si < layouts.subresourceStates.size(); si++) { + srcimBarrier.subresourceRange = layouts.subresourceStates[si].subresourceRange; srcimBarrier.oldLayout = layouts.subresourceStates[si].newLayout; vt->CmdPipelineBarrier(Unwrap(cmd), VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, false, 1, &barrier); } @@ -3780,6 +3785,7 @@ bool VulkanReplay::GetHistogram(ResourceId texid, uint32_t sliceFace, uint32_t m // image layout back to normal for (size_t si = 0; si < layouts.subresourceStates.size(); si++) { + srcimBarrier.subresourceRange = layouts.subresourceStates[si].subresourceRange; srcimBarrier.newLayout = layouts.subresourceStates[si].newLayout; srcimBarrier.dstAccessMask = MakeAccessMask(srcimBarrier.newLayout); vt->CmdPipelineBarrier(Unwrap(cmd), VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, false, 1, &barrier); @@ -4176,6 +4182,7 @@ byte *VulkanReplay::GetTextureData(ResourceId tex, uint32_t arrayIdx, uint32_t m for (size_t si = 0; si < layouts.subresourceStates.size(); si++) { + srcimBarrier.subresourceRange = layouts.subresourceStates[si].subresourceRange; srcimBarrier.oldLayout = layouts.subresourceStates[si].newLayout; vt->CmdPipelineBarrier(Unwrap(cmd), VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, false, 1, &barrier); } @@ -4198,6 +4205,7 @@ byte *VulkanReplay::GetTextureData(ResourceId tex, uint32_t arrayIdx, uint32_t m // image layout back to normal for (size_t si = 0; si < layouts.subresourceStates.size(); si++) { + srcimBarrier.subresourceRange = layouts.subresourceStates[si].subresourceRange; srcimBarrier.newLayout = layouts.subresourceStates[si].newLayout; vt->CmdPipelineBarrier(Unwrap(cmd), VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, false, 1, &barrier); } @@ -4246,6 +4254,7 @@ byte *VulkanReplay::GetTextureData(ResourceId tex, uint32_t arrayIdx, uint32_t m for (size_t si = 0; si < layouts.subresourceStates.size(); si++) { + srcimBarrier.subresourceRange = layouts.subresourceStates[si].subresourceRange; srcimBarrier.oldLayout = layouts.subresourceStates[si].newLayout; vt->CmdPipelineBarrier(Unwrap(cmd), VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, false, 1, &barrier); } @@ -4297,6 +4306,7 @@ byte *VulkanReplay::GetTextureData(ResourceId tex, uint32_t arrayIdx, uint32_t m // image layout back to normal for (size_t si = 0; si < layouts.subresourceStates.size(); si++) { + srcimBarrier.subresourceRange = layouts.subresourceStates[si].subresourceRange; srcimBarrier.newLayout = layouts.subresourceStates[si].newLayout; vt->CmdPipelineBarrier(Unwrap(cmd), VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, false, 1, &barrier); }