Partilhar via


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

Este tópico descreve como fazer melhor uso da camada de depuração do Direct3D 12. A validação baseada em GPU (GBV) permite cenários de validação na linha do tempo da GPU que não são possíveis durante chamadas de API na CPU. O GBV está disponível a partir da Atualização de Aniversário das Ferramentas Gráficas para 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 referenciando Recursos excluídos em um sombreador.
  • Validação de estados de recursos promovidos e decaimento de estados de recursos.
  • Indexação além do final da pilha do descritor em um sombreador.
  • Acessos sombreados de recursos em estado incompatível.
  • Uso de amostradores 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 argumentos raiz e recursos acessados durante a execução do sombreador e relatam erros para um buffer de log. O GBV também injeta operações extras e chamadas de despacho 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 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 potencialmente alterar a forma como o hardware executa cópias, embora o resultado final não deva ser alterado. O aplicativo ainda perceberá que essas 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 do DirectX (DXCPL) forçando a Camada de Depuração do Direct3D 12 e, adicionalmente, forçando a validação baseada em GPU (nova guia no painel de controle). Uma vez habilitado, o GBV permanecerá habilitado até que o dispositivo Direct3D 12 seja lançado. Como alternativa, o GBV pode ser ativado 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);
}

Geralmente, você deve executar seu código com a camada de depuração ativada na maioria das vezes. No entanto, o GBV pode atrasar muito as coisas. Os desenvolvedores podem considerar habilitar o GBV com conjuntos de dados menores (por exemplo, demonstrações do mecanismo ou níveis de jogos pequenos com menos PSOs e recursos) ou durante a criação inicial de aplicativos para reduzir problemas de desempenho. Com conteúdo maior, considere ativar o GBV em uma ou duas máquinas de teste em um teste noturno.

Saída de depuração

GBV produz saída de depuração após uma chamada para ExecuteCommandLists conclui a execução na GPU. Como isso está na linha do tempo da 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 seu próprio wait-after-execute para sincronizar a saída de depuração.

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

Exemplo de mensagem de depuração

A seguinte mensagem de erro indica que um recurso chamado "Main Color Buffer" 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 fonte do sombreador, o nome da lista de comandos e a contagem de Draw (Draw Index) 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 da 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: