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 Graphics Tools for Windows 10 Anniversary Update.
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 a risorse eliminate in uno shader.
- Convalida degli stati delle risorse alzati di livello e del decadimento dello stato della risorsa.
- Indicizzazione oltre la fine dell'heap del descrittore in uno shader.
- Accessi shader alle risorse in uno stato incompatibile.
- Uso di sampler non inizializzati o incompatibili in uno shader.
GBV funziona creando shader con patch che hanno la convalida aggiunta direttamente allo shader. Gli shader con patch controllano gli argomenti radice e le risorse a cui si accede 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 apportate allo stato della risorsa imposto dall'elenco di comandi nella sequenza temporale 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 le copie anche se il risultato finale non deve essere modificato. L'applicazione percepisce ancora questi sono elenchi di comandi COPY e il livello di debug li convaliderà come tale.
Attivazione della convalida basata su GPU
È possibile forzare GBV usando il Pannello di controllo DirectX (DXCPL) forzando il livello di debug Direct3D 12 e forzando anche la convalida basata su GPU (nuova scheda nel pannello di controllo). Una volta abilitato, GBV rimarrà abilitato fino al rilascio del dispositivo Direct3D 12. 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);
}
Utilizzo consigliato
In genere, è consigliabile eseguire il codice con il livello di debug abilitato per 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 pso) o durante il primo aggiornamento dell'applicazione per ridurre i problemi di prestazioni. Con contenuti più grandi è consigliabile attivare GBV su uno o due computer di test in un passaggio di test notturno.
Output di debug
GBV genera l'output di debug dopo una chiamata a ExecuteCommandLists completa l'esecuzione sulla GPU. Poiché si trova nella sequenza temporale gpu, l'output di debug può essere asincrono con altre convalide 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 di disegno/dispatch corrente e alle identità 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 è stato eseguito l'accesso a una risorsa denominata "Buffer colore principale" in uno shader come risorsa shader, ma che si trovava nello stato di accesso non ordinato quando lo shader è stato eseguito sulla GPU. Vengono fornite anche informazioni aggiuntive, ad esempio la posizione nell'origine dello shader, il nome dell'elenco dei comandi e il conteggio di disegno (Draw Index) e i nomi degli oggetti interfaccia D3D correlati.
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 del livello di debug
Per abilitare il livello di debug, chiamare EnableDebugLayer.
Per abilitare la convalida basata su GPU, chiamare SetEnableGPUBasedValidatione fare riferimento ai metodi delle interfacce seguenti:
Fare riferimento alle enumerazioni e alle strutture seguenti:
- 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