我尝试使用辅助命令缓冲区并遇到问题。调整窗口大小后,将重新录制主要和辅助命令缓冲区 如果更新了辅助命令缓冲区并且主要命令缓冲区(包含的那些缓冲区)尚未提交,则验证层将抛出
Calling vkBeginCommandBuffer() on active CB 0x0x166dbc0 before it has completed. You must check CB fence before this call.
错误。为了解决这个问题,我目前确保在更新辅助命令缓冲区之前,所有主要命令缓冲区至少提交一次。
有没有更简单的方法来避免这个问题,因为我浪费了这个解决方案最多7帧(我的交换链中的帧缓冲区数量)的渲染?
答案 0 :(得分:2)
尝试重新录制时,命令缓冲区不能仍在使用。
您需要使用VkFence
(或等效的vkDeviceWaitIdle()
或vkQueueWaitIdle()
)来确保不是。{/ p>
调整大小时通常需要做很多工作,预计不会频繁操作,所以:
在对resize事件做出反应时使用vkDeviceWaitIdle()
(然后重新创建需要它的所有实体)。
对于辅助命令缓冲区,规范中有这种反直觉的声明:
辅助命令缓冲区从执行记录到主缓冲区(通过
vkCmdExecuteCommands
)开始被认为是待执行,直到主缓冲区提交到队列的最后时间完成。
因此,只要将其记录在主缓冲区中,它就会直接读到#34;等待执行"
(可能是规范制定者无意识的解释......我将其提升为#414问题。)