HLSL 着色器模型 6.0

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

着色器模型 6.0

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

潜在的用例包括:流压缩、减少、块转置、比特排序或快速傅立叶转换(FFT)、装箱、流重复和类似的方案。

大多数内部函数都出现在像素着色器和计算着色器中,尽管存在一些异常(每个函数都指出)。 这些函数已添加到 API 级别 12.0 下 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 处理。
在处理器中同时执行的一组通道(线程)。 无需显式屏障才能保证它们并行执行。 类似的概念包括“warp”和“wavefront”。
非活动通道 未执行的通道,例如,由于控制流或工作不足,无法填充波的最小大小。
活动通道 正在执行执行的通道。 在像素着色器中,它可能包含任何帮助程序像素通道。
一组 4 个相邻通道,对应于 2x2 正方形中排列的像素。 它们用于通过 x 或 y 中的差异来估算渐变。 波可能由多个象限组成。 活动象限中的所有像素都执行(可能为“活动通道”),但不产生可见结果的像素称为“帮助程序通道”。
帮助程序通道 仅在像素着色器象限中执行渐变的通道。 此类通道的输出将被丢弃,因此不会呈现到目标图面。

底纹语言内部函数

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

波形查询

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

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

波形投票

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

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

波形广播

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

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

波形减少

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

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

波形扫描和前缀

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

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

四宽随机作

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

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

|[0] [1]

|[2] [3]

v

Y

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

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

硬件功能

若要检查波形作功能在任何特定硬件上是否可用,请调用 ID3D12Device::CheckFeatureSupport,并指出 D3D12_FEATURE_DATA_D3D12_OPTIONS1 结构的说明和使用。