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);
}
Uso recomendado
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:
- D3D12_DEBUG_COMMAND_LIST_PARAMETER_TYPE
- D3D12_DEBUG_DEVICE_PARAMETER_TYPE
- D3D12_GPU_BASED_VALIDATION_PIPELINE_STATE_CREATE_FLAGS
- D3D12_GPU_BASED_VALIDATION_SHADER_PATCH_MODE
- D3D12_DEBUG_COMMAND_LIST_GPU_BASED_VALIDATION_SETTINGS
- D3D12_DEBUG_DEVICE_GPU_BASED_VALIDATION_SETTINGS