在 Vulkan 中有几种处理同步的方法。我是这样理解的:
- 栅栏是 GPU 到 CPU 的同步。
- 信号量是 GPU 到 GPU 的同步,它们用于同步队列提交(在相同或不同的队列上)。
- 事件更通用,在 CPU 和 GPU 上都可以重置和检查。
- 屏障用于命令缓冲区内的同步。
就我而言,我有两个命令缓冲区。我希望第二个命令缓冲区在第一个命令缓冲区之后执行。
submitInfo.pCommandBuffers = &firstCommandBuffer;
vkQueueSubmit(queue, 1, &submitInfo, VK_NULL_HANDLE);
// wait for first command buffer to finish
submitInfo.pCommandBuffers = &secondCommandBuffer;
vkQueueSubmit(queue, 1, &submitInfo, VK_NULL_HANDLE);
什么样的同步最适合这个?如果我使用vkQueueWaitIdle(queue)),
它与使用栅栏是一样的,还是应该为此使用事件或信号量?
如果我同时将多个命令缓冲区发送到队列:
std::vector<VkCommandBuffer> submitCmdBuffers = {
firstCommandBuffer,
secondCommandBuffer
};
submitInfo.commandBufferCount = submitCmdBuffers.size();
submitInfo.pCommandBuffers = submitCmdBuffers.data();
还有一种方法可以在第一个和第二个之间进行同步吗?