首页 > 解决方案 > 使用 vulkan 绘制调用之间的存储缓冲区同步

问题描述

我正在使用存储缓冲区来存储来自具有片段着色器互锁的片段着色器的每像素链表。在单个绘图调用中一切正常,但我无法在连续绘图调用之间同步存储缓冲区。

我的理解是,您可以在片段着色器阶段的渲染过程中执行管道屏障,但前提是它涉及绑定到帧缓冲区的图像。

vkCmdEndRenderPass然后我必须vkCmdPipelineBarriervkCmdBeginRenderPass每次绘制调用之间调用还是有更好的解决方案?

标签: vulkan

解决方案


这种情况下的同步预计将通过互锁操作本身来完成。如果您的联锁不尊重原始顺序,那么您不应该关心原始顺序,因此不需要同步。如果您的联锁确实关心原始排序,那么原始排序将由联锁强加,因此不需要其他同步。

图元顺序定义了由一次绘制调用生成的图元在来自后续绘制调用的所有图元之前排序。因此,如果您正在执行原始顺序互锁,则根据定义,一个渲染命令中的原始关键部分将在前一个渲染命令的关键部分之后排序。

所以没有必要设置障碍;你想要的是原始排序。

现在,如果您有一组只需要关键部分且不关心顺序的命令,但是后面的一组命令本身只需要关键部分但需要第一个之后出现,那是矛盾的。第二组确实关心排序,所以他们应该使用原始排序,而不是无序。

请注意,为了使以前的写入可见,您需要coherent限定符。订购只保证订购。


推荐阅读