From c22c2c56d06249835a474e370ea3218463721f42 Mon Sep 17 00:00:00 2001 From: Arseny Kapoulkine Date: Sun, 11 Nov 2018 23:24:29 -0800 Subject: [PATCH] Fix indirect buffer barriers We need two barriers (for draw command buffer and draw command count buffer) after the compute shader; we were also accidentally using the wrong buffer in the fillBarrier. --- src/niagara.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/niagara.cpp b/src/niagara.cpp index 63180cf..74089a5 100644 --- a/src/niagara.cpp +++ b/src/niagara.cpp @@ -672,7 +672,7 @@ int main(int argc, const char** argv) vkCmdFillBuffer(commandBuffer, dccb.buffer, 0, 4, 0); - VkBufferMemoryBarrier fillBarrier = bufferBarrier(dcb.buffer, VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT); + VkBufferMemoryBarrier fillBarrier = bufferBarrier(dccb.buffer, VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT); vkCmdPipelineBarrier(commandBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0, 0, 0, 1, &fillBarrier, 0, 0); vkCmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, drawcullPipeline); @@ -683,8 +683,13 @@ int main(int argc, const char** argv) vkCmdPushConstants(commandBuffer, drawcullProgram.layout, drawcullProgram.pushConstantStages, 0, sizeof(cullData), &cullData); vkCmdDispatch(commandBuffer, uint32_t((draws.size() + 31) / 32), 1, 1); - VkBufferMemoryBarrier cullBarrier = bufferBarrier(dcb.buffer, VK_ACCESS_SHADER_WRITE_BIT, VK_ACCESS_INDIRECT_COMMAND_READ_BIT); - vkCmdPipelineBarrier(commandBuffer, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT, 0, 0, 0, 1, &cullBarrier, 0, 0); + VkBufferMemoryBarrier cullBarriers[] = + { + bufferBarrier(dcb.buffer, VK_ACCESS_SHADER_WRITE_BIT, VK_ACCESS_INDIRECT_COMMAND_READ_BIT), + bufferBarrier(dccb.buffer, VK_ACCESS_SHADER_WRITE_BIT, VK_ACCESS_INDIRECT_COMMAND_READ_BIT), + }; + + vkCmdPipelineBarrier(commandBuffer, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT, 0, 0, 0, ARRAYSIZE(cullBarriers), cullBarriers, 0, 0); vkCmdWriteTimestamp(commandBuffer, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, queryPoolTimestamp, 3); }