可以从主线程分配`vkCommandPool`并将其移动到其他线程吗?

时间:2018-03-14 10:49:01

标签: multithreading vulkan

是否有可能从主线程中分配vkCommandPool然后将它们移动到一个新的线程中,在那里它是专门使用的?

伪代码:

// Pool for creating secondary buffers
threaded_command_pool = new CommandPool();

// Thread for filling secondary buffers
// threaded_command_poolzd is used only here
thread_handle = new Thread(move(command_pool))

thread_handle.join()

// Pool for merging secondary buffers
command_pool = new CommandPool() 
primary_command_buffer = command_pool.create_buffer()

// fill primary_command_buffer with secondary buffers from thread

在我发现的所有示例和演示文稿中,command_pool在线程中创建 ,而不是在主线程中创建,但我在specs中找不到此要求。 / p>

1 个答案:

答案 0 :(得分:7)

vulkan中的任何内容都不会绑定到特定的帖子。

只要您遵守外部同步的要求,您就可以从任何线程调用任何vulkan函数。

  

如果两个命令对同一个对象进行操作,并且至少有一个命令声明该对象是外部同步的,则调用者不仅要保证命令不会同时执行,还要保证这两个命令是由适当的记忆障碍(如果需要)。

在其他API中,当一个对象绑定到一个线程时,它就会被清楚地记录下来。

在这种情况下,一次只有一个线程可以访问command_pool,但是对同一命令池的连续命令可以来自不同的线程。