Partager via


énumération D3D11_USAGE (d3d11.h)

Identifie l’utilisation attendue des ressources pendant le rendu. L’utilisation indique directement si une ressource est accessible par le processeur et/ou l’unité de traitement graphique (GPU).

Syntax

typedef enum D3D11_USAGE {
  D3D11_USAGE_DEFAULT = 0,
  D3D11_USAGE_IMMUTABLE = 1,
  D3D11_USAGE_DYNAMIC = 2,
  D3D11_USAGE_STAGING = 3
} ;

Constantes

 
D3D11_USAGE_DEFAULT
Valeur : 0
Ressource qui nécessite un accès en lecture et en écriture par le GPU. Il s’agit probablement du choix d’utilisation le plus courant.
D3D11_USAGE_IMMUTABLE
Valeur : 1
Ressource qui ne peut être lue que par le GPU. Il ne peut pas être écrit par le GPU et n’est pas du tout accessible par le processeur. Ce type de ressource doit être initialisé lors de sa création, car il ne peut pas être modifié après sa création.
D3D11_USAGE_DYNAMIC
Valeur : 2
Ressource accessible à la fois par le GPU (lecture seule) et l’UC (écriture uniquement). Une ressource dynamique est un bon choix pour une ressource qui sera mise à jour par le processeur au moins une fois par image. Pour mettre à jour une ressource dynamique, utilisez une méthode Map .

Pour plus d’informations sur l’utilisation des ressources dynamiques, consultez Guide pratique pour utiliser des ressources dynamiques.
D3D11_USAGE_STAGING
Valeur : 3
Ressource qui prend en charge le transfert de données (copie) du GPU vers le processeur.

Remarques

Une application identifie la façon dont une ressource est destinée à être utilisée (son utilisation) dans une description de ressource. Il existe plusieurs structures pour créer des ressources, notamment : D3D11_TEXTURE1D_DESC, D3D11_TEXTURE2D_DESC, D3D11_TEXTURE3D_DESC et D3D11_BUFFER_DESC.

Différences entre Direct3D 9 et Direct3D 10/11 :

Dans Direct3D 9, vous spécifiez le type de mémoire dans lequel une ressource doit être créée au moment de la création de la ressource (à l’aide de D3DPOOL). C’était le travail d’une application de décider quel pool de mémoire fournirait la meilleure combinaison de fonctionnalités et de performances.

Dans Direct3D 10/11, une application ne spécifie plus le type de mémoire (le pool) dans lequel créer une ressource. Au lieu de cela, vous spécifiez l’utilisation prévue de la ressource et laissez le runtime (de concert avec le pilote et un gestionnaire de mémoire) choisir le type de mémoire qui obtiendra les meilleures performances.

 

Restrictions d’utilisation des ressources

Chaque utilisation dicte un compromis entre l’accessibilité pour le processeur et l’accessibilité pour le GPU. En général, un accès plus performant pour l’un de ces deux processeurs signifie un accès moins performant pour l’autre. À chaque extrême, les utilisations D3D11_USAGE_DEFAULT et D3D11_USAGE_STAGING . D3D11_USAGE_DEFAULT restreint l’accès presque entièrement au GPU. D3D11_USAGE_STAGING restreint l’accès presque entièrement au processeur et autorise uniquement un transfert de données (copie) d’une ressource entre le GPU et le processeur. Vous pouvez effectuer ces opérations de copie via les méthodes ID3D11DeviceContext ::CopySubresourceRegion et ID3D11DeviceContext ::CopyResource . Vous pouvez également utiliser ces méthodes de copie pour copier des données entre deux ressources de la même utilisation. Vous pouvez également utiliser la méthode ID3D11DeviceContext ::UpdateSubresource pour copier la mémoire directement à partir d’un pointeur fourni par le processeur vers n’importe quelle ressource, plus utilement une ressource avec D3D11_USAGE_DEFAULT.

D3D11_USAGE_DYNAMIC utilisation est un cas particulier qui optimise le flux de données de l’UC vers le GPU lorsque le processeur génère ces données à la volée et envoie ces données à haute fréquence. D3D11_USAGE_DYNAMIC est généralement utilisé sur les ressources avec des données de vertex et sur des mémoires tampons constantes. Utilisez les méthodes ID3D11DeviceContext ::Map et ID3D11DeviceContext ::Unmap pour écrire des données dans ces ressources. Pour obtenir les performances les plus élevées pour les données consommées en série, comme les données de vertex, utilisez la séquence D3D11_MAP_WRITE_NO_OVERWRITE et D3D11_MAP_WRITE_DISCARD . Pour plus d’informations sur cette séquence, consultez Utilisation courante de D3D11_MAP_WRITE_DISCARD avec D3D11_MAP_WRITE_NO_OVERWRITE.

