Nouveaux types de ressources

Plusieurs nouveaux types de ressources ont été ajoutés dans Direct3D 11.

Textures et mémoires tampons en lecture/écriture

Les ressources du modèle de nuanceur 4 sont en lecture seule. Le modèle de nuanceur 5 implémente un nouvel ensemble correspondant de ressources en lecture/écriture :

Ces ressources nécessitent une variable de ressource pour accéder à la mémoire (via l’indexation), car il n’existe aucune méthode pour accéder directement à la mémoire. Une variable de ressource peut être utilisée sur les côtés gauche et droit d’une équation ; s’il est utilisé sur le côté droit, le type de modèle doit être un composant unique (float, int ou uint).

Mémoire tampon structurée

Une mémoire tampon structurée est une mémoire tampon qui contient des éléments de taille égale. Utilisez une structure avec un ou plusieurs types de membres pour définir un élément. Voici une structure avec trois membres.

struct MyStruct
{
    float4 Color;
    float4 Normal;
    bool isAwesome;
};

Utilisez cette structure pour déclarer une mémoire tampon structurée comme suit :

StructuredBuffer<MyStruct> mySB;

En plus de l’indexation, une mémoire tampon structurée prend en charge l’accès à un seul membre comme suit :

float4 myColor = mySb[27].Color;

Utilisez les types d’objets suivants pour accéder à une mémoire tampon structurée :

Les fonctions atomiques qui implémentent des opérations verrouillées sont autorisées sur les éléments int et uint dans un RWStructuredBuffer.

Mémoire tampon d’adresse d’octets

Une mémoire tampon d’adresses d’octets est une mémoire tampon dont le contenu est adressable par un décalage d’octets. Normalement, le contenu d’une mémoire tampon est indexé par élément à l’aide d’une foulée pour chaque élément (S) et du numéro d’élément (N) tel que donné par S*N. Une mémoire tampon d’adresses d’octets, qui peut également être appelée mémoire tampon brute, utilise un décalage de valeur d’octet à partir du début de la mémoire tampon pour accéder aux données. La valeur d’octet doit être un multiple de quatre pour qu’elle soit alignée sur DWORD. Si une autre valeur est fournie, le comportement n’est pas défini.

Le modèle de nuanceur 5 introduit des objets permettant d’accéder à une mémoire tampon d’adresses d’octets en lecture seule ainsi qu’à une mémoire tampon d’adresses d’octets en lecture-écriture. Le contenu d’une mémoire tampon d’adresses d’octets est conçu pour être un entier non signé 32 bits ; si la valeur de la mémoire tampon n’est pas vraiment un entier non signé, utilisez une fonction telle que asfloat pour la lire.

Texture ou mémoire tampon d’accès non ordonnée

Une ressource d’accès non trié (qui comprend des mémoires tampons, des textures et des tableaux de textures sans échantillonnage multiple), permet un accès en lecture/écriture non ordonné temporellement à partir de plusieurs threads. Cela signifie que ce type de ressource peut être lu/écrit simultanément par plusieurs threads sans générer de conflits de mémoire à l’aide de fonctions atomiques.

Créez une texture ou une mémoire tampon d’accès non ordonnée en appelant une fonction telle que ID3D11Device::CreateBuffer ou ID3D11Device::CreateTexture2D et en passant l’indicateur D3D11_BIND_UNORDERED_ACCESS de l’énumération D3D11_BIND_FLAG .

Les ressources d’accès non ordonnés ne peuvent être liées qu’aux nuanceurs de pixels et aux nuanceurs de calcul. Pendant l’exécution, les nuanceurs de pixels ou les nuanceurs de calcul exécutés en parallèle ont les mêmes ressources d’accès non ordonnées liées.

Ajouter et consommer une mémoire tampon

Une mémoire tampon d’ajout et de consommation est un type spécial de ressource non triée qui prend en charge l’ajout et la suppression de valeurs à la fin d’une mémoire tampon, de la même façon qu’une pile fonctionne.

Une mémoire tampon d’ajout et de consommation doit être une mémoire tampon structurée :

Utilisez ces ressources par le biais de leurs méthodes. Ces ressources n’utilisent pas de variables de ressources.

Vue d’ensemble du nuanceur de calcul