使用vulkan在draw调用之间同步存储缓冲区

使用vulkan在draw调用之间同步存储缓冲区,vulkan,Vulkan,我正在使用一个存储缓冲区来存储来自具有片段着色器互锁的片段着色器的每像素链接列表。在一个draw调用中一切都正常,但在连续的draw调用之间同步存储缓冲区时遇到问题 我的理解是,可以在片段着色器阶段的渲染过程中执行管道屏障,但仅当它涉及绑定到帧缓冲区的图像时 我是否必须在每次绘图调用之间调用vkCmdEndRenderPass然后调用vkCmdPipelineBarrier然后调用vkCmdBeginRenderPass,或者是否有更好的解决方案?在这种情况下,同步应该通过联锁操作本身完成。如果

我正在使用一个存储缓冲区来存储来自具有片段着色器互锁的片段着色器的每像素链接列表。在一个draw调用中一切都正常,但在连续的draw调用之间同步存储缓冲区时遇到问题

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


我是否必须在每次绘图调用之间调用
vkCmdEndRenderPass
然后调用
vkCmdPipelineBarrier
然后调用
vkCmdBeginRenderPass
,或者是否有更好的解决方案?

在这种情况下,同步应该通过联锁操作本身完成。如果联锁不尊重原语顺序,那么就不应该关心原语顺序,因此不需要同步。如果互锁确实关心基元排序,那么基元排序将由互锁强制执行,因此不需要其他同步

基元顺序定义了一次绘图调用生成的基元顺序优先于后续绘图调用生成的所有基元顺序。所以,如果您正在执行基本体顺序联锁,那么根据定义,一个渲染命令中基本体的关键部分将在前一个渲染命令的关键部分之后排序

所以没有必要设置障碍;您需要的是原始排序

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


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

在这种情况下,同步应通过联锁操作本身完成。如果联锁不尊重原语顺序,那么就不应该关心原语顺序,因此不需要同步。如果互锁确实关心基元排序,那么基元排序将由互锁强制执行,因此不需要其他同步

基元顺序定义了一次绘图调用生成的基元顺序优先于后续绘图调用生成的所有基元顺序。所以,如果您正在执行基本体顺序联锁,那么根据定义,一个渲染命令中基本体的关键部分将在前一个渲染命令的关键部分之后排序

所以没有必要设置障碍;您需要的是原始排序

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


请注意,为了使以前的写入可见,您需要
一致的
限定符。排序只能保证排序。

在执行此同步时,您是否试图确保在发生任何来自后续绘图调用的互锁FS调用之前,已执行来自先前绘图调用的所有命令?是的,这就是想法。我猜,我也在向颜色附件写入内容,这一事实已经确保了在连续两次绘制调用中向同一像素写入颜色时的同步,但我不知道这是否意味着片段着色器在开始执行之前等待颜色写入完成,或者是否允许片段着色器运行,然后阻塞,直到上一次颜色写入完成。如果是后者,那么我想我仍然需要确保在启动第二个draw调用之前完成所有工作。当您执行此同步时,您是否试图确保之前draw调用中的所有命令在以后draw调用中的任何互锁FS调用发生之前都已执行?是的,这就是想法。我猜,我也在向颜色附件写入内容,这一事实已经确保了在连续两次绘制调用中向同一像素写入颜色时的同步,但我不知道这是否意味着片段着色器在开始执行之前等待颜色写入完成,或者是否允许片段着色器运行,然后阻塞,直到上一次颜色写入完成。如果是后者,那么我想我仍然需要确保在开始第二次抽签之前完成所有工作