使用 BufferMemory 屏障在绘制和计算命令之间进行同步

Synchronization between draw and compute commands with BufferMemory barriers

我遇到了另一个同步问题。

假设我有一个带有几何图形的缓冲区,我们称它为 geometry_buffer。我首先必须在计算过程中填充它,然后使用这个缓冲区进行光栅化,然后在另一个计算过程中使用它。我对所有这些都使用一个命令缓冲区。

所以,我的问题:

  1. 我看过带有流水线阶段的图表以及计算阶段实际上是最后一个阶段,但我有一些疑问。如果我完全按照此顺序将 draw/draw_indexed 然后 compute 推送到同一命令缓冲区中,是否仅在光栅化阶段完成后才计算调度 运行?
  2. 如何为此 geometry_buffer 正确设置 BufferMemory 障碍?

管道应该是 compute_1 -> draw -> compute_2。够不够设置

COMPUTE_SHADER/SHADER_WRITE -> VERTEX_INPUT/VERTEX_READ

关卡后compute_1再往回设置

VERTEX_INPUT/VERTEX_READ -> COMPUTE_SHADER/SHADER_WRITE

compute_2之后的障碍?或者我是否也应该在绘图命令和 compute_2 之间设置障碍,即使这些阶段是连续的并且差异仅在于访问位

VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT -> VK_ACCESS_SHADER_READ_BIT?

或者我应该将第一个屏障中的访问位更改为

VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT | VK_ACCESS_SHADER_READ_BIT?

会有什么不同吗?

读后写操作不需要内存屏障;他们只需要一个执行障碍。您需要确保在后续计算阶段执行之前完成所有顶点输入阶段读取。这可以通过纯 post-render pass 执行障碍来完成。

此外,障碍应该出现在消费调度操作之前,而不是之后它。

I've seen the diagrams with pipeline stages and how compute stage is practically the last, but I've got some doubts.

阶段执行的隐式排序仅适用于由不同命令执行的特定阶段集。例如,由图形渲染操作调用的管道是相对于彼此排序的。但是相对于使用不同管道的操作命令,它们不是排序的。

因此计算阶段相对于任何图形阶段都是无序的。