Dela via


GPU-baserad validering och Direct3D 12-felsökningsskiktet

I det här avsnittet beskrivs hur du använder Direct3D 12-felsökningsskiktet på bästa sätt. GPU-baserad validering (GBV) möjliggör valideringsscenarier på GPU-tidslinjen som inte är möjliga under API-anrop på processorn. GBV är tillgängligt från och med Grafikverktyg för Windows 10 Anniversary Update.

Syftet med GPU-baserad validering

GPU-baserad validering hjälper till att identifiera följande fel:

  • Användning av icke-initierade eller inkompatibla deskriptorer i en skuggning.
  • Användning av deskriptorer som refererar till borttagna resurser i en skuggning.
  • Validering av upphöjda resurstillstånd och resurstillståndsförfall.
  • Indexering bortom slutet av beskrivningshögen i en skuggning.
  • Skuggningsåtkomster för resurser i inkompatibelt tillstånd.
  • Användning av icke-initierade eller inkompatibla samplers i en skuggning.

GBV fungerar genom att skapa korrigerade skuggningar som har validering lagts till direkt i skuggningen. De korrigerade skuggningarna inspekterar rotargument och resurser som används vid skuggningskörning och rapporterar fel till en loggbuffert. GBV matar också in extra åtgärder och Dispatch-anrop till programkommandolistorna för att verifiera och spåra ändringar i resurstillståndet som införts av kommandolistan på GPU-tidslinjen.

Eftersom GBV kräver möjligheten att köra skuggningar emuleras COPY-kommandolistor av en COMPUTE-kommandolista. Detta kan eventuellt ändra hur maskinvara utför kopior, men slutresultatet bör inte ändras. Programmet kommer fortfarande att uppfatta att dessa är COPY-kommandolistor och felsökningsskiktet validerar dem som sådana.

Aktivera GPU-baserad validering

GBV kan tvingas att använda DirectX-kontrollpanelen (DXCPL) genom att tvinga på Direct3D 12-felsökningsskiktet och dessutom tvinga på GPU-baserad validering (ny flik i kontrollpanelen). När det är aktiverat förblir GBV aktiverat tills Direct3D 12-enheten släpps. Alternativt kan GBV aktiveras programmatiskt innan du skapar Direct3D 12-enheten:

void EnableShaderBasedValidation()
{
    CComPtr<ID3D12Debug> spDebugController0;
    CComPtr<ID3D12Debug1> spDebugController1;
    VERIFY(D3D12GetDebugInterface(IID_PPV_ARGS(&spDebugController0)));
    VERIFY(spDebugController0->QueryInterface(IID_PPV_ARGS(&spDebugController1)));
    spDebugController1->SetEnableGPUBasedValidation(true);
}

I allmänhet bör du köra koden med felsökningsskiktet aktiverat för det mesta. GBV kan dock göra saker långsammare. Utvecklare kan överväga att aktivera GBV med mindre datamängder (till exempel motordemonstrationer eller små spelnivåer med färre PSO:er och resurser) eller under tidig programuppgradering för att minska prestandaproblemen. Med större innehåll kan du överväga att aktivera GBV på en eller två testdatorer i ett nattligt testpass.

Felsöka utdata

GBV genererar felsökningsutdata efter ett anrop till ExecuteCommandLists slutför körningen på GPU:n. Eftersom detta finns på GPU-tidslinjen kan felsökningsutdata vara asynkrona med annan validering av CPU-tidslinje. Programutvecklare kanske vill mata in sin egen vänta-efter-körning för att synkronisera felsökningsutdata.

GBV-utdata identifierar var i en skuggning ett fel uppstod, tillsammans med aktuellt antal rita/skicka och identiteter för relaterade objekt (t.ex. kommandolista, kö, PSO osv.).

Exempel på felsökningsmeddelande

Följande felmeddelande anger att en resurs med namnet "Huvudfärgbuffert" användes i en skuggning som en skuggningsresurs men var i osorterat åtkomsttillstånd när skuggningen kördes på GPU:n. Ytterligare information, till exempel platsen i skuggningskällan, namnet på kommandolistan och antal ritade objekt (rita index) och namnen på relaterade D3D-gränssnittsobjekt tillhandahålls också.

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]

Felsöka Layer-API:er

Om du vill aktivera felsökningsskiktet anropar du EnableDebugLayer.

Om du vill aktivera GPU-baserad validering anropar du SetEnableGPUBasedValidationoch refererar till metoderna i följande gränssnitt:

Se följande uppräkningar och strukturer: