Contadores de UAV
Você pode usar contadores de visualização de acesso não ordenado (UAV) para associar um contador atômico de 32 bits a uma exibição de acesso não ordenado (UAV).
Diferenças nos contadores de UAV do Direct3D 11 para o Direct3D 12
Os aplicativos Direct3D 12 e Direct3D 11 usam as mesmas funções de sombreador HLSL (High-Level Shader Language) para acessar os contadores de UAV.
- IncrementCounter
- DecrementCounter
- Apêndice
- Consumir
Direct3D 12
No Direct3D 12, os valores de 32 bits são alocados pelo aplicativo, de modo que os valores de 32 bits podem 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 de UAV
Seu aplicativo é responsável por alocar 32 bits de armazenamento para contadores de UAV. Este armazenamento pode ser alocado em um recurso diferente daquele que contém dados acessíveis através do UAV.
Consulte CreateUnorderedAccessView, D3D12_BUFFER_UAV_FLAGS e D3D12_BUFFER_UAV.
Se pCounterResource for especificado na chamada para CreateUnorderedAccessView , então há um contador associado ao UAV. Neste 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 amortecedores
- CounterOffsetInBytes deve ser um múltiplo de 4 bytes
- CounterOffsetInBytes deve estar dentro do intervalo do recurso do 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 deve ser DXGI_FORMAT_R32_TYPELESS e o recurso UAV deve 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 apêndice e contador (embora a distinção ainda exista no bytecode HLSL).
O tempo de execução principal validará essas restrições dentro de CreateUnorderedAccessView.
Durante o Draw/Dispatch, o recurso do contador deve estar no estado D3D12_RESOURCE_STATE_UNORDERED_ACCESS. Além disso, dentro de uma única chamada de Draw/Dispatch, é inválido para um aplicativo acessar o mesmo local de memória de 32 bits por meio de dois contadores de UAV separados. A camada de depuração emitirá erros se qualquer um deles for detetado.
Não há métodos "SetUnorderedAccessViewCounterValue" ou "CopyStructureCount" porque os aplicativos podem simplesmente copiar dados de e para o valor do contador diretamente.
A indexação dinâmica de UAVs com contadores é suportada.
Se um sombreador tentar acessar o contador de um UAV que não tenha um contador associado, a camada de depuração emitirá um aviso e ocorrerá uma falha na página da GPU fazendo com que o dispositivo dos aplicativos seja removido.
Contadores de UAV são suportados em todos os tipos de heap (padrão, upload, readback).