HLSL 着色器模型 6.0

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

着色器模型 6.0

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

可能的用例包括:流压缩、缩减、块转置、比特率排序或快速 Fourier 转换 (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 一组通道 (线程) 处理器中同时执行。 无需显式屏障来保证它们并行执行。 类似的概念包括"warp"和"wavefront"。
非活动通道 未执行的通道,例如,由于控制流或工作不足,无法填充波的最小大小。
Active Lane 要执行的通道。 在像素着色器中,它可以包括任何帮助器像素通道。
一组 4 个相邻通道,对应于以 2x2 正方形排列的像素。 它们用于通过 x 或 y 中的差异来估计渐变。 波形可能由多个四边形组成。 活动四边形中所有像素都 ("Active Lanes") ,但不产生可见结果的像素则被称"Helper Lanes"。
Helper Lane 一个仅出于像素着色器四边形中的渐变目的执行的通道。 此类通道的输出将被丢弃,因此不会呈现到目标图面。

着色语言内部函数

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

波形查询

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

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

Wave Vote

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

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

波形广播

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

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

波形减少

这些内部函数计算波中所有活动通道的指定操作,将最终结果广播到所有活动通道。 因此,最终输出保证波次均匀。

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

波形扫描和前缀

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

Intrinsic 描述 像素着色器 计算着色器
WavePrefixCountBits 返回在索引小于当前通道的所有活动航道上,将所有指定的布尔变量的总和设置为 true。 * *
WavePrefixSum 返回活动航道中具有较小索引的所有值的总和。 * *
WavePrefixProduct 返回此指定波形前面的航道中所有值的乘积。 * *

四级无序操作

这三个内部函数在已知包含像素着色器四边形的波形上对值执行交换操作,如此处所定义。 四个像素的索引在扫描行或读取顺序中定义,其中,四个位置中的坐标是:

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

|[0] [1]

|[2] [3]

v

Y

这些例程在计算着色器或像素着色器中都有效。 在计算着色器中,它们在四边形中的操作定义为在一波内均匀分布4组。 在像素着色器中,它们应该用于 WaveQuadLanes 捕获的波浪上,否则结果是不确定的。

Intrinsic 描述 像素着色器 计算着色器
QuadReadLaneAt 返回从 quadLaneID [ 0. 3 标识的当前四个通道的通道读取的指定源 ] 值。 *
QuadReadAcrossDiagonal 返回指定的本地值,此值是从这四个中对角相反的通道读取的。 *
QuadReadAcrossX 返回在此四个 X 方向中从另一个通道读取的指定源值。 *
QuadReadAcrossY 返回指定的源值,从此四个四个方向的其他通道读取。 *

硬件功能

为了检查任何特定硬件上的波形操作功能是否可用,请调用 ID3D12Device:: CheckFeatureSupport,注明 D3D12 _ 功能 _ 数据 _ D3D12 _ OPTIONS1 结构的说明和用法。