store_raw (sm5 - asm)

Zufälliger Schreibzugriff von 1-4 32-Bit-Komponenten in typlosen Arbeitsspeicher.

store_raw dest[.write_mask], dstByteOffset[.select_component], src0[.swizzle]
Element BESCHREIBUNG
Dest
[in] Die Speicheradresse.
dstByteOffset
[in] Der Offset.
src0
[in] Die zu schreibenden Komponenten.

Hinweise

Diese Anweisung führt 1-4-Komponenten *32-Bit-Komponenten aus, die von src0 in dest am Offset in dstByteOffset geschrieben wurden. Es gibt keine Formatkonvertierung.

dest muss ein UAV (u#) sein, oder im Compute-Shader kann es sich auch um freigegebenen Threadgruppenspeicher (g#) handeln.

dstByteOffset gibt den 32-Bit-Basiswert im Arbeitsspeicher für ein Fenster mit vier sequenziellen 32-Bit-Werten an, in das Daten je nach Swizzle und Maskierung für andere Parameter geschrieben werden können.

Der Speicherort der geschriebenen Daten entspricht dem folgenden Pseudocode, der die Adresse, den Zeiger auf den Pufferinhalt und die linear gespeicherten Daten anzeigt.

                    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));

Dieser Pseudocode zeigt, wie der Vorgang funktioniert, aber die tatsächlichen Daten müssen nicht linear gespeichert werden. dest kann nur über eine Schreibmaske verfügen, die eine der folgenden ist: .x, .xy, .xyz, .xyzw. Die Schreibmaske bestimmt die Anzahl der 32-Bit-Komponenten, die lückenlos geschrieben werden sollen.

Out-of-Bounds-Adressierung auf u# bedeutet, dass nichts in den Arbeitsspeicher außerhalb der Grenzen geschrieben wird. alle Teile, die sich in Begrenzungen befindet, werden korrekt geschrieben.

Out of bounds addressing on g# (the bounds of that particular g#, as as all shared memory) for any given 32-bit component that the all contents of all shared memory to unefined.

cs_4_0 und cs_4_1 unterstützen diese Anweisung für UAV.

Diese Anweisung gilt für die folgenden Shaderphasen:

Scheitelpunkt Hull Domain Geometrie Pixel Compute
X X

Da UAVs in allen Shaderphasen für Direct3D 11.1 verfügbar sind, gilt diese Anweisung für alle Shaderstufen für die Direct3D 11.1-Runtime, die ab Windows 8 verfügbar ist.

Scheitelpunkt Hull Domain Geometrie Pixel Compute
X X X X X X

Minimales Shadermodell

Diese Anweisung wird in den folgenden Shadermodellen unterstützt:

Shadermodell Unterstützt
Shadermodell 5 ja
Shadermodell 4.1 Nein
Shadermodell 4 Nein
Shadermodell 3 (DirectX HLSL) Nein
Shadermodell 2 (DirectX HLSL) Nein
Shadermodell 1 (DirectX HLSL) Nein

Shadermodell 5-Assembly (DirectX HLSL)