GPU-basierte Validierung und die Direct3D 12-Debugebene
In diesem Thema wird beschrieben, wie Sie die Direct3D 12-Debugebene optimal nutzen. Die GPU-basierte Validierung (GBV) ermöglicht Validierungsszenarien für die GPU-Zeitleiste, die bei 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 von höhergestuften Ressourcenzuständen und Ressourcenzustandsverfall.
- Indizierung über das Ende des Deskriptorheaps in einem Shader hinaus.
- Shaderzugriffe auf Ressourcen im inkompatiblen Zustand.
- Verwendung von nicht initialisierten oder inkompatiblen Samplern in einem Shader.
GBV erstellt gepatchte Shader, deren Validierung direkt zum Shader hinzugefügt wurde. Die gepatchten Shader untersuchen 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 Dispatch-Aufrufe in die Anwendungsbefehlslisten ein, um Änderungen am Ressourcenzustand zu überprüfen und nachzuverfolgen, die von der Befehlsliste für die GPU-Zeitleiste.
Da GBV die Fähigkeit zum Ausführen von Shadern erfordert, werden COPY-Befehlslisten von einer 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 erkennt weiterhin, dass es sich um COPY-Befehlslisten handelt, und die Debugebene überprüft sie als solche.
Aktivieren der GPU-basierten Validierung
GBV kann für die Verwendung des DirectX-Systemsteuerung (DXCPL) erzwungen werden, 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);
}
Empfohlene Verwendung
Im Allgemeinen sollten Sie Ihren Code mit aktivierter Debugebene ausführen. GbV kann jedoch einiges verlangsamen. Entwickler können die Aktivierung von GBV mit kleineren Datasets (z. B. Engine-Demos oder kleinen Spielebenen mit weniger PSO und Ressourcen) oder während der frühen Anwendungsanwendung in Betracht ziehen, um Leistungsprobleme zu reduzieren. Bei größerem Inhalt sollten Sie gbV auf einem oder zwei Testcomputern in einem nächtlichen Testdurchlauf aktivieren.
Debugausgabe
GBV erzeugt eine Debugausgabe, nachdem ein Aufruf von ExecuteCommandLists die Ausführung auf der GPU abgeschlossen hat. Da dies auf der GPU-Zeitleiste kann die Debugausgabe mit anderen CPU-Zeitleiste Validierungen asynchron sein. Anwendungsentwickler möchten möglicherweise ihre eigenen Wait-After-Execute-Vorgänge einfügen, um die Debugausgabe zu synchronisieren.
Die GBV-Ausgabe identifiziert, wo in einem Shader ein Fehler aufgetreten ist, zusammen mit der aktuellen Anzahl von Draw/Dispatch und identitäten von verwandten Objekten (z. B. Befehlsliste, Warteschlange, PSO usw.).
Beispiel für eine Debugmeldung
Die folgende Fehlermeldung gibt an, dass auf eine Ressource mit dem Namen "Hauptfarbpuffer" in einem Shader als Shaderressource zugegriffen wurde, sich jedoch im ungeordneten Zugriffszustand befand, wenn der Shader auf der GPU ausgeführt wurde. Zusätzliche Informationen, z. B. die Position in der Shaderquelle, der Name der Befehlsliste und die Draw-Anzahl (Draw Index) sowie die Namen der zugehörigen 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]
Debuggen von Layer-APIs
Um die Debugebene zu aktivieren, rufen Sie EnableDebugLayer auf.
Um die GPU-basierte Validierung zu aktivieren, rufen Sie SetEnableGPUBasedValidation auf, und verweisen Sie auf die Methoden der folgenden Schnittstellen:
Weitere Informationen finden Sie in den folgenden Enumerationen und Strukturen:
- 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