HLSL 着色器模型 6.0

描述添加到 HLSL 着色器模型 6.0 的波运算内部函数。

着色器模型 6.0

对于早期的着色器模型,HLSL 编程只公开单个执行线程。 从模型 6.0 开始,提供了新的波级操作,以显式利用当前 GPU 的并行度 - 许多线程可以同时在同一个核心上锁定执行。 例如,当同步范围在 SIMD 处理器的宽度范围内时,模型 6.0 内部函数支持消除屏障构造,或已知彼此相对原子的一组其他线程。

可能的用例包括:流压缩、缩减、块转置、bitonic 排序或快速傅立叶变换 (FFT) 、装箱、流重复数据删除等方案。

大多数内部函数都显示在像素着色器和计算着色器中,但对于每个函数) (有一些例外。 这些函数已添加到 API 级别 12 下 DirectX 功能级别 12.0 的要求中。

<这些函数的类型>参数和返回值表示表达式的类型,支持的类型是以下列表中存在于应用的目标着色器模型中的类型:

  • half、half2、half3、half4
  • float、float2、float3、float4
  • double、double2、double3、double4
  • int、int2、int3、int4
  • uint、uint2、uint3、uint4
  • short、short2、short3、short4
  • ushort、ushort2、ushort3、ushort4
  • uint64_t、uint64_t2、uint64_t3、uint64_t4

某些 (运算(如按位运算符) 仅支持整数类型。

术语

条款 定义
通道 单个执行线程。 版本 6.0 之前的着色器模型在语言级别只公开其中一个模型,使并行 SIMD 处理的扩展完全由实现决定。
Wave 一组通道 (线程) 处理器中同时执行。 无需显式屏障即可保证它们并行执行。 类似的概念包括“扭曲”和“wavefront”。
非活动通道 未执行的通道,例如,由于控制流,或没有足够的工作来填充波的最小大小。
活动通道 正在执行执行的通道。 在像素着色器中,它可能包括任何帮助器像素通道。
四边形 一组 4 个相邻通道,对应于以 2x2 正方形排列的像素。 它们用于通过 x 或 y 中的差异来估计梯度。 一个波可以由多个象限组成。 活动象限中的所有像素都 (执行,可以是“活动通道”) ,但那些不产生可见结果的像素称为“帮助通道”。
Helper Lane 仅出于像素着色器象限中的渐变目的执行的通道。 此类通道的输出将被丢弃,因此不会呈现到目标图面。

底纹语言内部函数

此着色器模型的所有操作都已添加到一系列内部函数中。

波形查询

用于查询单个波次的内部函数。

Intrinsic 说明 像素着色器 计算着色器
WaveGetLaneCount 返回当前波形中的通道数。 * *
WaveGetLaneIndex 返回当前波中当前通道的索引。 * *
WaveIsFirstLane 仅对具有最小索引的当前波中的活动通道返回 true * *

波次投票

这组内部函数比较当前波中当前处于活动状态的线程的值。

Intrinsic 说明 像素着色器 计算着色器
WaveActiveAnyTrue 如果表达式在当前波形中的任何活动通道中为 true,则返回 true。 * *
WaveActiveAllTrue 如果表达式在当前波形中的所有活动通道中为 true,则返回 true。 * *
WaveActiveBallot 返回指定波形中所有活动通道的布尔表达式计算的 64 位无符号整数位掩码。 * *

波形广播

这些内部函数使当前波中的所有活动通道都能从指定通道接收值,从而有效地广播该值。 无效通道的返回值未定义。

Intrinsic 说明 像素着色器 计算着色器
WaveReadLaneAt 返回指定波中给定通道索引的表达式值。 * *
WaveReadLaneFirst 返回具有最小索引的当前波的活动通道的表达式值。 * *

波减少

这些内部函数计算波中所有活动通道的指定运算,并将最终结果广播到所有活动通道。 因此,保证最终输出在整个波中保持一致。

Intrinsic 说明 像素着色器 计算着色器
WaveActiveAllEqual 如果当前波 (中的每个活动通道的表达式都相同,因此) ,则返回 true。 * *
WaveActiveBitAnd 返回当前波中所有活动通道中表达式的所有值的按位 AND,并将结果复制到波形中的所有通道。 * *
WaveActiveBitOr 返回当前波中所有活动通道中表达式的所有值的按位 OR,并将结果复制到波形中的所有通道。 * *
WaveActiveBitXor 返回当前波中所有活动通道中表达式的所有值的按位异或,并将结果复制到波形中的所有通道。 * *
WaveActiveCountBits 计算当前波中所有活动通道中计算结果为 true 的布尔变量数,并将结果复制到波形中的所有通道。 * *
WaveActiveMax 计算当前波中所有活动通道的表达式的最大值,并将结果复制到波形中的所有通道。 * *
WaveActiveMin 计算当前波中所有活动通道的表达式的最小值,并将结果复制到波形中的所有通道。 * *
WaveActiveProduct 将当前波中所有活动通道上的表达式值相乘,并将结果复制到波形中的所有通道。 * *
WaveActiveSum 求和当前波中所有活动通道中的表达式值,并将其复制到当前波中的所有通道,并将结果复制到波中所有通道。 * *

波形扫描和前缀

这些内部函数将 运算应用于每个通道,并将计算的每个部分结果保留在相应的通道中。

Intrinsic 说明 像素着色器 计算着色器
WavePrefixCountBits 返回索引小于当前通道的所有活动通道中设置为 true 的所有指定布尔变量的总和。 * *
WavePrefixSum 返回活动通道中索引小于此索引的所有值的总和。 * *
WavePrefixProduct 返回通道中指定波形之前的所有值的乘积。 * *

四边形随机操作

这些内部函数对已知包含像素着色器象限的波中的值执行交换操作,如下所示。 象限中像素的索引按扫描行或读取顺序定义 - 其中象限中的坐标为:

+---------> X

|[0] [1]

|[2] [3]

v

Y

这些例程在计算着色器或像素着色器中工作。 在计算着色器中,它们以定义为 SIMD 波中 4 的均匀划分组的象限运行。 在像素着色器中,它们应用于 WaveQuadLanes 捕获的波,否则结果为未定义。

Intrinsic 说明 像素着色器 计算着色器
QuadReadLaneAt 返回从由 quadLaneID [0..3] 标识的当前象限的通道中读取的指定源值,该值必须在象限中保持一致。 *
QuadReadAcrossDiagonal 返回从此象限中的对角相反通道读取的指定本地值。 *
QuadReadAcrossX 返回从 X 方向上从此象限中的另一个通道读取的指定源值。 *
QuadReadAcrossY 返回从此四边形中的另一个通道在 Y 方向读取的指定源值。 *

硬件功能

若要检查波形操作功能在任何特定硬件上都可用,请调用 ID3D12Device::CheckFeatureSupport,注意D3D12_FEATURE_DATA_D3D12_OPTIONS1结构的说明和用法。