store_structured (sm5 - asm)
Écriture en accès aléatoire de composants 1 à 4 32 bits dans une vue d’accès non ordonné (UAV) de mémoire tampon structurée.
store_structured dest[.write_mask], dstAddress[.select_component], dstByteOffset[.select_component], src0[.swizzle] |
---|
Élément | Description |
---|---|
Dest |
[in] Adresse des résultats de l’opération. |
dstAddress |
[in] Adresse à laquelle écrire. |
dstByteOffset |
[in] Index de la structure à écrire. |
src0 |
[in] Composants à écrire. |
Remarques
Cette instruction exécute 1 à 4 composants *32 bits écrits de src0 à dest à l’adresse dans dstAddress et dstByteOffset. Aucune conversion de format.
dest doit être un UAV (u#). Dans le nuanceur de calcul, il peut également s’agir de la mémoire partagée du groupe de threads (g#).
dstAddress spécifie l’index de la structure à écrire.
L’emplacement des données écrites est équivalent au pseudocode suivant qui montre le décalage, l’adresse, le pointeur vers le contenu de la mémoire tampon, la foulée de la source et les données stockées linéairement.
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));
Ce pseudo-code montre comment fonctionne l’opération, mais les données réelles n’ont pas besoin d’être stockées linéairement. Si les données ne sont pas stockées linéairement, l’opération réelle de l’instruction doit correspondre au comportement de l’opération ci-dessus.
dest ne peut avoir qu’un masque d’écriture qui est l’un des suivants : .x, .xy, .xyz, .xyzw. Le masque d’écriture détermine le nombre de composants 32 bits à écrire sans intervalles.
L’adressage hors limites sur u# casued par dstAddress signifie que rien n’est écrit dans la mémoire hors limites.
Si dstByteOffset, y compris dstWriteMask, est ce qui provoque un accès hors limites à vous #, tout le contenu de l’UAV devient non défini.
L’adressage hors limites sur g# (les limites de ce g# particulier, par opposition à toute la mémoire partagée) pour un composant 32 bits donné entraîne la non-définition de l’intégralité du contenu de toute la mémoire partagée.
dstByteOffset est un argument distinct de dstAddress , car il s’agit généralement d’un littéral. Cette séparation de paramètre n’a pas été effectuée pour les atomiques sur la mémoire structurée.
cs_4_0 et cs_4_1 prennent en charge cette instruction pour les UAV et TGSM.
Cette instruction s’applique aux étapes suivantes du nuanceur :
Sommet | Coque | Domain | Géométrie | Pixel | Compute |
---|---|---|---|---|---|
X | X |
Étant donné que les UAV sont disponibles à toutes les étapes du nuanceur pour Direct3D 11.1, cette instruction s’applique à toutes les étapes du nuanceur pour le runtime Direct3D 11.1, disponible à partir de Windows 8.
Sommet | Coque | Domain | Géométrie | Pixel | Compute |
---|---|---|---|---|---|
X | X | X | X | X | X |
Modèle de nuanceur minimal
Cette instruction est prise en charge dans les modèles de nuanceur suivants :
Modèle de nuanceur | Pris en charge |
---|---|
Modèle de nuanceur 5 | Oui |
Modèle de nuanceur 4.1 | Non |
Modèle de nuanceur 4 | Non |
Modèle de nuanceur 3 (DirectX HLSL) | Non |
Shader Model 2 (DirectX HLSL) | Non |
Modèle de nuanceur 1 (DirectX HLSL) | Non |