Condividi tramite


Convalida basata su GPU e livello di debug Direct3D 12

Questo argomento descrive come usare al meglio il livello di debug Direct3D 12. La convalida basata su GPU (GBV) consente scenari di convalida nella sequenza temporale della GPU che non sono possibili durante le chiamate API sulla CPU. GBV è disponibile a partire da Strumenti grafici per Windows 10 aggiornamento dell'anniversario.

Scopo della convalida basata su GPU

La convalida basata su GPU consente di identificare gli errori seguenti:

  • Uso di descrittori non inizializzati o incompatibili in uno shader.
  • Uso dei descrittori che fanno riferimento alle risorse eliminate in uno shader.
  • Convalida degli stati delle risorse promossi e del decadimento dello stato delle risorse.
  • Indicizzazione oltre la fine dell'heap descrittore in uno shader.
  • Shader accede alle risorse nello stato incompatibile.
  • Uso di sampler non inizializzati o incompatibili in uno shader.

GBV funziona creando shader con patch che hanno aggiunto la convalida direttamente al shader. Gli shader con patch controllano gli argomenti radice e le risorse accessibili durante l'esecuzione dello shader e segnalano errori a un buffer di log. GBV inserisce anche operazioni aggiuntive e chiamate Dispatch negli elenchi di comandi dell'applicazione per convalidare e tenere traccia delle modifiche allo stato della risorsa imposto dall'elenco di comandi nella sequenza temporale della GPU.

Poiché GBV richiede la possibilità di eseguire shader, gli elenchi di comandi COPY vengono emulati da un elenco di comandi COMPUTE. Ciò può potenzialmente cambiare il modo in cui l'hardware esegue copie anche se il risultato finale non deve essere modificato. L'applicazione percepisce comunque questi sono elenchi di comandi COPY e il livello di debug li convalida come tale.

Attivazione della convalida basata su GPU

GBV può essere forzato a usare DirectX Pannello di controllo (DXCPL) forzando il livello di debug Direct3D 12 e forzando inoltre la convalida basata su GPU (nuova scheda nel pannello di controllo). Una volta abilitato, GBV rimarrà abilitato fino a quando il dispositivo Direct3D 12 non viene rilasciato. In alternativa, GBV può essere abilitato a livello di codice prima di creare il 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);
}

In genere, è consigliabile eseguire il codice con il livello di debug abilitato la maggior parte del tempo. Tuttavia, GBV può rallentare molto. Gli sviluppatori possono prendere in considerazione l'abilitazione di GBV con set di dati più piccoli (ad esempio, demo del motore o livelli di gioco di piccole dimensioni con un minor numero di risorse e risorse di PSO) o durante il primo aggiornamento dell'applicazione per ridurre i problemi di prestazioni. Con contenuti più grandi considerano l'attivazione di GBV su uno o due computer di test in un passaggio di test notturno.

Output di debug

GBV produce l'output di debug dopo una chiamata a ExecuteCommandLists completa l'esecuzione nella GPU. Poiché si trova nella sequenza temporale della GPU, l'output di debug può essere asincrono con altre convalida della sequenza temporale della CPU. Gli sviluppatori di applicazioni possono voler inserire la propria attesa dopo l'esecuzione per sincronizzare l'output di debug.

L'output GBV identifica dove si è verificato un errore in uno shader, insieme al conteggio e alle identità correnti degli oggetti correlati(ad esempio elenco di comandi, coda, PSO e così via).

Messaggio di debug di esempio

Il messaggio di errore seguente indica che una risorsa denominata "Main Color Buffer" è stata accessibile in una risorsa shader come risorsa shader, ma era nello stato di accesso non ordinato quando lo shader è stato eseguito sulla GPU. Altre informazioni, ad esempio la posizione nell'origine shader, il nome dell'elenco dei comandi e il conteggio Di disegno (Indice di disegno) e i nomi degli oggetti interfaccia D3D correlati vengono forniti anche.

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]

API livello di debug

Per abilitare il livello di debug, chiamare EnableDebugLayer.

Per abilitare la convalida basata su GPU, chiamare SetEnableGPUBasedValidation e fare riferimento ai metodi delle interfacce seguenti:

Fare riferimento alle enumerazioni e alle strutture seguenti: