GPU-basierte Validierung und die Direct3D 12-Debugebene

In diesem Thema wird beschrieben, wie Sie die Direct3D 12-Debugebene optimal nutzen. Gpu-basierte Validierung (GBV) ermöglicht Validierungsszenarien auf der GPU-Zeitachse, die während API-Aufrufen der CPU nicht möglich sind. GBV ist ab den Grafiktools für Windows 10 Anniversary Update verfügbar.

Zweck der GPU-basierten Validierung

Die GPU-basierte Validierung hilft, die folgenden Fehler zu identifizieren:

  • Verwendung von nicht initialisierten oder inkompatiblen Deskriptoren in einem Shader.
  • Verwendung von Deskriptoren, die auf gelöschte Ressourcen in einem Shader verweisen.
  • Überprüfung der status- und zustandsverzerrenden Ressourcen.
  • Indizierung über das Ende des Deskriptorhaps hinaus in einem Shader.
  • Shaderzugriffe auf Ressourcen im inkompatiblen Zustand.
  • Verwendung von nicht initialisierten oder inkompatiblen Samplern in einem Shader.

GbV erstellt gepatchte Shader, deren Validierung dem Shader direkt hinzugefügt wurde. Die gepatchten Shader überprüfen Stammargumente und Ressourcen, auf die während der Shaderausführung zugegriffen wird, und melden Fehler an einen Protokollpuffer. GbV fügt auch zusätzliche Vorgänge und Dispatchaufrufe in die Anwendungsbefehlslisten ein, um Änderungen am Ressourcenzustand zu überprüfen und nachverfolgung, die von der Befehlsliste auf der GPU-Zeitachse vorgenommen werden.

Da GBV die Möglichkeit zum Ausführen von Shadern erfordert, werden COPY-Befehlslisten durch eine COMPUTE-Befehlsliste emuliert. Dies kann sich möglicherweise ändern, wie die Hardware Kopien ausführt, obwohl das Endergebnis nicht geändert werden sollte. Die Anwendung nimmt weiterhin an, dass es sich um COPY-Befehlslisten handelt, und die Debugebene überprüft sie als solche.

Aktivieren der GPU-basierten Überprüfung

GBV kann die Verwendung von DirectX Systemsteuerung (DXCPL) erzwingen, indem die Direct3D 12-Debugebene erzwungen und zusätzlich die GPU-basierte Validierung erzwungen wird (neue Registerkarte in der Systemsteuerung). Nach der Aktivierung bleibt gbv aktiviert, bis das Direct3D 12-Gerät freigegeben wird. Alternativ kann GBV vor dem Erstellen des Direct3D 12-Geräts programmgesteuert aktiviert werden:

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

Im Allgemeinen sollten Sie Ihren Code mit aktivierter Debugebene in den meisten Jahren ausführen. GbV kann dies jedoch deutlich verlangsamen. Entwickler können die Aktivierung von GBV mit kleineren Datensätzen (z. B. Engine-Demos oder kleine Spielebenen mit weniger PSOs und Ressourcen) oder während der frühen Anwendungsermöglichung in Betracht ziehen, um Leistungsprobleme zu reduzieren. Bei größeren Inhalten sollten Sie gbv auf einem oder zwei Testcomputern in einem nachts durchgeführten Testlauf aktivieren.

Debugausgabe

GBV erzeugt Debugausgabe, nachdem ein Aufruf von ExecuteCommandLists die Ausführung auf der GPU abgeschlossen hat. Da sich dies auf der GPU-Zeitachse befindet, kann die Debugausgabe mit einer anderen CPU-Zeitachsenüberprüfung asynchron sein. Anwendungsentwickler können ihre eigene Wait-after-Execute-Anweisung zum Synchronisieren der Debugausgabe injizieren.

Die GBV-Ausgabe gibt an, wo in einem Shader ein Fehler aufgetreten ist, zusammen mit der aktuellen Anzahl von Zeichnen/Dispatchs und den Identitäten verwandter Objekte (z. B. Befehlsliste, Warteschlange, PSO usw.).

Beispieldebugmeldung

Die folgende Fehlermeldung gibt an, dass auf eine Ressource mit dem Namen "Hauptfarbpuffer" in einem Shader als Shaderressource zugegriffen wurde, sich aber beim Ausführen des Shaders auf der GPU im ungeordneten Zugriffszustand hatte. Zusätzliche Informationen, z. B. die Position in der Shaderquelle, der Name der Befehlsliste und die Anzahl der Zeichnen (Draw Index) und die Namen verwandter D3D-Schnittstellenobjekte werden ebenfalls bereitgestellt.

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]

Debugebenen-APIs

Um die Debugebene zu aktivieren, rufen Sie EnableDebugLayer auf.

Um die GPU-basierte Validierung zu aktivieren, rufen Sie SetEnableGPUBasedValidationauf, und verweisen Sie auf die Methoden der folgenden Schnittstellen:

Weitere Informationen finden Sie in den folgenden Enumerationen und Strukturen: