通过同一队列进行多次提交的障碍或信号量?

Barriers or semaphores for multiple submissions over the same queue?

在这个例子中,我们将一些缓冲区复制到顶点缓冲区中,我们希望在两次提交中使用此缓冲区快速开始渲染,而无需等待一些围栏:

vkBeginCommandBuffer(tansferCommandBuffer)
  vkCmdCopyBuffer(tansferCommandBuffer, hostVisibleBuffer, vertexBuffer)
vkEndCommandBuffer(tansferCommandBuffer)

vkQueueSubmit(queue, tansferCommandBuffer)


vkBeginCommandBuffer(renderCommandBuffer)
  ...
  vkCmdBindVertexBuffers(vertexBuffer)
  vkCmdDraw()
  ...
vkEndCommandBuffer(renderCommandBuffer)

vkQueueSubmit(queue, renderCommandBuffer)

据我了解,提交 renderCommandBuffertansferCommandBuffer 可能尚未完成,并且 renderCommandBuffer 可能会被调度并读取 vertexBuffer 中的表单浮动数据.

我们可以在提交tansferCommandBuffer的时候附加一个信号量,完成后被单挑,然后将这个信号量转发给renderCommandBuffer等待执行。这里的问题是它阻止了不依赖于缓冲区的第二批命令。

或者我们可以在复制命令之后或绑定顶点命令之前插入一个屏障,这似乎要好得多,因为我们可以指定对缓冲区的访问是我们的主要关注点,并可能保留部分批处理被执行。

对于类似情况(单个队列,多个提交)使用信号量而不是障碍有什么好的理由吗?

每当您更改使用资源的方式来通知 driver/hardware 该更改时,障碍都是必要的。因此,在您的示例中,可能也需要屏障。

但至于信号量。当您提交命令缓冲区时,您指定信号量句柄和管道阶段,在这些阶段应该在相应的信号量上等待。您可以通过 VkSubmitInfo 结构的以下成员执行此操作:

  • pWaitSemaphores is a pointer to an array of semaphores upon which to wait before the command buffers for this batch begin execution. If semaphores to wait on are provided, they define a semaphore wait operation.
  • pWaitDstStageMask is a pointer to an array of pipeline stages at which each corresponding semaphore wait will occur.

所以当你提交一个命令缓冲区时,硬件可以执行到指定阶段的所有命令。