HLSL 平铺资源公开

需要新的 Microsoft 高级着色器语言 (HLSL) 语法才能支持 着色器模型 5 中的平铺资源。

仅在支持平铺资源的设备上才允许使用新的 HLSL 语法。 下表中每个用于平铺资源的相关 HLSL 方法都接受一个 (反馈) 或两个 (夹,并按此顺序) 其他可选参数。 例如,Sample 方法是:

Sample(sampler, location [, offset [, clamp [, feedback] ] ])

Sample 方法的一个示例是 Texture2D.Sample(S,float,int,float,uint)

offset、clamp 和 feedback 参数都是可选的。 你必须指定所需的所有可选参数,这与默认函数参数的 C ++ 规则一致。 例如,如果需要 feedback 状态,则需要向 Sample 显式提供 offset 和 clamp 参数,即使在逻辑上可能不需要它们。

clamp 参数是标量浮点值。 clamp=0.0f 的文本值表明 clamp 操作未执行。

feedback 参数是 uint 变量,可将其提供给内存访问查询内部 CheckAccessFullyMapped 函数。 不得修改或解释 feedback 参数的值;但是编译器不提供任何高级分析和诊断来检测是否修改了值。

以下是 CheckAccessFullyMapped 的语法:

bool CheckAccessFullyMapped(in uint FeedbackVar);

CheckAccessFullyMapped 会解释 FeedbackVar 的值,如果正在访问的所有数据已映射到资源中,则返回 true;否则,CheckAccessFullyMapped 返回 false。

如果存在 clamp 或 feedback 参数,则编译器将发出基本指令的变体。 例如,平铺资源的示例生成 sample_cl_s 指令。 如果既不指定 clamp 也不指定 feedback,则编译器发出基本指令,使得当前行为不发生变化。 clamp 值 0.0f 表示不执行 clamp;因此,驱动程序编译器可以进一步根据目标硬件定制指令。 如果 feedback 是指令中的 NULL 寄存器,则不使用 feedback;因此,驱动程序编译器可以进一步根据目标体系结构定制指令。

如果 HLSL 编译器推断出 clamp 为 0.0f 并且 feedback 未使用,则编译器发出相应的基本指令(例如,sample 而不是 sample_cl_s)。

如果平铺资源访问包含多个构成字节代码指令(例如,对于结构化资源),则编译器通过 OR 操作聚合单个反馈值以生成最终反馈值。 因此,你会看到这种复杂访问的单个 feedback 值。

以下是更改为支持 feedback 和/或 clamp 的 HLSL 方法的摘要表。 这些都适用于所有维度的平铺和非平铺资源。 非平铺资源始终显示为完全映射。

HLSL 对象 具有 feedback 选项 (*) 的内部方法 - 也具有 clamp 选项
[RW]Texture2D
[RW]Texture2DArray
TextureCUBE
TextureCUBEArray
Gather
GatherRed
GatherGreen
GatherBlue
GatherAlpha
GatherCmp
GatherCmpRed
GatherCmpGreen
GatherCmpBlue
GatherCmpAlpha
[RW]Texture1D
[RW]Texture1DArray
[RW]Texture2D
[RW]Texture2DArray
[RW]Texture3D
TextureCUBE
TextureCUBEArray
Sample*
SampleBias*
SampleCmp*
SampleCmpLevelZero
SampleGrad*
SampleLevel
[RW]Texture1D
[RW]Texture1DArray
[RW]Texture2D
Texture2DMS
[RW]Texture2DArray
Texture2DArrayMS
[RW]Texture3D
[RW]Buffer
[RW]ByteAddressBuffer
[RW]StructuredBuffer
加载

对平铺资源的管道访问