Freigeben über


UAV-Leistungsindikatoren

Sie können ungeordnete Zugriffsansichtszähler (UAV) verwenden, um einen 32-Bit-Atomzähler einer ungeordneten Zugriffsansicht (UAV) zuzuordnen.

Unterschiede bei UAV-Leistungsindikatoren von Direct3D 11 zu Direct3D 12

Direct3D 12-Apps und Direct3D 11-Apps verwenden beide die gleichen HlSL-Shaderfunktionen (High-Level Shader Language), um auf die UAV-Zähler zuzugreifen.

  • IncrementCounter-
  • DecrementCounter-
  • anfügen
  • nutzen

Direct3D 12

In Direct3D 12 werden die 32-Bit-Werte von der Anwendung zugewiesen, sodass die 32-Bit-Werte entweder von der CPU oder der GPU gelesen und geschrieben werden können, genau wie jede andere Direct3D 12-Ressource.

Direct3D 11

Außerhalb der Shader müssen Sie mit Direct3D 11 API-Methoden aufrufen, um auf die Leistungsindikatoren zuzugreifen (z. B. ID3D11DeviceContext::CopyStructureCount).

Verwenden von UAV-Zählern

Ihre App ist für die Zuweisung von 32-Bit-Speicher für UAV-Leistungsindikatoren verantwortlich. Dieser Speicher kann in einer anderen Ressource zugeordnet werden, da er Daten enthält, die über die UAV zugänglich sind.

Weitere Informationen finden Sie unter CreateUnorderedAccessView-, D3D12_BUFFER_UAV_FLAGS und D3D12_BUFFER_UAV.

Wenn pCounterResource- im Aufruf von CreateUnorderedAccessViewangegeben wird, ist ein Zähler vorhanden, der der UAV zugeordnet ist. In diesem Fall:

  • StructureByteStride- muss größer als Null sein.
  • Format muss DXGI_FORMAT_UNKNOWN sein
  • Das RAW-Flag darf nicht festgelegt werden.
  • Beide Ressourcen müssen Puffer sein.
  • CounterOffsetInBytes- muss ein Vielfaches von 4 Byte sein.
  • CounterOffsetInBytes- innerhalb des Bereichs der Zählerressource liegen muss.
  • pDesc- darf nicht NULL sein.
  • pResource- darf nicht NULL sein.

Beachten Sie die folgenden Anwendungsfälle:

  • Wenn pCounterResource- nicht angegeben ist, muss CounterOffsetInBytes 0 sein.
  • Wenn das RAW-Flag festgelegt ist, muss das Format DXGI_FORMAT_R32_TYPELESS sein, und die UAV-Ressource muss ein Puffer sein.
  • Wenn pCounterResource- nicht festgelegt ist, muss CounterOffsetInBytes 0 sein.
  • Wenn das RAW-Flag nicht festgelegt ist und StructureByteStride = 0, muss das Format ein gültiges UAV-Format sein.

Direct3D 12 entfernt den Unterschied zwischen Anfüge- und Zähler-UAVs (obwohl der Unterschied weiterhin in HLSL-Bytecode vorhanden ist).

Die Kernlaufzeit überprüft diese Einschränkungen innerhalb CreateUnorderedAccessView.

Während draw/Dispatch muss sich die Zählerressource im Zustand D3D12_RESOURCE_STATE_UNORDERED_ACCESSbefinden. Außerdem ist es innerhalb eines einzelnen Draw/Dispatch-Aufrufs ungültig, dass eine Anwendung über zwei separate UAV-Zähler auf denselben 32-Bit-Speicherspeicherort zugreifen kann. Die Debugebene gibt Fehler aus, wenn eine dieser Fehler erkannt wird.

Es gibt keine Methoden "SetUnorderedAccessViewCounterValue" oder "CopyStructureCount", da Apps daten einfach direkt in und aus dem Zählerwert kopieren können.

Die dynamische Indizierung von UAVs mit Leistungsindikatoren wird unterstützt.

Wenn ein Shader versucht, auf den Leistungsindikator eines UAV zuzugreifen, der keinen zugeordneten Zähler hat, gibt die Debugebene eine Warnung aus, und ein GPU-Seitenfehler tritt auf, sodass das Gerät der Apps entfernt wird.

UAV-Leistungsindikatoren werden in allen Heap-Typen unterstützt (Standard, Upload, Readback).