重新记录辅助命令缓冲区

时间:2016-11-22 18:46:27

标签: vulkan

我尝试使用辅助命令缓冲区并遇到问题。调整窗口大小后,将重新录制主要和辅助命令缓冲区 如果更新了辅助命令缓冲区并且主要命令缓冲区(包含的那些缓冲区)尚未提交,则验证层将抛出

Calling vkBeginCommandBuffer() on active CB 0x0x166dbc0 before it has completed. You must check CB fence before this call.

错误。为了解决这个问题,我目前确保在更新辅助命令缓冲区之前,所有主要命令缓冲区至少提交一次。

有没有更简单的方法来避免这个问题,因为我浪费了这个解决方案最多7帧(我的交换链中的帧缓冲区数量)的渲染?

1 个答案:

答案 0 :(得分:2)

尝试重新录制时,命令缓冲区不能仍在使用。 您需要使用VkFence(或等效的vkDeviceWaitIdle()vkQueueWaitIdle())来确保不是。{/ p>

调整大小时通常需要做很多工作,预计不会频繁操作,所以:

在对resize事件做出反应时使用vkDeviceWaitIdle()(然后重新创建需要它的所有实体)。

对于辅助命令缓冲区,规范中有这种反直觉的声明:

  

辅助命令缓冲区从执行记录到主缓冲区(通过vkCmdExecuteCommands)开始被认为是待执行,直到主缓冲区提交到队列的最后时间完成。

因此,只要将其记录在主缓冲区中,它就会直接读到#34;等待执行"

(可能是规范制定者无意识的解释......我将其提升为#414问题。)