【问题标题】:Storage buffer synchronisation between draw calls with vulkan使用 vulkan 绘制调用之间的存储缓冲区同步
【发布时间】:2020-10-17 00:35:32
【问题描述】:

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

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

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

【问题讨论】:

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

标签: vulkan


【解决方案1】:

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

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

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

现在,如果您有一组只需要临界区且不关心顺序的命令,但另一组本身只需要临界区但需要第一个之后出现,这是一个矛盾。第二组关心排序,所以他们应该使用原始排序,而不是无序。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-25
    • 2019-03-18
    • 1970-01-01
    • 2022-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多