Freigeben über


UAV-Leistungsindikatoren

Sie können UAV-Leistungsindikatoren (Unordered Access-View) verwenden, um einen atomaren 32-Bit-Zähler einer unordered-access-view (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-Indikatoren zuzugreifen.

  • IncrementCounter
  • DecrementCounter
  • Append
  • 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 bei Direct3D 11 API-Methoden aufrufen, um auf die Indikatoren zuzugreifen (z. B. ID3D11DeviceContext::CopyStructureCount).

Verwenden von UAV-Indikatoren

Ihre App ist für die Zuweisung von 32-Bit-Speicher für UAV-Indikatoren verantwortlich. Dieser Speicher kann einer anderen Ressource zugeordnet werden, als der, der Daten enthält, auf die über das UAV zugegriffen werden kann.

Weitere Informationen finden Sie unter CreateUnorderedAccessView, D3D12_BUFFER_UAV_FLAGS und D3D12_BUFFER_UAV.

Wenn pCounterResource im Aufruf von CreateUnorderedAccessView angegeben wird, ist dem UAV ein Zähler zugeordnet. In diesem Fall:

  • StructureByteStride muss größer als 0 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 Bytes sein.
  • CounterOffsetInBytes muss sich innerhalb des Bereichs der Zählerressource befinden.
  • 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 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 die Unterscheidung zwischen Anfüge- und Zähler-UAVs (obwohl die Unterscheidung im HLSL-Bytecode weiterhin vorhanden ist).

Die Core Runtime überprüft diese Einschränkungen innerhalb von CreateUnorderedAccessView.

Während des Draw/Dispatch-Vorgangs muss sich die Zählerressource im Zustand D3D12_RESOURCE_STATE_UNORDERED_ACCESS befinden. Außerdem ist es in einem einzelnen Draw/Dispatch-Aufruf ungültig, dass eine Anwendung über zwei separate UAV-Leistungsindikatoren auf denselben 32-Bit-Speicherspeicherort zugreift. 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 Indikatoren wird unterstützt.

Wenn ein Shader versucht, auf den Leistungsindikator eines UAV zuzugreifen, der keinen zugeordneten Leistungsindikator aufweist, gibt die Debugebene eine Warnung aus, und ein GPU-Seitenfehler tritt auf, der dazu führt, dass das Gerät der Apps entfernt wird.

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