Sdílet prostřednictvím


Ověřování založené na GPU a vrstva ladění Direct3D 12

Toto téma popisuje, jak nejlépe využít vrstvu ladění Direct3D 12. Ověřování na základě GPU (GBV) umožňuje scénáře ověřování na časové ose GPU, které nejsou možné během volání rozhraní API procesoru. GbV je k dispozici od grafických nástrojů pro Windows 10 Anniversary Update.

Účel ověřování založeného na GPU

Ověřování na základě GPU pomáhá identifikovat následující chyby:

  • Použití neinicializovaných nebo nekompatibilních popisovačů v shaderu
  • Použití popisovačů odkazujících na odstraněné prostředky v shaderu
  • Ověření povýšených stavů prostředků a rozpadu stavu prostředků
  • Indexování za koncem haldy popisovače v shaderu
  • Shader přistupuje k prostředkům v nekompatibilním stavu.
  • Použití neinicializovaných nebo nekompatibilních vzorkovníků ve shaderu

GBV funguje vytvořením opravovaných shaderů, které se přidaly přímo do shaderu. Opravené shadery kontrolují kořenové argumenty a prostředky, ke které se přistupuje během spouštění shaderu, a hlásí chyby do vyrovnávací paměti protokolu. GBV také vloží do seznamů příkazů aplikace další operace a volání Dispatch, které ověří a sleduje změny stavu prostředků uložené seznamem příkazů na časové ose GPU.

Vzhledem k tomu, že GBV vyžaduje schopnost spouštět shadery, seznam příkazů COPY je emulován seznamem příkazů COMPUTE. To může potenciálně změnit způsob, jakým hardware provádí kopie, i když by se neměl změnit konečný výsledek. Aplikace bude stále vnímat, že jde o seznamy příkazů COPY a ladicí vrstva je jako taková ověří.

Zapnutí ověřování založeného na GPU

GbV je možné vynutit použití ovládacího panelu DirectX (DXCPL) vynucením ladění vrstvy Direct3D 12 a dalším vynucením ověřování na základě GPU (nová karta v ovládacích panelech). Po povolení zůstane GBV povolená, dokud nebude vydáno zařízení Direct3D 12. Případně můžete GBV povolit programově před vytvořením zařízení 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);
}

Obecně byste měli kód spouštět s ladicí vrstvou povolenou většinu času. GBV ale může hodně zpomalit. Vývojáři můžou zvážit povolení GBV s menšími datovými sadami (například ukázky motoru nebo malé herní úrovně s menším počtem psO a prostředků) nebo při počátečním spuštění aplikace, aby se snížily problémy s výkonem. U většího obsahu zvažte zapnutí GBV na jednom nebo dvou testovacích počítačích v nočním testu.

Ladění výstupu

GBV vytvoří ladicí výstup po volání ExecuteCommandLists dokončení provádění na GPU. Vzhledem k tomu, že se jedná o časovou osu GPU, může být výstup ladění asynchronní s jiným ověřením časové osy procesoru. Vývojáři aplikací můžou chtít vložit vlastní čekání po spuštění, aby synchronizovali výstup ladění.

Výstup GBV identifikuje, kde v shaderu došlo k chybě, spolu s aktuálním počtem objektů kreslení/odeslání a identitami souvisejících objektů (např. seznam příkazů, fronta, PSO atd.).

Příklad zprávy ladění

Následující chybová zpráva značí, že k prostředku s názvem Hlavní barva vyrovnávací paměti byl přístup v shaderu jako prostředek shaderu, ale byl v neuspořádaném stavu přístupu při spuštění shaderu na GPU. K dispozici jsou také další informace, například umístění ve zdroji shaderu, název seznamu příkazů a počet kreslení (Index kreslení) a názvy souvisejících objektů rozhraní D3D.

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]

Ladění rozhraní API vrstvy

Chcete-li povolit vrstvu ladění, zavolejte EnableDebugLayer.

Pokud chcete povolit ověřování založené na GPU, zavolejte SetEnableGPUBasedValidationa projděte si metody následujících rozhraní:

Projděte si následující výčty a struktury: