有几种方法可以处理Vulkan中的同步.这就是我理解的方式:
在我的情况下,我有两个命令缓冲区.我希望第二个命令缓冲区在第一个命令缓冲区之后执行.
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);
Run Code Online (Sandbox Code Playgroud)
什么样的同步最适合这个?如果我使用的vkQueueWaitIdle(queue)),是与使用栅栏相同的东西,或者我应该使用事件或信号量?
如果我同时向队列发送多个命令缓冲区:
std::vector<VkCommandBuffer> submitCmdBuffers = {
firstCommandBuffer,
secondCommandBuffer
};
submitInfo.commandBufferCount = submitCmdBuffers.size();
submitInfo.pCommandBuffers = submitCmdBuffers.data();
Run Code Online (Sandbox Code Playgroud)
还有一种方法可以在第一个和第二个之间同步吗?
引用Vulkan 1.0规范文档,第5章(命令缓冲区)第4段,
"除非另有说明,否则没有明确同步,通过命令缓冲区提交给队列的各种命令可以相对于彼此以任意顺序执行,和/或同时执行"
在第2.1.1章(队列操作)的第1段中,它也说明了
"...提交到单个队列的命令缓冲区按照它们提交的顺序播放,每个缓冲区内的命令按照它们记录的顺序播放"
第5章中的"任意顺序"是否意味着无序?然后,对于第2.1.1章"按照提交顺序播放"的陈述,这不是冲突吗?或者命令只是按顺序"回放"但是"执行"无序?