假设我们有3个命令缓冲区A,B和C。所有缓冲区css
在创建时都启用。依赖关系如下:
它们之间的同步是通过信号量完成的。在大多数时间里,我可以预先创建A,B和C,然后将它们一个接一个地提交到渲染循环中的渲染队列。在某个时间点,我想修改命令缓冲区A。但是,问题是几个A已提交到渲染队列中。我认为那时渲染队列可能看起来像
A B C A B
我无法修改命令缓冲区A,因为它正在由GPU执行或排队。最幼稚的方法是在CPU端调用VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT
以等待所有CB完成。然后,我可以修改A并继续回到渲染序列。此方法的问题在于它将等待所有CB完成。我认为,我只需要等待队列中的所有操作完成,而不是等待所有CB。有可能做到吗?是否有更好的方法来修改A而无需调用vkQueueWaitIdle
?
答案 0 :(得分:2)
请勿修改命令缓冲区。创建一个新的并记录到其中。无论是命令缓冲区对象A
还是其他替代命令缓冲区对象A'
都没关系。重要的是您记录在其中的命令。
在任何情况下,知道何时使用命令缓冲区(或其某些集合)完成操作的典型方法是在提交队列时使用围栅。栅栏的纹理特别粗糙,但是您可以从CPU查询有关栅栏状态的信息。