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 结构的说明和使用。
相关主题
- HLSL 编程指南
- 着色器模型 6 内部函数