更新命令缓冲区时的 vulkan 命令缓冲区同步

vulkan command buffers synchronization for the case of updating the command buffer

假设我们有 3 个命令缓冲区 A、B 和 C。它们在创建时都启用 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT。依赖关系如下:

它们之间的同步是使用信号量完成的。大多数时候,我可以预先创建A、B和C,然后在渲染循环中将它们一个接一个地提交到渲染队列中。在某个时间点,我想修改命令缓冲区A。但是,问题是有几个A已经提交到渲染队列中。我想那个时候渲染队列可能看起来像

A B C A B

我无法修改命令缓冲区 A,因为它正在由 GPU 执行或排队。最幼稚的做法是在CPU这边调用vkQueueWaitIdle等待所有的CB都完成。然后我可以修改 A 并继续回到我的渲染序列。此方法的问题在于它将等待所有 CB 完成。在我看来,我只需要在队列中等待所有 A 完成,而不是等待所有 CB。有可能做到吗?有没有更好的方法来修改 A 而不调用 vkQueueWaitIdle?

不要修改命令缓冲区。创建一个新的并记录到其中。它是命令缓冲区对象 A 还是某个替代命令缓冲区对象 A' 真的无关紧要。重要的是您记录到其中的命令。

在任何情况下,使用命令缓冲区(或其中的某组缓冲区)了解操作何时完成的典型方法是在队列提交时使用栅栏。栅栏的粒度特别粗,但您可以从 CPU.

查询有关其状态的信息