【发布时间】:2016-09-25 17:49:20
【问题描述】:
在 Vulkan 中有多种处理同步的方法。我是这样理解的:
- Fences 是 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();
还有没有办法在第一个和第二个之间进行同步?
【问题讨论】:
-
"我希望第二个命令缓冲区在第一个命令缓冲区之后执行。" 您“希望”发生多少?也就是说,第二个命令缓冲区在做什么,以至于第一个命令缓冲区必须在第二个命令缓冲区开始之前完成执行?
-
第一个命令缓冲区是打开深度测试的渲染对象。第二个命令缓冲区是在深度测试关闭的情况下渲染网格的轮廓。因为它必须在其他对象之上。
-
如果您提交一份。然后在你的第一个命令缓冲区中使用 vkCmdSetEvent 并在你的第二个命令缓冲区中使用 vkCmdWaitEvents 并保持 src 和 dst 阶段掩码尽可能窄。
标签: c++ synchronization gpu vulkan