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

标签 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 中找不到此要求。 .

最佳答案

vulkan 中的任何内容都不会绑定(bind)到特定线程。

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

If two commands operate on the same object and at least one of the commands declares the object to be externally synchronized, then the caller must guarantee not only that the commands do not execute simultaneously, but also that the two commands are separated by an appropriate memory barrier (if needed).

在其他 API 中,当一个对象被绑定(bind)到一个线程时,它被非常清楚地记录下来。

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

关于multithreading - `vkCommandPool` 可以从主线程分配并移动到其他线程吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49275741/

相关文章:

multithreading - perl fork()似乎没有利用内核,而只有cpu

c++ - 线程调用函数模板时的编译错误(对于默认参数)

c++ - 从 Vulkan 中的 R16_UINT-3D 纹理在片段着色器中采样值

c++ - 不同VkInstances之间的返回值vkEnumeratePhysicalDevices是否一致?

synchronization - Vulkan 中统一缓冲区的最佳实践

java - android 致命异常 : AsyncTask #2

c# - 何时以及如何使用 lock()?

java - 如何知道java方法正在阻塞当前线程

vulkan - 如何正确共享VkDeviceMemory? VkExternalMemoryBufferCreateInfoKHR 的用途是什么?

c++ - Qt-5.14.0:QML下的Vulkan导致std::system_error::互斥锁失败