Condividi tramite


Contatori UAV

È possibile usare contatori UAV (Unordered-Access-View) per associare un contatore atomico a 32 bit a un 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
  • Utilizzare

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, proprio 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 il 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 non si specifica pCounterResource, 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. Se viene rilevato uno di questi errori, il livello di debug genererà errori.

Non esistono metodi "SetUnorderedAccessViewCounterValue" o "CopyStructureCount" perché le app possono semplicemente copiare i dati direttamente dal valore del contatore.

L'indicizzazione dinamica di UAV con contatori è supportata.

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).