store_raw (sm5 – asm)

Gravação de acesso aleatório de componentes de 1 a 4 32 bits na memória sem tipo.

store_raw dest[.write_mask], dstByteOffset[.select_component], src0[.swizzle]
Item Descrição
Dest
[in] O endereço de memória.
dstByteOffset
[in] O deslocamento.
src0
[in] Os componentes a serem gravados.

Comentários

Esta instrução executa componentes de 1 a 4 *componentes de 32 bits gravados de src0 para dest no deslocamento em dstByteOffset. Não há conversão de formato.

dest deve ser um UAV (u#) ou, no sombreador de computação, ele também pode ser memória compartilhada do grupo de threads (g#).

dstByteOffset especifica o valor base de 32 bits na memória para uma janela de quatro valores sequenciais de 32 bits nos quais os dados podem ser gravados, dependendo do swizzle e da máscara em outros parâmetros.

O local dos dados gravados é equivalente ao pseudocódigo a seguir que mostra o endereço, o ponteiro para o conteúdo do buffer e os dados armazenados linearmente.

                    BYTE *BufferContents;          // from src0
                    UINT dstByteOffset;            // source register
                    BYTE *WriteLocation;           // value to calculate

                    // calculate writing location
                    WriteLocation = BufferContents 
                                + 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(UINT32));

Esse pseudocódigo mostra como a operação funciona, mas os dados reais não precisam ser armazenados linearmente. dest só pode ter uma máscara de gravação que é uma das seguintes: .x, .xy, .xyz, .xyzw. A máscara de gravação determina o número de componentes de 32 bits a serem gravados sem lacunas.

Endereçamento fora dos limites em u# significa que nada é gravado na memória fora dos limites; qualquer parte que esteja nos limites é gravada corretamente.

O endereçamento fora dos limites em g# (os limites desse g#específico, em vez de toda a memória compartilhada) para qualquer componente de 32 bits determinado faz com que todo o conteúdo de toda a memória compartilhada se torne indefinido.

cs_4_0 e cs_4_1 dão suporte a esta instrução para UAV.

Esta instrução se aplica aos seguintes estágios de sombreador:

Vértice Casco Domínio Geometry Pixel Computação
X X

Como os UAVs estão disponíveis em todos os estágios de sombreador para Direct3D 11.1, essa instrução se aplica a todos os estágios de sombreador para o runtime do Direct3D 11.1, que está disponível a partir do Windows 8.

Vértice Casco Domínio Geometry Pixel Computação
X X X X X X

Modelo de sombreador mínimo

Esta instrução tem suporte nos seguintes modelos de sombreador:

Modelo de Sombreador Com suporte
Modelo de sombreador 5 sim
Modelo de sombreador 4.1 não
Modelo de sombreador 4 não
Modelo de Sombreador 3 (DirectX HLSL) não
Modelo de Sombreador 2 (DirectX HLSL) não
Modelo de Sombreador 1 (DirectX HLSL) não

Assembly do Modelo de Sombreador 5 (DirectX HLSL)