多个着色器的管道障碍?

时间:2017-08-14 17:48:12

标签: vulkan

根据Vulkan barriers explained判断,似乎每个vkCmdPipelineBarrier在两个后续管道“运行”之间引入了依赖关系。对于描绘图像的着色器A和对同一图像进行采样的着色器B的典型场景,它可能如下所示:

  1. 调度着色器写入图像A
  2. vkCmdPipelineBarrier(cmd, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, ...);
  3. 从图像A中读取的调度着色器
  4. 这定义了从第一个着色器执行的颜色附加阶段到第二个着色器执行的片段阶段的依赖关系。但是,如果我想在两者之间运行独立命令该怎么办?例如

    1. 调度着色器写入图像A
    2. 调度不接触图像A的无关着色器
    3. vkCmdPipelineBarrier(cmd, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, ...);
    4. 从图像A中读取的调度着色器
    5. 这仍然有效,但效率很低:因为片段着色器阶段现在必须等待前一个无关着色器的颜色附件输出阶段。如何在之前指定着色器的依赖关系?

1 个答案:

答案 0 :(得分:3)

您正在寻找活动。 https://vulkan.lunarg.com/doc/view/1.0.57.0/windows/vkspec.html#synchronization-events

  

事件是一个同步原语,可用于在提交到同一队列的命令之间或主机与队列之间插入细粒度的依赖关系。事件有两种状态 - 信号和无信号。应用程序可以在主机或设备上发出事件信号或无信号。在执行进一步操作之前,设备可以等待事件发出信号。没有命令等待事件在主机上发出信号,但可以查询事件的当前状态。

录制命令缓冲区时,在操作后通过Compare-Object发出事件信号。此后,vkCmdSetEvent可用于定义先前事件信号操作和后续命令之间的存储器依赖性。请参阅https://vulkan.lunarg.com/doc/view/1.0.57.0/windows/vkspec.html#vkCmdWaitEvents

确保在通过vkCmdWaitEvents再次使用之前重置事件。请注意:

  

应用程序在使用事件时应小心避免竞争条件。 vkCmdResetEvent命令与之后提交的vkCmdWaitEvents命令之间没有直接排序保证,因此必须在这些命令之间包含一些其他执行依赖项(例如,信号量)。