store_structured (sm5 - asm)
将 1-4 个 32 位组件随机访问写入结构化缓冲区无序访问视图, (UAV) 。
store_structured dest[.write_mask]、 dstAddress[.select_component]、 dstByteOffset[.select_component]、 src0[.swizzle] |
---|
项 | 说明 |
---|---|
dest |
[in]操作结果的地址。 |
dstAddress |
[in]要写入的地址。 |
dstByteOffset |
[in]要写入的 结构的索引。 |
src0 |
[in]要写入的组件。 |
备注
此指令在 dstAddress 和 dstByteOffset 中的地址处执行从 src0 写入到 dest 的 1-4 组件 *32 位组件。 无格式转换。
dest 必须是 UAV (u#) 。 在计算着色器中,也可以是线程组共享内存 (g#) 。
dstAddress 指定要写入的结构的索引。
写入的数据的位置等效于以下伪代码,其中显示了偏移量、地址、指向缓冲区内容的指针、源的步幅以及线性存储的数据。
BYTE *BufferContents; // from dest
UINT BufferStride; // from dest
UINT dstAddress, dstByteOffset; // source registers
BYTE *WriteLocation; // value to calculate
// calculate writing location
WriteLocation = BufferContents
+ BufferStride * dstAddress
+ dstByteOffset;
// calculate the number of components to write
switch (dstWriteMask)
{
x: WriteComponents = 1; break;
xy: WriteComponents = 2; break;
xyz: WriteComponents = 3; break;
xyzw: WriteComponents = 4; break;
default: // only these masks are valid
}
// copy the data from the source register with
// the swizzle applied
memcpy(WriteLocation, swizzle(src0, src0.swizzle),
WriteComponents * sizeof(INT32));
此伪代码显示操作的工作方式,但实际数据不必以线性方式存储。 如果数据不是线性存储的,则指令的实际操作需要与上述操作的行为相匹配。
dest 只能具有以下项之一的写入掩码:.x、.xy、.xyz、.xyzw。 写入掩码确定要写入且没有间隔的 32 位组件的数量。
dstAddress 在 u# 上寻址的超出边界意味着不会向边界外内存写入任何内容。
如果 dstByteOffset(包括 dstWriteMask)导致对 you# 进行越界访问,则 UAV 的整个内容将变为未定义。
g# 上的边界外寻址 (该特定 g# 的边界,而不是任何给定 32 位组件的所有共享内存) 会导致所有共享内存的整个内容变得未定义。
dstByteOffset 是 与 dstAddress 不同的参数,因为它通常是一个文本。 尚未对结构化内存上的原子执行此参数分离。
cs_4_0和cs_4_1支持 UAV 和 TGSM 的此说明。
此指令适用于以下着色器阶段:
顶点 | 外壳 | 域 | Geometry | 像素 | 计算 |
---|---|---|---|---|---|
X | X |
由于 UAV 可用于 Direct3D 11.1 的所有着色器阶段,因此本指令适用于 Direct3D 11.1 运行时的所有着色器阶段,该阶段从 Windows 8 开始可用。
顶点 | 外壳 | 域 | Geometry | 像素 | 计算 |
---|---|---|---|---|---|
X | X | X | X | X | X |
最小着色器模型
以下着色器模型中支持此指令:
着色器模型 | 支持 |
---|---|
着色器模型 5 | 是 |
着色器模型 4.1 | 否 |
着色器模型 4 | 否 |
着色器模型 3 (DirectX HLSL) | 否 |
着色器模型 2 (DirectX HLSL) | 否 |
着色器模型 1 (DirectX HLSL) | 否 |