VK_DEPENDENCY_BY_REGION_BIT含义、影响及相关技术问题咨询
Vulkan 子pass同步与输入附件技术说明
输入附件的核心采样特性
- 输入附件仅能通过GLSL的
subpassLoad函数访问 - 该函数的采样行为被严格限定为当前片段对应位置,不提供随机访问能力,无法在任意片段位置读取附件数据
这一特性的实际影响:如果渲染流程需要读取当前片段区域外的数值(在分块渲染器上,等同于访问当前正在渲染的tile范围之外的已渲染数据),必须使用独立render pass实现。
VK_DEPENDENCY_BY_REGION_BIT的规范定义
根据Vulkan规范:
- 当同步命令的
dependencyFlags参数指定了VK_DEPENDENCY_BY_REGION_BIT标志时,会针对帧缓冲空间管线阶段,为所有帧缓冲区域定义帧缓冲局部依赖- 当同步命令未携带
dependencyFlags参数,或未指定该标志时,会为对应管线阶段定义帧缓冲全局依赖
分块架构下的多子pass使用规则
来自ARM的Hans-Kristian Arntzen提出结论:在分块架构上,多子pass render pass仅应与VK_DEPENDENCY_BY_REGION_BIT配合使用。
合并相邻多个render pass(该操作在基于tile的渲染器上对性能提升尤为重要),必须同时满足以下所有条件:
- 参与合并的两个pass均为图形渲染pass
- 二者共享部分颜色/深度/输入附件
- 合并范围内最多仅存在1个深度/模板附件
- 二者的依赖关系可通过
VK_DEPENDENCY_BY_REGION_BIT实现,不存在需要支持任意位置采样的「纹理」类依赖
待明确的核心技术问题
- 既然
subpassLoad本身就无法访问当前片段位置之外的内容,VK_DEPENDENCY_BY_REGION_BIT的存在意义是什么? - 在分块架构上,如果某多子pass render pass的子pass依赖无法声明
VK_DEPENDENCY_BY_REGION_BIT,和功能等价、同步逻辑完全正确的一系列独立单子pass render pass相比,是否还存在性能优势?
内容的提问来源于stack exchange,提问作者plasmacel
相关产品推荐
相关产品推荐

