Synchronization Vulkan中的信号量何时用于在队列操作和主机之间插入依赖关系?

Synchronization Vulkan中的信号量何时用于在队列操作和主机之间插入依赖关系?,synchronization,vulkan,Synchronization,Vulkan,规范中提到了VkSemaphore: 信号量是一种同步原语,可用于在队列操作之间或队列操作与主机之间插入依赖项 在什么情况下,您会使用信号量在队列操作和主机之间建立依赖关系?我只见过VkSemaphore用于在队列操作之间放置依赖项,围栏用于在队列和主机之间同步。围栏用于在队列操作完成到某一点时发出信号。通信是单向的:从GPU到主机 时间轴信号灯有点不同。它们表示一个不断增加的计数器值。当一个时间线信号量被“发信号”时,计数器会被碰撞,等待操作可以等待计数器达到某个值 因为时间轴信号量只是计数器

规范中提到了VkSemaphore:

信号量是一种同步原语,可用于在队列操作之间或队列操作与主机之间插入依赖项


在什么情况下,您会使用信号量在队列操作和主机之间建立依赖关系?我只见过VkSemaphore用于在队列操作之间放置依赖项,围栏用于在队列和主机之间同步。

围栏用于在队列操作完成到某一点时发出信号。通信是单向的:从GPU到主机

时间轴信号灯有点不同。它们表示一个不断增加的计数器值。当一个时间线信号量被“发信号”时,计数器会被碰撞,等待操作可以等待计数器达到某个值

因为时间轴信号量只是计数器,所以主机完全可以“发信号”和/或等待一个信号量达到给定的计数器值。这两种方法都很有用,因为fence表示非常粗粒度的操作:整个队列提交等。相比之下,信号量附加到单个提交中的各个批次

请注意,这仅适用于时间轴信号量(这就是为什么您以前可能没有见过它;时间轴信号量是Vulkan 1.2的一个特性)。主机不能直接与二进制信号量交互,尽管可以从二进制信号量中提取特定于实现的句柄,并以这种方式与二进制信号量交互

至于它的用途,您可以用时间轴信号量代替围栏和事件的许多用途。信号量比fences更细粒度,您不必费心重置它们并在多个fences对象之间循环。如果您想知道是否执行了超过帧X的操作,只需询问时间线信号量其计数器是否已超过帧X的计数器值


事件仍然是您需要的,因为信号量信令和等待操作只能在批之间进行。但是,如果可以将GPU等待操作放在批处理的开始部分,那么用于主机到GPU传输操作的许多事件都可以生成时间线信号量。因此,您再次减少了必须进行的对象重置和杂耍。

批处理只是命令缓冲区的数组吗?虽然我还没有找到一个实际的定义(谷歌搜索导致了关于批处理渲染的结果,我认为这不是同一件事)。@DavidGioia:“我还没有找到一个实际的定义”你看了吗?啊,谢谢,我应该检查一下词汇表。因此,需要明确的是,vkQueueSubmit的pSubmits参数中的每个VkSubmitInfo都是单个批处理,这解释了为什么信号量是每个批处理的,因为每个VkSubmitInfo包含要发送信号/等待的信号量,而vkQueueSubmit调用本身包含一个围栏参数。