D3D11_USAGE_IMMUTABLE utilisation est un autre cas particulier qui amène le GPU à générer des données une seule fois lorsque vous créez une ressource. D3D11_USAGE_IMMUTABLE convient parfaitement aux données telles que les textures, car ces données sont généralement lues en mémoire à partir d’un format de fichier donné. Par conséquent, lorsque vous créez une texture avec D3D11_USAGE_IMMUTABLE, le GPU lit directement cette texture en mémoire.

Utilisez le tableau suivant pour choisir l’utilisation qui décrit le mieux comment la ressource doit être accessible par le processeur et/ou le GPU. Bien sûr, il y aura des compromis en matière de performance.

Utilisation des ressources Default Dynamique Non modifiable Staging
GPU-Read Oui oui oui oui¹
GPU-Write Oui oui¹
CPU-Read oui¹
CPU-Write oui oui¹
 

1 - La lecture ou l’écriture GPU d’une ressource avec le D3D11_USAGE_STAGING l’utilisation est limitée aux opérations de copie. Vous utilisez ID3D11DeviceContext ::CopySubresourceRegion et ID3D11DeviceContext ::CopyResource pour ces opérations de copie. En outre, étant donné que les formats de gabarit de profondeur et les dispositions multi-échantillon sont des détails d’implémentation d’une conception GPU particulière, le système d’exploitation ne peut pas exposer ces formats et dispositions au processeur en général. Par conséquent, les ressources intermédiaires ne peuvent pas être une mémoire tampon de gabarit de profondeur ou une cible de rendu multi-échantillonnée.

Note Vous pouvez techniquement utiliser ID3D11DeviceContext ::UpdateSubresource pour copier vers une ressource avec n’importe quelle utilisation, sauf D3D11_USAGE_IMMUTABLE. Toutefois, nous vous recommandons d’utiliser ID3D11DeviceContext ::UpdateSubresource pour mettre à jour uniquement une ressource avec D3D11_USAGE_DEFAULT. Nous vous recommandons d’utiliser ID3D11DeviceContext ::Map et ID3D11DeviceContext ::Unmap pour mettre à jour les ressources avec D3D11_USAGE_DYNAMIC , car c’est l’objectif spécifique de D3D11_USAGE_DYNAMIC ressources, et donc le chemin d’accès le plus optimisé.
 
NotezD3D11_USAGE_DYNAMIC ressources utilisent des fonctionnalités matérielles spécifiques. Par conséquent, utilisez-les avec parcimonie. Le pilote d’affichage alloue généralement de la mémoire pour les ressources D3D11_USAGE_DYNAMIC avec un algorithme de mise en cache qui favorise les écritures du processeur et entrave les lectures du processeur. En outre, la mémoire derrière D3D11_USAGE_DYNAMIC ressources peut ne pas être la même pour les appels successifs à ID3D11DeviceContext ::Map. Par conséquent, ne vous attendez pas à des lectures d’UC hautes performances ou même cohérentes à partir de D3D11_USAGE_DYNAMIC ressources.
 
RemarqueID3D11DeviceContext ::CopyStructureCount est un cas spécial de copie gpu-processeur. Utilisez ID3D11DeviceContext ::CopyStructureCount uniquement avec des vues d’accès non ordonnées (UAV) des mémoires tampons.
 

Options de liaison de ressources

Pour optimiser les performances, toutes les options d’utilisation des ressources ne peuvent pas être utilisées comme ressources d’entrée ou de sortie dans le pipeline. Ce tableau identifie ces limitations.
La ressource peut être liée en tant que Default Dynamique Non modifiable Staging
Entrée dans une étape oui² oui 3 oui
Sortie à partir d’une étape oui²
 
  • 2 - S’il est lié en tant qu’entrée et en sortie à l’aide de vues différentes, chaque vue doit utiliser des sous-ressources différentes.
  • 3 - La ressource ne peut être créée qu’avec une seule sous-ressource. La ressource ne peut pas être un tableau de textures. La ressource ne peut pas être une chaîne mipmap.

Configuration requise

Condition requise Valeur
En-tête d3d11.h

Voir aussi

Énumérations de ressources