这里有几种在 Vulkan 中处理同步的方法。这是我对其的理解:
- Fences(栅栏): 用于 GPU 到 CPU 的同步。
- Semaphores(信号量): 用于 GPU 到 GPU 的同步,它们用来同步队列提交(在同一队列或不同队列上)。
- Events(事件): 更为通用,可以在 CPU 和 GPU 上重置和检查。
- Barriers(屏障): 用于命令缓冲区内部的同步。
在我的情况下,我有两个命令缓冲区。我希望第二个命令缓冲区在第一个之后执行。
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),这与使用栅栏(Fence)的效果是否相同?或者我应该使用事件(Event)或信号量(Semaphore)来实现同步?
如果我同时发送多个命令缓冲区到队列:
std::vector<VkCommandBuffer> submitCmdBuffers = {
firstCommandBuffer,
secondCommandBuffer
};
submitInfo.commandBufferCount = submitCmdBuffers.size();
submitInfo.pCommandBuffers = submitCmdBuffers.data();
这样做,第二个CmdBuffer执行的时候,所有的资源是否已经是第一个CmdBuffer写入的状态了?