Compartilhar via


Validação baseada em GPU e a camada de depuração 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 linha do tempo de GPU que não são possíveis durante as chamadas à API na CPU. O GBV está disponível a partir das Ferramentas Gráficas para Atualização de Aniversário do Windows 10.

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 decadência do estado do recurso.
  • Indexação além do final do heap do descritor em um sombreador.
  • Acessos de sombreador de 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 a 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 em 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 acompanhar as alterações no estado do recurso impostas pela lista de comandos na linha do tempo da 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.

Ativar 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 direct3D 12 e forçando adicionalmente 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 jogo com menos PSO 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 um teste noturno.

Saída de depuração

O GBV produz a saída de depuração após uma chamada para ExecuteCommandLists concluir a execução na GPU. Como isso está na linha do tempo de GPU, a saída de depuração pode ser assíncrona com outra validação da linha do tempo da CPU. Os desenvolvedores de aplicativos podem querer injetar seus próprios wait-after-execute 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 SetEnableGPUBasedValidatione consulte os métodos das seguintes interfaces:

Consulte as seguintes enumerações e estruturas: