Delen via


Validatie op basis van GPU en de Direct3D 12-foutopsporingslaag

In dit onderwerp wordt beschreven hoe u de Direct3D 12-foutopsporingslaag het beste kunt gebruiken. Validatie op basis van GPU (GBV) maakt validatiescenario's mogelijk op de GPU-tijdlijn die niet mogelijk zijn tijdens API-aanroepen op de CPU. GBV is beschikbaar vanaf de Graphics Tools voor Windows 10 Jubileumupdate.

Doel van validatie op basis van GPU

Validatie op basis van GPU helpt bij het identificeren van de volgende fouten:

  • Gebruik van niet-geïnitialiseerde of niet-compatibele descriptors in een shader.
  • Gebruik van descriptors die verwijzen naar verwijderde resources in een shader.
  • Validatie van gepromoveerde resourcestatussen en verval van resourcestatussen.
  • Indexeren buiten het einde van de descriptor heap in een shader.
  • Shader heeft toegang tot resources met een niet-compatibele status.
  • Gebruik van niet-geïnitialiseerde of incompatibele samplers in een shader.

GBV werkt door patched shaders te maken die rechtstreeks aan de shader zijn toegevoegd. De patched shaders inspecteren de hoofdargumenten en resources die worden geopend tijdens de uitvoering van de shader en rapporteren fouten aan een logboekbuffer. GBV injecteert ook extra bewerkingen en Dispatch-aanroepen in de lijst met toepassingsopdrachten om wijzigingen in de resourcestatus te valideren en bij te houden die door de opdrachtlijst op de GPU-tijdlijn worden opgelegd.

Omdat GBV de mogelijkheid nodig heeft om shaders uit te voeren, worden copy-opdrachtlijsten geëmuleerd door een COMPUTE-opdrachtlijst. Dit kan mogelijk wijzigen hoe hardware kopieën uitvoert, hoewel het eindresultaat niet mag worden gewijzigd. De toepassing ziet nog steeds dat dit COPY-opdrachtlijsten zijn en de foutopsporingslaag valideert ze als zodanig.

Validatie op basis van GPU inschakelen

GBV kan worden gedwongen met behulp van het DirectX Control Panel (DXCPL) door af te dwingen op de Direct3D 12 Debug Layer en daarnaast afdwingen van validatie op basis van GPU (nieuw tabblad in het configuratiescherm). Zodra dit is ingeschakeld, blijft GBV ingeschakeld totdat het Direct3D 12-apparaat wordt vrijgegeven. U kunt GBV ook programmatisch inschakelen voordat u het Direct3D 12-apparaat maakt:

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

Over het algemeen moet u uw code uitvoeren waarbij de foutopsporingslaag meestal is ingeschakeld. GBV kan echter veel vertragen. Ontwikkelaars kunnen overwegen GBV in te schakelen met kleinere gegevenssets (bijvoorbeeld enginedemo's of kleine gameniveaus met minder PSO's en resources) of tijdens een vroege toepassing om prestatieproblemen te verminderen. Met grotere inhoud kunt u GBV inschakelen op een of twee testmachines in een nachttestpas.

Uitvoer voor foutopsporing

GBV produceert foutopsporingsuitvoer nadat een aanroep naar ExecuteCommandLists de uitvoering van de GPU voltooit. Omdat dit op de GPU-tijdlijn staat, kan de foutopsporingsuitvoer asynchroon zijn met andere VALIDATIE van CPU-tijdlijnen. Toepassingsontwikkelaars willen mogelijk hun eigen wait-after-execute injecteren om foutopsporingsuitvoer te synchroniseren.

GBV-uitvoer geeft aan waar in een shader een fout is opgetreden, samen met het huidige aantal tekenen/verzenden en identiteiten van gerelateerde objecten (bijvoorbeeld opdrachtlijst, wachtrij, PSO, enzovoort).

Voorbeeld van foutopsporingsbericht

Het volgende foutbericht geeft aan dat een resource met de naam 'Hoofdkleurbuffer' is geopend in een shader als arceringsresource, maar zich in de niet-geordende toegangsstatus bevond toen de shader werd uitgevoerd op de GPU. Aanvullende informatie, zoals de locatie in de arceringsbron, de naam van de opdrachtlijst en het aantal tekenen (Tekenindex) en de namen van gerelateerde D3D-interfaceobjecten worden ook verstrekt.

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]

Foutopsporing van laag-API's

Als u de foutopsporingslaag wilt inschakelen, roept u EnableDebugLayer-aan.

Als u validatie op basis van GPU wilt inschakelen, roept u SetEnableGPUBasedValidationaan en raadpleegt u de methoden van de volgende interfaces:

Raadpleeg de volgende opsommingen en structuren: