命令缓冲区在Vulkan中的GPU上执行时可以重置吗?
我想到了以下场景,我不知道它是否有效:
VkCommandPool在程序的开头创建一个并VkCommandBuffer从中分配一个。- 在渲染循环,以记录命令
VkCommandBuffer(隐其复位)引用VkFramebuffer适合当前VkImageView从VkSwapchain。 - 提交命令缓冲区
我不确定是否可以重置命令缓冲区并在刚刚提交执行后立即在下一帧重新记录它。这是定义的行为吗?它是否允许多个帧同时运行,还是在某些方面存在缺陷?
一方面,这似乎应该是有效的,因为在提交后,命令被复制到 GPU,但另一方面,在看到标志后VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT,默认情况下,命令缓冲区似乎无法提交,而它们已经“待处理” ”。
我认为这个问题可以推广到多个命令缓冲区,并且每个命令缓冲区是否应该有尽可能多的副本vkImage,vkSwapchain或者单个副本就足够了。
回答
命令缓冲区存在5 种可能的状态:初始、记录、可执行(可以提交)、挂起(提交执行)和无效(不能使用)。哪些操作有效取决于哪个状态。标准中很好地指定了哪些状态可以从其他状态访问。
如果您提交了 CB,则它处于以下状态之一:
- 挂起,如果它还没有完成执行
- 无效,如果它完成了执行但只使用一次
- 可执行文件,如果它完成执行并且可以重新提交
处于挂起状态的 CB 无法重置,但如果 CB 可执行或无效,则可以重置。
因此,如果“当它被 GPU 执行时”,您的意思是“处于挂起状态”,那么不是。
请注意,无法检测 CB 的状态。这是你必须间接跟踪的东西。例如,如果您提交一批工作,则必须假定它处于待处理状态,除非您执行与该批工作的执行同步的操作。这可能是测试围栏(如果它返回设置,则 CB 不再挂起)测试时间线信号量或类似的东西。