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