重新记录辅助命令缓冲区
Rerecording secondary command buffers
我试过使用secondary command buffer 和运行 成问题。调整我的 window 大小后,主命令缓冲区和辅助命令缓冲区都被重新记录。
如果次要命令缓冲区已更新并且其中包含的主要命令缓冲区尚未提交,则验证层会抛出
Calling vkBeginCommandBuffer() on active CB 0x0x166dbc0 before it has completed. You must check CB fence before this call.
错误。为了解决这个问题,我目前确保在更新辅助命令缓冲区之前,所有主要命令缓冲区至少提交一次。
有没有更简单的方法来避免这个问题,因为我用这个解决方案浪费了多达 7 帧的渲染(我的交换链中的帧缓冲区数量)?
当您尝试重新录制时,命令缓冲区不得仍在使用中。
您需要使用 VkFence
(或等价物:vkDeviceWaitIdle()
或 vkQueueWaitIdle()
)来确保它不是。
通常resize操作比较多,估计不会频繁操作,所以:
只需在对调整大小事件做出反应时使用 vkDeviceWaitIdle()
(然后重新创建所有需要它的实体)。
至于辅助命令缓冲区,规范中有这样违反直觉的陈述:
A secondary command buffer is considered to be pending execution from the time its execution is recorded into a primary buffer (via vkCmdExecuteCommands
) until the final time that primary buffer’s submission to a queue completes.
因此,一旦它被记录在主缓冲区中,直接读取它就是 "pending execution"。
(可能是规范制定者无意的解释...我将其作为 #414 问题提出。)
我试过使用secondary command buffer 和运行 成问题。调整我的 window 大小后,主命令缓冲区和辅助命令缓冲区都被重新记录。
如果次要命令缓冲区已更新并且其中包含的主要命令缓冲区尚未提交,则验证层会抛出
Calling vkBeginCommandBuffer() on active CB 0x0x166dbc0 before it has completed. You must check CB fence before this call.
错误。为了解决这个问题,我目前确保在更新辅助命令缓冲区之前,所有主要命令缓冲区至少提交一次。
有没有更简单的方法来避免这个问题,因为我用这个解决方案浪费了多达 7 帧的渲染(我的交换链中的帧缓冲区数量)?
当您尝试重新录制时,命令缓冲区不得仍在使用中。
您需要使用 VkFence
(或等价物:vkDeviceWaitIdle()
或 vkQueueWaitIdle()
)来确保它不是。
通常resize操作比较多,估计不会频繁操作,所以:
只需在对调整大小事件做出反应时使用 vkDeviceWaitIdle()
(然后重新创建所有需要它的实体)。
至于辅助命令缓冲区,规范中有这样违反直觉的陈述:
A secondary command buffer is considered to be pending execution from the time its execution is recorded into a primary buffer (via
vkCmdExecuteCommands
) until the final time that primary buffer’s submission to a queue completes.
因此,一旦它被记录在主缓冲区中,直接读取它就是 "pending execution"。
(可能是规范制定者无意的解释...我将其作为 #414 问题提出。)