通过Vulkan barriers explained判断,似乎每个vkCmdPipelineBarrier
都引入了两个后续管道“运行”之间的依赖关系。对于写入图像和着色器B中的样品相同的图像着色器A的典型情况下,它可能是这样的:跨越多个着色器的流水线障碍?
- 调度着色器写入图像A
vkCmdPipelineBarrier(cmd, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, ...);
- 调度着色器从图像读取A
这定义了从第一个着色器执行的颜色附件阶段到第二个着色器执行的片段阶段的依赖关系。但如果我想在两者之间运行独立命令,该怎么办?例如
- 调度着色器写入图像A
- 调度无关着色器不触及图像A
vkCmdPipelineBarrier(cmd, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, ...);
- 调度着色器,从图像A
这仍然读但是效率不高:因为片段着色器阶段现在必须等待前一个,不相关的的颜色附件输出阶段着色器。如何在之前指定对着色器的依赖关系?
谢谢。这似乎回答了我的问题,但不幸的是,它也让我卡住了,因为我不知道我是否会立即重新使用纹理,或者我是否会在以后的某个时间点重新使用它 - 所以我事先不知道我是否需要发出事件信号。所以我相信我会一直使用vmCmdPipeline并且效率低下。 – haasn
据我所知,事件是一种更先进的信号量,因为它们用于同步。另一方面,障碍定义了内存依赖性。所以我认为在这种情况下使用事件会是一个矫枉过正的事情。重新排序操作不会在这里帮助吗?如果命令没有触及提到的图像,是不是可以提前提交? – Ekzuzy
事件轻而易举。它不是信号量,也不是“先进的信号量”。阅读文档。 – ssteinberg