在Vulkan中,命令缓冲区在被GPU执行时能否重置?

3

我有一个想法,不确定是否可行:

  1. 在程序开始时创建VkCommandPool并从中分配一个单独的VkCommandBuffer
  2. 在渲染循环中,记录命令到VkCommandBuffer(隐式重置它),引用当前VkSwapchain的适当VkImageViewVkFramebuffer
  3. 提交命令缓冲区

我不确定在刚刚提交执行的命令缓冲区上立即重置并重新记录它是否有效。这是定义良好的行为吗?它允许多帧同时进行,还是有缺陷的?

一方面,似乎应该是有效的,因为命令被提交后已经被复制到了GPU上,但另一方面,看到标志VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT,默认情况下似乎不能提交正在“挂起”状态的命令缓冲区。

我认为这个问题可以概括为多个命令缓冲区,以及它们是否应该每个都有与vkSwapchain中的vkImage数量相同的副本,或者一个副本就足够了。

1个回答

8
命令缓冲区存在 5种可能的状态初始记录可执行(可以提交)、待定(已提交等待执行)和无效(不能使用)。哪些操作是有效的取决于处于哪个状态。从哪些其他状态可以访问哪些状态在标准中已经很明确地说明了。
如果您已经提交了一个CB,那么它处于以下状态之一:
  • 待定,如果它还没有完成执行
  • 无效,如果它完成了执行但只能使用一次
  • 可执行,如果它完成了执行并且可以重新提交
处于待定状态的CB无法重置,但如果可执行或无效,则可以重置CB。
因此,如果您所说的“当它正在被GPU执行时”,指的是“处于待定状态”,那么不行。
请注意,没有办法检测CB的状态。这是您必须间接跟踪的内容。例如,如果您提交一批工作,则必须假定它处于挂起状态,除非您执行了与该批工作的执行同步的操作。这可以是测试围栏(如果返回设置,则CB不再挂起),测试时间线信号量或类似的操作。

谢谢。我对硬件了解很少。你能解释一下为什么提交后的CB不能重置吗?直觉上,如果我们说某个东西已经提交,人们会觉得可以放心创建新的,因为旧的已经提交给上游了。 - undefined
@qiuweikang: 你不能乱动它,因为你把它借给别人用一段时间了。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接