从解释的Vulkan 障碍来看,似乎每个障碍都vkCmdPipelineBarrier
在两个后续管道“运行”之间引入了依赖关系。对于写入图像的着色器 A 和对同一图像进行采样的着色器 B 的典型场景,它可能如下所示:
vkCmdPipelineBarrier(cmd, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, ...);
这定义了从第一个着色器执行的颜色附加阶段到第二个着色器执行的片段阶段的依赖关系。但是如果我想在两者之间运行独立的命令怎么办?例如
vkCmdPipelineBarrier(cmd, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, ...);
这仍然有效,但效率低下:因为片段着色器阶段现在必须等待前一个无关着色器的颜色附件输出阶段。如何在它之前指定对着色器的依赖?
您正在寻找活动。 https://vulkan.lunarg.com/doc/view/1.0.57.0/windows/vkspec.html#synchronization-events
事件是一种同步原语,可用于在提交到同一队列的命令之间或主机和队列之间插入细粒度的依赖关系。事件有两种状态 - 有信号和无信号。应用程序可以在主机或设备上发出事件信号或取消事件信号。设备可以等待事件发出信号后再执行进一步的操作。不存在等待事件在主机上发出信号的命令,但可以查询事件的当前状态。
记录命令缓冲区时,您可以vkCmdSetEvent
在操作后通过信号发出事件信号。此后vkCmdWaitEvents
可用于定义先前事件信号操作和后续命令之间的存储器依赖性。请参阅https://vulkan.lunarg.com/doc/view/1.0.57.0/windows/vkspec.html#vkCmdWaitEvents。
请确保在通过 再次使用事件之前重置该事件vkCmdResetEvent
。并注意:
应用程序在使用事件时应小心避免竞争条件。vkCmdResetEvent 命令和在其之后提交的 vkCmdWaitEvents 命令之间没有直接的顺序保证,因此这些命令之间必须包含一些其他执行依赖性(例如信号量)。