Contadores de UAV
Você pode usar contadores UAV (unordered-access-view) para associar um contador atômico de 32 bits a um UAV (modo de exibição de acesso não ordenado).
Diferenças nos contadores UAV do Direct3D 11 para o Direct3D 12
Os aplicativos Direct3D 12 e Direct3D 11 usam as mesmas funções de sombreador HLSL (linguagem de sombreador de alto nível) para acessar os contadores UAV.
- IncrementCounter
- DecrementCounter
- Acrescentar
- Consumir
Direct3D 12
No Direct3D 12, os valores de 32 bits são alocados pelo aplicativo, para que os valores de 32 bits possam ser lidos e gravados pela CPU ou pela GPU, assim como qualquer outro recurso do Direct3D 12.
Direct3D 11
Fora dos sombreadores, com o Direct3D 11, você precisa chamar métodos de API para acessar os contadores (por exemplo, ID3D11DeviceContext::CopyStructureCount).
Usando contadores UAV
Seu aplicativo é responsável por alocar 32 bits de armazenamento para contadores UAV. Esse armazenamento pode ser alocado em um recurso diferente daquele que contém dados acessíveis por meio do UAV.
Consulte CreateUnorderedAccessView, D3D12_BUFFER_UAV_FLAGS e D3D12_BUFFER_UAV.
Se pCounterResource for especificado na chamada para CreateUnorderedAccessView, haverá um contador associado ao UAV. Nesse caso:
- StructureByteStride deve ser maior que zero
- O formato deve ser DXGI_FORMAT_UNKNOWN
- O sinalizador RAW não deve ser definido
- Ambos os recursos devem ser buffers
- CounterOffsetInBytes deve ser um múltiplo de 4 bytes
- CounterOffsetInBytes deve estar dentro do intervalo do recurso de contador
- pDesc não pode ser NULL
- pResource não pode ser NULL
E observe os seguintes casos de uso:
- Se pCounterResource não for especificado, CounterOffsetInBytes deverá ser 0.
- Se o sinalizador RAW estiver definido, o formato deverá ser DXGI_FORMAT_R32_TYPELESS e o recurso UAV deverá ser um buffer.
- Se pCounterResource não estiver definido, CounterOffsetInBytes deverá ser 0.
- Se o sinalizador RAW não estiver definido e StructureByteStride = 0, o formato deverá ser um formato UAV válido.
O Direct3D 12 remove a distinção entre UAVs de acréscimo e contador (embora a distinção ainda exista no código de bytes HLSL).
O runtime principal validará essas restrições dentro de CreateUnorderedAccessView.
Durante o Desenho/Expedição, o recurso de contador deve estar no estado D3D12_RESOURCE_STATE_UNORDERED_ACCESS. Além disso, em uma única chamada de Desenho/Expedição, é inválido que um aplicativo acesse o mesmo local de memória de 32 bits por meio de dois contadores UAV separados. A camada de depuração emitirá erros se um deles for detectado.
Não há métodos "SetUnorderedAccessViewCounterValue" ou "CopyStructureCount", pois os aplicativos podem simplesmente copiar dados diretamente de e para o valor do contador.
Há suporte para a indexação dinâmica de UAVs com contadores.
Se um sombreador tentar acessar o contador de um UAV que não tem um contador associado, a camada de depuração emitirá um aviso e uma falha de página de GPU ocorrerá fazendo com que o dispositivo dos aplicativos seja removido.
Há suporte para contadores UAV em todos os tipos de heap (padrão, upload, readback).