VkSubpassDependencies是否仅对单次渲染通道内的子通道生效?
关于VkSubpassDependencies作用域与pipeline barrier使用场景的解答
VkSubpassDependencies的同步作用默认仅针对单个渲染通道内部的子通道,只有显式配置特殊的子通道索引才会涉及渲染通道外部的操作。- 常规子通道依赖的before/after作用域完全不包含当前渲染通道之外的其他渲染通道操作。只有当你把依赖的
srcSubpass参数设为VK_SUBPASS_EXTERNAL时,源同步作用域才会包含当前渲染通道启动前、同一队列上的所有前序操作;把dstSubpass参数设为VK_SUBPASS_EXTERNAL时,目标同步作用域才会包含当前渲染通道结束后、同一队列上的所有后续操作。 - 如果子通道依赖仅能处理单渲染通道的子通道粒度同步,以下场景需要使用
vkCmdPipelineBarrier:- 同一命令缓冲区中,两个不同渲染通道之间需要做同步操作时,跨渲染通道的同步没有子通道依赖的上下文支持,只能用管线屏障实现
- 单个子通道内部需要做细粒度同步时,比如同一个子通道内先执行计算着色器写入存储资源,后续马上要在同子通道的绘制命令中读取该资源,子通道依赖只能实现子通道级别的粗粒度同步,无法覆盖子通道内部的操作间隔同步
- 非渲染管线的操作同步场景,比如传输队列、纯计算队列的操作同步,这类场景本身不存在渲染通道和子通道的概念,只能用管线屏障完成同步
- 需要对单个/少数几个资源做临时的精准同步时,管线屏障的配置比子通道依赖更灵活,不需要绑定到渲染通道的生命周期中。
内容的提问来源于stack exchange,提问作者Icaro Amorim
相关产品推荐
相关产品推荐

