VK_DEPENDENCY_BY_REGION_BIT 的含义和含义
The meaning and implications of VK_DEPENDENCY_BY_REGION_BIT
输入附件可以通过 subpassLoad
GLSL 函数访问,该函数在当前片段位置对输入附件进行采样,即接口不提供随机访问。其结果是无法在任意片段位置访问输入附件。
这实际上意味着 [1]:
If a rendering technique requires reading values outside the current fragment area (which on a tiler would mean accessing rendered data outside the currently-rendering tile), separate render passes must be used.
然后,关于 VK_DEPENDENCY_BY_REGION_BIT
规范说 [2]:
If a synchronization command includes a dependencyFlags parameter, and specifies the VK_DEPENDENCY_BY_REGION_BIT flag, then it defines framebuffer-local dependencies for the framebuffer-space pipeline stages in that synchronization command, for all framebuffer regions. If no dependencyFlags parameter is included, or the VK_DEPENDENCY_BY_REGION_BIT flag is not specified, then a framebuffer-global dependency is specified for those stages.
来自 ARM [3] 的 Hans-Kristian Arntzen 建议在平铺架构上,多子通道渲染通道应该仅与 VK_DEPENDENCY_BY_REGION_BIT
:
结合使用
Next, we try to merge adjacent render passes together. This is particularly important on tile-based renderers. We try to merge passes together if:
- They are both graphics passes
- They share some color/depth/input attachments
- Not more than one unique depth/stencil attachment exists
- Their dependencies can be implemented with BY_REGION_BIT, i.e. no “texture” dependency, which allows sampling for arbitrary locations.
现在的问题是:
如果无论如何都无法访问当前片段位置之外的片段,VK_DEPENDENCY_BY_REGION_BIT
有什么意义?
在平铺架构上执行多子通道渲染通道,其中子通道依赖项不能用 VK_DEPENDENCY_BY_REGION_BIT
声明,与功能等效的正确同步系列单独的单子通道渲染通道相比提供任何性能优势?
嗯,规范举了一个例子。如果您想访问片段未涵盖的输入附件示例,则必须使用帧缓冲区全局依赖项(即 dependencyFlags = 0
,或修复该问题的供应商扩展之一)。
虽然最明显的例子是非附件资源,它们自然是随机访问的(您 可以 访问任何像素)。使用 VK_DEPENDENCY_BY_REGION_BIT
只有为同一片段编写的部分才能确定可见。在使用帧缓冲区全局依赖项 (dependencyFlags=0
) 时,您可以访问存储缓冲区中由前一个子通道的任何片段着色器调用写入的位置。
dependencyFlags=0
是渲染通道的软重启。所以一切都一样我会这样评价表现:
单个子通道≥具有VK_DEPENDENCY_BY_REGION_BIT
的多个子通道≥没有VK_DEPENDENCY_BY_REGION_BIT
的多个子通道≥多个渲染通道。
帧缓冲区全局子通道是否真的提供了任何性能优势,如果不测量特定的实现,我不能说(这可能是一个易腐烂的信息,随着新的 GPU 或什至驱动程序版本而改变)。虽然情况不应该比单独的渲染通道更糟糕,但如果驱动程序本身不能对这些特殊子通道做任何事情,这可能是最糟糕的降级。
输入附件可以通过 subpassLoad
GLSL 函数访问,该函数在当前片段位置对输入附件进行采样,即接口不提供随机访问。其结果是无法在任意片段位置访问输入附件。
这实际上意味着 [1]:
If a rendering technique requires reading values outside the current fragment area (which on a tiler would mean accessing rendered data outside the currently-rendering tile), separate render passes must be used.
然后,关于 VK_DEPENDENCY_BY_REGION_BIT
规范说 [2]:
If a synchronization command includes a dependencyFlags parameter, and specifies the VK_DEPENDENCY_BY_REGION_BIT flag, then it defines framebuffer-local dependencies for the framebuffer-space pipeline stages in that synchronization command, for all framebuffer regions. If no dependencyFlags parameter is included, or the VK_DEPENDENCY_BY_REGION_BIT flag is not specified, then a framebuffer-global dependency is specified for those stages.
来自 ARM [3] 的 Hans-Kristian Arntzen 建议在平铺架构上,多子通道渲染通道应该仅与 VK_DEPENDENCY_BY_REGION_BIT
:
Next, we try to merge adjacent render passes together. This is particularly important on tile-based renderers. We try to merge passes together if:
- They are both graphics passes
- They share some color/depth/input attachments
- Not more than one unique depth/stencil attachment exists
- Their dependencies can be implemented with BY_REGION_BIT, i.e. no “texture” dependency, which allows sampling for arbitrary locations.
现在的问题是:
如果无论如何都无法访问当前片段位置之外的片段,
VK_DEPENDENCY_BY_REGION_BIT
有什么意义?在平铺架构上执行多子通道渲染通道,其中子通道依赖项不能用
VK_DEPENDENCY_BY_REGION_BIT
声明,与功能等效的正确同步系列单独的单子通道渲染通道相比提供任何性能优势?
嗯,规范举了一个例子。如果您想访问片段未涵盖的输入附件示例,则必须使用帧缓冲区全局依赖项(即 dependencyFlags = 0
,或修复该问题的供应商扩展之一)。
虽然最明显的例子是非附件资源,它们自然是随机访问的(您 可以 访问任何像素)。使用 VK_DEPENDENCY_BY_REGION_BIT
只有为同一片段编写的部分才能确定可见。在使用帧缓冲区全局依赖项 (dependencyFlags=0
) 时,您可以访问存储缓冲区中由前一个子通道的任何片段着色器调用写入的位置。
dependencyFlags=0
是渲染通道的软重启。所以一切都一样我会这样评价表现:
单个子通道≥具有VK_DEPENDENCY_BY_REGION_BIT
的多个子通道≥没有VK_DEPENDENCY_BY_REGION_BIT
的多个子通道≥多个渲染通道。
帧缓冲区全局子通道是否真的提供了任何性能优势,如果不测量特定的实现,我不能说(这可能是一个易腐烂的信息,随着新的 GPU 或什至驱动程序版本而改变)。虽然情况不应该比单独的渲染通道更糟糕,但如果驱动程序本身不能对这些特殊子通道做任何事情,这可能是最糟糕的降级。