与 vulkan 的绘制调用之间的存储缓冲区同步
Storage buffer synchronisation between draw calls with vulkan
我正在使用一个存储缓冲区来存储来自带有片段着色器互锁的片段着色器的每像素链表。在单个绘制调用中一切正常,但我在连续绘制调用之间同步存储缓冲区时遇到问题。
我的理解是,您可以在片段着色器阶段的渲染过程中执行管道屏障,但前提是它涉及绑定到帧缓冲区的图像。
我是否必须在每次绘制调用之间调用 vkCmdEndRenderPass
然后 vkCmdPipelineBarrier
然后 vkCmdBeginRenderPass
还是有更好的解决方案?
本例中的同步预计将通过互锁操作本身完成。如果您的互锁不遵守原始顺序,那么您不应该关心原始顺序,因此不需要同步。如果您的互锁确实关心原始排序,那么原始排序将由互锁强加,因此不需要其他同步。
图元顺序定义了由一次绘制调用生成的图元在来自后续绘制调用的所有图元之前排序。因此,如果您正在进行图元顺序互锁,那么根据定义,一个渲染命令中图元的关键部分将排在前一个命令的关键部分之后。
所以不需要障碍;你想要的是原始排序。
现在,如果您有一组命令只需要关键部分而不关心顺序,但后面的一组本身只需要关键部分但需要在之后[=24] =] 第一个,就是矛盾。第二组关心排序,所以他们应该使用原始排序,而不是无序。
请注意,为了使以前的写入可见,您需要 coherent
限定符。订购只保证订购。
我正在使用一个存储缓冲区来存储来自带有片段着色器互锁的片段着色器的每像素链表。在单个绘制调用中一切正常,但我在连续绘制调用之间同步存储缓冲区时遇到问题。
我的理解是,您可以在片段着色器阶段的渲染过程中执行管道屏障,但前提是它涉及绑定到帧缓冲区的图像。
我是否必须在每次绘制调用之间调用 vkCmdEndRenderPass
然后 vkCmdPipelineBarrier
然后 vkCmdBeginRenderPass
还是有更好的解决方案?
本例中的同步预计将通过互锁操作本身完成。如果您的互锁不遵守原始顺序,那么您不应该关心原始顺序,因此不需要同步。如果您的互锁确实关心原始排序,那么原始排序将由互锁强加,因此不需要其他同步。
图元顺序定义了由一次绘制调用生成的图元在来自后续绘制调用的所有图元之前排序。因此,如果您正在进行图元顺序互锁,那么根据定义,一个渲染命令中图元的关键部分将排在前一个命令的关键部分之后。
所以不需要障碍;你想要的是原始排序。
现在,如果您有一组命令只需要关键部分而不关心顺序,但后面的一组本身只需要关键部分但需要在之后[=24] =] 第一个,就是矛盾。第二组关心排序,所以他们应该使用原始排序,而不是无序。
请注意,为了使以前的写入可见,您需要 coherent
限定符。订购只保证订购。