Compartilhar via


Validação baseada em GPU e a camada de depuração do Direct3D 12

Este tópico descreve como fazer o melhor uso da Camada de Depuração do Direct3D 12. A GBV (validação baseada em GPU) permite cenários de validação na GPU linha do tempo que não são possíveis durante chamadas à API na CPU. O GBV está disponível a partir das Ferramentas Gráficas para Windows 10 Atualização de Aniversário.

Finalidade da validação baseada em GPU

A validação baseada em GPU ajuda a identificar os seguintes erros:

  • Uso de descritores não inicializados ou incompatíveis em um sombreador.
  • Uso de descritores que fazem referência a Recursos excluídos em um sombreador.
  • Validação de estados de recursos promovidos e decaimento do estado do recurso.
  • Indexação além do final do heap do descritor em um sombreador.
  • O sombreador acessa recursos em estado incompatível.
  • Uso de samplers não inicializados ou incompatíveis em um sombreador.

O GBV funciona criando sombreadores corrigidos que têm validação adicionada diretamente ao sombreador. Os sombreadores corrigidos inspecionam os argumentos raiz e os recursos acessados durante a execução do sombreador e relatam erros a um buffer de log. O GBV também injeta operações extras e chamadas de expedição nas listas de comandos do aplicativo para validar e controlar as alterações no estado do recurso impostas pela lista de comandos na linha do tempo gpu.

Como o GBV requer a capacidade de executar sombreadores, as listas de comandos COPY são emuladas por uma lista de comandos COMPUTE. Isso pode alterar potencialmente a forma como o hardware executa cópias, embora o resultado final não deva ser alterado. O aplicativo ainda perceberá que são listas de comandos COPY e a camada de depuração as validará como tal.

Ativando a validação baseada em GPU

O GBV pode ser forçado a usar o Painel de Controle DirectX (DXCPL) forçando a Camada de Depuração do Direct3D 12 e forçando a validação baseada em GPU (nova guia no painel de controle). Depois de habilitado, o GBV permanecerá habilitado até que o dispositivo Direct3D 12 seja liberado. Como alternativa, o GBV pode ser habilitado programaticamente antes de criar o dispositivo Direct3D 12:

void EnableShaderBasedValidation()
{
    CComPtr<ID3D12Debug> spDebugController0;
    CComPtr<ID3D12Debug1> spDebugController1;
    VERIFY(D3D12GetDebugInterface(IID_PPV_ARGS(&spDebugController0)));
    VERIFY(spDebugController0->QueryInterface(IID_PPV_ARGS(&spDebugController1)));
    spDebugController1->SetEnableGPUBasedValidation(true);
}

Em geral, você deve executar seu código com a camada de depuração habilitada na maior parte do tempo. No entanto, o GBV pode diminuir muito as coisas. Os desenvolvedores podem considerar habilitar o GBV com conjuntos de dados menores (por exemplo, demonstrações de mecanismo ou pequenos níveis de jogos com menos PSOs e recursos) ou durante a inicialização do aplicativo para reduzir problemas de desempenho. Com conteúdo maior, considere ativar o GBV em um ou dois computadores de teste em uma passagem de teste noturna.

Saída de depuração

O GBV produz a saída de depuração depois que uma chamada para ExecuteCommandLists conclui a execução na GPU. Como isso está na gpu-linha do tempo a saída de depuração pode ser assíncrona com outra validação linha do tempo CPU. Os desenvolvedores de aplicativos podem querer injetar sua própria espera após a execução para sincronizar a saída de depuração.

A saída GBV identifica onde ocorreu um erro em um sombreador, juntamente com a contagem atual de desenho/expedição e identidades de objetos relacionados (por exemplo, lista de comandos, fila, PSO etc.).

Exemplo de mensagem de depuração

A mensagem de erro a seguir indica que um recurso chamado "Buffer de Cor Principal" foi acessado em um sombreador como um recurso de sombreador, mas estava no estado de acesso não ordenado quando o sombreador foi executado na GPU. Informações adicionais, como o local na origem do sombreador, o nome da lista de comandos e a contagem de desenho (Índice de Desenho) e os nomes dos objetos de interface D3D relacionados também são fornecidos.

D3D12 ERROR: Incompatible resource state: Resource: 0x0000016F61A6EA80:'Main Color Buffer', 
Subresource Index: [0], 
Descriptor heap index: [0], 
Binding Type In Descriptor: SRV, 
Resource State: D3D12_RESOURCE_STATE_UNORDERED_ACCESS(0x8), 
Shader Stage: PIXEL, 
Root Parameter Index: [0], 
Draw Index: [0], 
Shader Code: E:\FileShare\MiniEngine_GitHub_160128\MiniEngine_GitHub\Core\Shaders\SharpeningUpsamplePS.hlsl(37,2-59), 
Asm Instruction Range: [0x138-0x16b], 
Asm Operand Index: [3], 
Command List: 0x0000016F6F75F740:'CommandList', SRV/UAV/CBV Descriptor Heap: 0x0000016F6F76F280:'Unnamed ID3D12DescriptorHeap Object', 
Sampler Descriptor Heap: <not set>, 
Pipeline State: 0x0000016F572C89F0:'Unnamed ID3D12PipelineState Object',  
[ EXECUTION ERROR #942: GPU_BASED_VALIDATION_INCOMPATIBLE_RESOURCE_STATE]

APIs de camada de depuração

Para habilitar a camada de depuração, chame EnableDebugLayer.

Para habilitar a validação baseada em GPU, chame SetEnableGPUBasedValidation e consulte os métodos das seguintes interfaces:

Consulte as seguintes enumerações e estruturas: