From 4a1e77a3d0e350cc9013ac62853665727ef52f58 Mon Sep 17 00:00:00 2001 From: Pawel Lapinski Date: Fri, 13 Apr 2018 11:40:59 +0200 Subject: [PATCH] Fixed problem with synchronization of uniform data updates. --- examples/raytracing/raytracing.cpp | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/examples/raytracing/raytracing.cpp b/examples/raytracing/raytracing.cpp index edfaa384..394d404a 100644 --- a/examples/raytracing/raytracing.cpp +++ b/examples/raytracing/raytracing.cpp @@ -283,6 +283,22 @@ public: VK_CHECK_RESULT(vkBeginCommandBuffer(compute.commandBuffer, &cmdBufInfo)); + VkBufferMemoryBarrier bufferMemoryBarrier = {}; + bufferMemoryBarrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER; + bufferMemoryBarrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT; + bufferMemoryBarrier.dstAccessMask = VK_ACCESS_UNIFORM_READ_BIT; + bufferMemoryBarrier.buffer = compute.uniformBuffer.buffer; + bufferMemoryBarrier.offset = 0; + bufferMemoryBarrier.size = VK_WHOLE_SIZE; + vkCmdPipelineBarrier( + compute.commandBuffer, + VK_PIPELINE_STAGE_HOST_BIT, + VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, + VK_FLAGS_NONE, + 0, nullptr, + 1, &bufferMemoryBarrier, + 0, nullptr ); + vkCmdBindPipeline(compute.commandBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, compute.pipeline); vkCmdBindDescriptorSets(compute.commandBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, compute.pipelineLayout, 0, 1, &compute.descriptorSet, 0, 0); @@ -685,6 +701,12 @@ public: void draw() { + VkSubmitInfo computeSubmitInfo = vks::initializers::submitInfo(); + computeSubmitInfo.commandBufferCount = 1; + computeSubmitInfo.pCommandBuffers = &compute.commandBuffer; + + VK_CHECK_RESULT( vkQueueSubmit( compute.queue, 1, &computeSubmitInfo, compute.fence ) ); + VulkanExampleBase::prepareFrame(); // Command buffer to be sumitted to the queue @@ -698,12 +720,6 @@ public: // Use a fence to ensure that compute command buffer has finished executing before using it again vkWaitForFences(device, 1, &compute.fence, VK_TRUE, UINT64_MAX); vkResetFences(device, 1, &compute.fence); - - VkSubmitInfo computeSubmitInfo = vks::initializers::submitInfo(); - computeSubmitInfo.commandBufferCount = 1; - computeSubmitInfo.pCommandBuffers = &compute.commandBuffer; - - VK_CHECK_RESULT(vkQueueSubmit(compute.queue, 1, &computeSubmitInfo, compute.fence)); } void prepare()