假设我们有一个CommandPool,其中分配了两个CommandBuffers(CommandBuffer1
,CommandBuffer2
)。
CommandPool位于Thread 0
,CommandBuffer1
,CommandBuffer2
也位于Thread 0
。
是否可以将CommandBuffer1
和CommandBuffer1
转移到另一个线程来记录命令?限制只允许一个线程同时记录一个CommandBuffer?
规范说明
命令池是应用程序同步的,这意味着不能在多个线程中同时使用命令池。 包括通过记录命令在从池分配的任何命令缓冲区上使用,以及分配,释放和重置命令缓冲区或池本身的操作。
我不确定是否允许我同时在CommandBuffer1
和Thread 1
CommandBuffer2
上同时记录Thread 2
。
或者我是否必须在分配它们的同一个线程上记录所有CommandBuffers?
答案 0 :(得分:3)
有一个"隐式外部同步参数列表"在第2.5章。线程行为,其列表主要包括:
- 在vkCmd *中分配了commandBuffer的VkCommandPool
所以不可能在不同的线程上从同一个池中记录2个命令缓冲区。
虽然奇怪的是vkBeginCommandBuffer
和vkEndCommandBuffer
不在该列表中。
答案 1 :(得分:2)
谁强迫你只有一个游泳池呢? 每个线程有一个池。问题解决了。
是的,您不必在同一个线程上使用它们。您只需必须确保:
[...]命令池不能在多个线程中同时使用。
如果你(由于一些不明原因)想要在不同的线程上使用池,你必须在开始在第二个线程上使用它之前停止在原始线程上使用它(通过使用同步原语)。