是否允许在从同一个池分配的多个线程上记录CommandBuffers?

时间:2016-10-23 19:49:07

标签: vulkan

假设我们有一个CommandPool,其中分配了两个CommandBuffers(CommandBuffer1CommandBuffer2)。

CommandPool位于Thread 0CommandBuffer1CommandBuffer2也位于Thread 0

是否可以将CommandBuffer1CommandBuffer1转移到另一个线程来记录命令?限制只允许一个线程同时记录一个CommandBuffer?

规范说明

  

命令池是应用程序同步的,这意味着不能在多个线程中同时使用命令池。 包括通过记录命令在从池分配的任何命令缓冲区上使用,以及分配,释放和重置命令缓冲区或池本身的操作。

我不确定是否允许我同时在CommandBuffer1Thread 1 CommandBuffer2上同时记录Thread 2

或者我是否必须在分配它们的同一个线程上记录所有CommandBuffers?

2 个答案:

答案 0 :(得分:3)

有一个"隐式外部同步参数列表"在第2.5章。线程行为,其列表主要包括:

  
      
  • 在vkCmd *中分配了commandBuffer的VkCommandPool
  •   

所以不可能在不同的线程上从同一个池中记录2个命令缓冲区。

虽然奇怪的是vkBeginCommandBuffervkEndCommandBuffer不在该列表中。

答案 1 :(得分:2)

谁强迫你只有一个游泳池呢? 每个线程有一个池。问题解决了。

是的,您不必在同一个线程上使用它们。您只需必须确保:

  

[...]命令池不能在多个线程中同时使用。

如果你(由于一些不明原因)想要在不同的线程上使用池,你必须在开始在第二个线程上使用它之前停止在原始线程上使用它(通过使用同步原语)。