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结构的说明和用法。