Partager via


Compteurs UAV

Vous pouvez utiliser des compteurs uAV (unordered-access-view) pour associer un compteur atomique 32 bits à un UAV (unordered-access-view).

Différences entre les compteurs UAV de Direct3D 11 à Direct3D 12

Les applications Direct3D 12 et les applications Direct3D 11 utilisent les mêmes fonctions de nuanceur HLSL (high-level shader language) pour accéder aux compteurs UAV.

  • IncrementCounter
  • DecrementCounter
  • Append
  • Utiliser

Direct3D 12

Dans Direct3D 12, les valeurs 32 bits sont allouées par l’application, de sorte que les valeurs 32 bits peuvent être lues et écrites par le processeur ou le GPU, comme n’importe quelle autre ressource Direct3D 12.

Direct3D 11

En dehors des nuanceurs, avec Direct3D 11, vous devez appeler des méthodes d’API pour accéder aux compteurs (par exemple, ID3D11DeviceContext::CopyStructureCount).

Utilisation des compteurs UAV

Votre application est responsable de l’allocation de 32 bits de stockage pour les compteurs UAV. Ce stockage peut être alloué dans une autre ressource que celle qui contient des données accessibles via l’UAV.

Reportez-vous à CreateUnorderedAccessView, D3D12_BUFFER_UAV_FLAGS et D3D12_BUFFER_UAV.

Si pCounterResource est spécifié dans l’appel à CreateUnorderedAccessView, un compteur est associé à l’UAV. Dans ce cas :

  • StructureByteStride doit être supérieur à zéro
  • Le format doit être DXGI_FORMAT_UNKNOWN
  • L’indicateur RAW ne doit pas être défini
  • Les deux ressources doivent être des mémoires tampons
  • CounterOffsetInBytes doit être un multiple de 4 octets
  • CounterOffsetInBytes doit se trouver dans la plage de la ressource counter
  • pDesc ne peut pas être NULL
  • pResource ne peut pas être NULL

Notez également les cas d’usage suivants :

  • Si pCounterResource n’est pas spécifié, CounterOffsetInBytes doit être 0.
  • Si l’indicateur RAW est défini, le format doit être DXGI_FORMAT_R32_TYPELESS et la ressource UAV doit être une mémoire tampon.
  • Si pCounterResource n’est pas défini, CounterOffsetInBytes doit avoir la valeur 0.
  • Si l’indicateur RAW n’est pas défini et StructureByteStride = 0, le format doit être un format UAV valide.

Direct3D 12 supprime la distinction entre les UAV d’ajout et de compteur (bien que la distinction existe toujours dans le bytecode HLSL).

Le runtime principal valide ces restrictions dans CreateUnorderedAccessView.

Pendant draw/dispatch, la ressource de compteur doit être dans l’état D3D12_RESOURCE_STATE_UNORDERED_ACCESS. En outre, dans un seul appel Draw/Dispatch, il n’est pas valide pour une application d’accéder au même emplacement mémoire 32 bits via deux compteurs UAV distincts. La couche de débogage génère des erreurs si l’une d’elles est détectée.

Il n’existe aucune méthode « SetUnorderedAccessViewCounterValue » ou « CopyStructureCount », car les applications peuvent simplement copier des données vers et à partir de la valeur du compteur directement.

L’indexation dynamique des UAV avec des compteurs est prise en charge.

Si un nuanceur tente d’accéder au compteur d’un UAV qui n’a pas de compteur associé, la couche de débogage émet un avertissement et une erreur de page GPU se produit entraînant la suppression de l’appareil des applications.

Les compteurs UAV sont pris en charge dans tous les types de tas (par défaut, chargement, lecture).