Condividi tramite


Contatori UAV

È possibile usare contatori UAV (Unordered-Access-View) per associare un contatore atomico a 32 bit a un oggetto UAV (Unordered-Access-View).

Differenze nei contatori UAV da Direct3D 11 a Direct3D 12

Le app Direct3D 12 e le app Direct3D 11 usano entrambe le stesse funzioni shader HLSL (High Level Shader Language) per accedere ai contatori UAV.

  • IncrementCounter
  • DecrementCounter
  • Append
  • Utilizzo

Direct3D 12

In Direct3D 12 i valori a 32 bit vengono allocati dall'applicazione, quindi i valori a 32 bit possono essere letti e scritti dalla CPU o dalla GPU, esattamente come qualsiasi altra risorsa Direct3D 12.

Direct3D 11

All'esterno degli shader, con Direct3D 11 è necessario chiamare i metodi API per accedere ai contatori, ad esempio ID3D11DeviceContext::CopyStructureCount.

Uso dei contatori UAV

L'app è responsabile dell'allocazione di 32 bit di archiviazione per i contatori UAV. Questa risorsa di archiviazione può essere allocata in una risorsa diversa, come quella che contiene i dati accessibili tramite l'UAV.

Fare riferimento a CreateUnorderedAccessView, D3D12_BUFFER_UAV_FLAGS e D3D12_BUFFER_UAV.

Se pCounterResource viene specificato nella chiamata a CreateUnorderedAccessView, è presente un contatore associato all'UAV. In questo caso:

  • StructureByteStride deve essere maggiore di zero
  • Il formato deve essere DXGI_FORMAT_UNKNOWN
  • Il flag RAW non deve essere impostato
  • Entrambe le risorse devono essere buffer
  • CounterOffsetInBytes deve essere un multiplo di 4 byte
  • CounterOffsetInBytes deve essere compreso nell'intervallo della risorsa contatore
  • pDesc non può essere NULL
  • pResource non può essere NULL

Si notino i casi d'uso seguenti:

  • Se pCounterResource non è specificato, CounterOffsetInBytes deve essere 0.
  • Se il flag RAW è impostato, il formato deve essere DXGI_FORMAT_R32_TYPELESS e la risorsa UAV deve essere un buffer.
  • Se pCounterResource non è impostato, CounterOffsetInBytes deve essere 0.
  • Se il flag RAW non è impostato e StructureByteStride = 0, il formato deve essere un formato UAV valido.

Direct3D 12 rimuove la distinzione tra UAV di accodamento e contatore (anche se la distinzione esiste ancora nel bytecode HLSL).

Il runtime di base convaliderà queste restrizioni all'interno di CreateUnorderedAccessView.

Durante draw/dispatch, la risorsa contatore deve trovarsi nello stato D3D12_RESOURCE_STATE_UNORDERED_ACCESS. Inoltre, all'interno di una singola chiamata Draw/Dispatch, non è possibile che un'applicazione acceda alla stessa posizione di memoria a 32 bit tramite due contatori UAV separati. Il livello di debug genererà errori se viene rilevato uno di questi.

Non sono disponibili metodi "SetUnorderedAccessViewCounterValue" o "CopyStructureCount" perché le app possono semplicemente copiare dati da e verso il valore del contatore direttamente.

È supportata l'indicizzazione dinamica di UAV con contatori.

Se uno shader tenta di accedere al contatore di un UAV che non dispone di un contatore associato, il livello di debug genererà un avviso e si verificherà un errore di pagina GPU che causa la rimozione del dispositivo delle app.

I contatori UAV sono supportati in tutti i tipi di heap (impostazione predefinita, caricamento, readback).