是否允许在从同一池分配的多个线程上记录 CommandBuffers?
Is it allowed to record CommandBuffers on multiple threads which were allocated from the same pool?
假设我们有一个 CommandPool,其中分配了两个 CommandBuffer (CommandBuffer1
,CommandBuffer2
)。
CommandPool 存在于 Thread 0
,CommandBuffer1
和 CommandBuffer2
也存在于 Thread 0
。
是否可以将CommandBuffer1
和CommandBuffer1
转移到不同的线程来记录命令?限制一个线程同时记录一个CommandBuffer?
规范说明
Command pools are application-synchronized, meaning that a command pool must not be used concurrently in multiple threads. That includes use via recording commands on any command buffers allocated from the pool, as well as operations that allocate, free, and reset command buffers or the pool itself.
我不太确定我是否可以同时在 Thread 1
上录制 CommandBuffer1
和在 Thread 2
上录制 CommandBuffer2
。
或者我是否必须将所有 CommandBuffer 记录在分配它们的同一个线程上?
第2.5章有"Implicit Externally Synchronized Parameters"的列表。具有主要由以下内容组成的列表的线程行为:
- The VkCommandPool that commandBuffer was allocated from, in vkCmd*
所以不,不可能在不同线程上记录来自同一个池的 2 个命令缓冲区。
尽管很奇怪 vkBeginCommandBuffer
和 vkEndCommandBuffer
不在该列表中。
谁强迫你只有一个游泳池?
每个线程有一个池。问题已解决。
是的,您不必在同一线程上使用它们。您只需必须确保:
[...]command pool must not be used concurrently in multiple threads.
如果您(出于某些不明确的原因)想要在不同线程上使用池,则必须在开始在第二个线程上使用它之前停止在原始线程上使用它(通过使用同步原语)。
假设我们有一个 CommandPool,其中分配了两个 CommandBuffer (CommandBuffer1
,CommandBuffer2
)。
CommandPool 存在于 Thread 0
,CommandBuffer1
和 CommandBuffer2
也存在于 Thread 0
。
是否可以将CommandBuffer1
和CommandBuffer1
转移到不同的线程来记录命令?限制一个线程同时记录一个CommandBuffer?
规范说明
Command pools are application-synchronized, meaning that a command pool must not be used concurrently in multiple threads. That includes use via recording commands on any command buffers allocated from the pool, as well as operations that allocate, free, and reset command buffers or the pool itself.
我不太确定我是否可以同时在 Thread 1
上录制 CommandBuffer1
和在 Thread 2
上录制 CommandBuffer2
。
或者我是否必须将所有 CommandBuffer 记录在分配它们的同一个线程上?
第2.5章有"Implicit Externally Synchronized Parameters"的列表。具有主要由以下内容组成的列表的线程行为:
- The VkCommandPool that commandBuffer was allocated from, in vkCmd*
所以不,不可能在不同线程上记录来自同一个池的 2 个命令缓冲区。
尽管很奇怪 vkBeginCommandBuffer
和 vkEndCommandBuffer
不在该列表中。
谁强迫你只有一个游泳池?
每个线程有一个池。问题已解决。
是的,您不必在同一线程上使用它们。您只需必须确保:
[...]command pool must not be used concurrently in multiple threads.
如果您(出于某些不明确的原因)想要在不同线程上使用池,则必须在开始在第二个线程上使用它之前停止在原始线程上使用它(通过使用同步原语)。