From e62bfc5951ce1a78a438f7d3e18ccc64c3fbab5a Mon Sep 17 00:00:00 2001 From: baldurk Date: Sat, 30 Jan 2016 16:19:49 +0100 Subject: [PATCH] Fix to a buffer memory barrier in GetMinMax --- renderdoc/driver/vulkan/vk_replay.cpp | 35 ++++++++++++++------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/renderdoc/driver/vulkan/vk_replay.cpp b/renderdoc/driver/vulkan/vk_replay.cpp index 29758b54f..aaaf5ded5 100644 --- a/renderdoc/driver/vulkan/vk_replay.cpp +++ b/renderdoc/driver/vulkan/vk_replay.cpp @@ -3560,14 +3560,6 @@ bool VulkanReplay::GetMinMax(ResourceId texid, uint32_t sliceFace, uint32_t mip, vt->CmdDispatch(Unwrap(cmd), blocksX, blocksY, 1); - VkBufferMemoryBarrier tilebarrier = { - VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER, NULL, - VK_ACCESS_SHADER_WRITE_BIT, VK_ACCESS_SHADER_READ_BIT, - VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED, - Unwrap(GetDebugManager()->m_MinMaxTileResult.buf), - 0, GetDebugManager()->m_MinMaxTileResult.totalsize, - }; - // image layout back to normal for (size_t si = 0; si < layouts.subresourceStates.size(); si++) { @@ -3577,6 +3569,14 @@ bool VulkanReplay::GetMinMax(ResourceId texid, uint32_t sliceFace, uint32_t mip, DoPipelineBarrier(cmd, 1, &srcimBarrier); } + VkBufferMemoryBarrier tilebarrier = { + VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER, NULL, + VK_ACCESS_SHADER_WRITE_BIT, VK_ACCESS_SHADER_READ_BIT, + VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED, + Unwrap(GetDebugManager()->m_MinMaxTileResult.buf), + 0, GetDebugManager()->m_MinMaxTileResult.totalsize, + }; + // ensure shader writes complete before coalescing the tiles DoPipelineBarrier(cmd, 1, &tilebarrier); @@ -3587,7 +3587,8 @@ bool VulkanReplay::GetMinMax(ResourceId texid, uint32_t sliceFace, uint32_t mip, vt->CmdDispatch(Unwrap(cmd), 1, 1, 1); // ensure shader writes complete before copying back to readback buffer - tilebarrier.srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT; + tilebarrier.srcAccessMask = VK_ACCESS_SHADER_WRITE_BIT; + tilebarrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT; tilebarrier.buffer = Unwrap(GetDebugManager()->m_MinMaxResult.buf); tilebarrier.size = GetDebugManager()->m_MinMaxResult.totalsize; @@ -3760,14 +3761,6 @@ bool VulkanReplay::GetHistogram(ResourceId texid, uint32_t sliceFace, uint32_t m vt->CmdDispatch(Unwrap(cmd), blocksX, blocksY, 1); - VkBufferMemoryBarrier tilebarrier = { - VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER, NULL, - VK_ACCESS_SHADER_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT, - VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED, - Unwrap(GetDebugManager()->m_HistogramBuf.buf), - 0, GetDebugManager()->m_HistogramBuf.totalsize, - }; - // image layout back to normal for (size_t si = 0; si < layouts.subresourceStates.size(); si++) { @@ -3777,6 +3770,14 @@ bool VulkanReplay::GetHistogram(ResourceId texid, uint32_t sliceFace, uint32_t m DoPipelineBarrier(cmd, 1, &srcimBarrier); } + VkBufferMemoryBarrier tilebarrier = { + VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER, NULL, + VK_ACCESS_SHADER_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT, + VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED, + Unwrap(GetDebugManager()->m_HistogramBuf.buf), + 0, GetDebugManager()->m_HistogramBuf.totalsize, + }; + // ensure shader writes complete before copying to readback buf DoPipelineBarrier(cmd, 1, &tilebarrier);