ld_structured (sm5 - asm)
从结构化缓冲区随机读取 1-4 32 位组件。
ld_structured dest[.mask]、srcAddress[.select_component]、srcByteOffset[.select_component]、src0[.swizzle] |
---|
项 | 说明 |
---|---|
dest |
[in]操作结果的地址。 |
srcAddress |
[in]指定要读取的结构的索引。 |
srcByteOffset |
[in]指定要从其开始读取的结构中的字节偏移量。 |
src0 |
要从中读取的缓冲区。 此参数必须是 SRV (t#) 、UAV (u#) 。 在计算着色器中,它也可以是线程组共享内存 (g#) 。 |
备注
从 结构中读取的数据等效于以下伪代码:其中,我们有偏移量、地址、指向缓冲区内容的指针、源的步长以及以线性方式存储的数据。
BYTE *BufferContents; // from SRV or UAV
UINT BufferStride; // from base resource
UINT srcAddress, srcByteOffset; // from source registers
BYTE *ReadLocation; // value to calculate
ReadLocation = BufferContents
+ BufferStride * srcAddress
+ srcByteOffset;
UINT32 Temp[4]; // used to make code shorter
// apply the source resource swizzle on source data
Temp = read_and_swizzle(ReadLocation, srcSwizzle);
// write the components to the output based on mask
ApplyWriteMask(dstRegister, dstWriteMask, Temp);
此伪代码显示操作的工作原理,但实际数据不必以线性方式存储。 如果数据不是以线性方式存储的,则指令的实际操作需要与上述操作的行为相匹配。
任何给定 32 位组件的 u#/t# 上的边界寻址为该组件返回 0,除非 srcByteOffset,加上重排是导致对 you#/t# 进行边界访问的原因,则所有组件 (s) 的返回值均未定义。
g# 上的边界寻址 (该特定 g# 的边界,而不是任何给定 32 位组件的所有共享内存) 返回未定义的结果。
srcByteOffset 是 与 srcAddress 不同的参数,因为它通常是一个文本。 尚未对结构化内存上的原子执行此参数分离。
cs_4_0和cs_4_1支持 UAV、SRV 和 TGSM 的此说明。
此指令适用于以下着色器阶段:
顶点 | 外壳 | 域 | Geometry | 像素 | 计算 |
---|---|---|---|---|---|
X | X | X | X | X | X |
由于 UAV 可用于 Direct3D 11.1 的所有着色器阶段,因此本说明适用于 Direct3D 11.1 运行时的 UAV 的所有着色器阶段,从Windows 8开始提供。
顶点 | 外壳 | 域 | Geometry | 像素 | 计算 |
---|---|---|---|---|---|
X | X | X | X | X | X |
最小着色器模型
以下着色器模型中支持此指令:
着色器模型 | 支持 |
---|---|
着色器模型 5 | 是 |
着色器模型 4.1 | 否 |
着色器模型 4 | 否 |
着色器模型 3 (DirectX HLSL) | 否 |
着色器模型 2 (DirectX HLSL) | 否 |
着色器模型 1 (DirectX HLSL) | 否 |
cs_4_0和cs_4_1支持 UAV、SRV 和 TGSM 的此说明。