GPU-basierte Überprüfung und die Direct3D 12-Debugebene
In diesem Thema wird beschrieben, wie Sie die Direct3D 12-Debugebene optimal nutzen. GPU-basierte Überprüfung (GBV) ermöglicht Validierungsszenarien auf der GPU-Zeitachse, die während API-Aufrufen der CPU nicht möglich sind. GBV ist ab dem Windows 10 Anniversary Update mit den Grafiktools verfügbar.
Zweck der GPU-basierten Überprüfung
Die GPU-basierte Überprüfung hilft bei der Identifizierung der folgenden Fehler:
- Verwendung nicht initialisierter oder inkompatibler Deskriptoren in einem Shader.
- Verwendung von Deskriptoren, die auf gelöschte Ressourcen in einem Shader verweisen.
- Validierung höhergestufter Ressourcenzustände und Ressourcenzustandsverfall.
- Indizierung über das Ende des Deskriptor-Heaps in einem Shader hinaus.
- Shader greift auf Ressourcen im inkompatiblen Zustand zu.
- Verwendung von nicht initialisierten oder inkompatiblen Samplern in einem Shader.
GBV funktioniert, indem gepatchte Shader erstellt werden, die die Überprüfung direkt zum Shader hinzugefügt haben. Die gepatchten Shader prüfen Stammargumente und Ressourcen, auf die während der Shaderausführung zugegriffen wird, und melden Fehler an einen Protokollpuffer. GBV fügt außerdem zusätzliche Vorgänge und Dispatch-Aufrufe in die Anwendungsbefehlslisten ein, um Änderungen am Ressourcenstatus zu überprüfen und nachzuverfolgen, die von der Befehlsliste auf der GPU-Zeitachse auferlegt werden.
Da GBV die Möglichkeit 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 nimmt diese immer noch wahr: COPY-Befehlslisten, und die Debugebene überprüft diese als solche.
Aktivieren der GPU-basierten Überprüfung
GBV kann mithilfe der DirectX-Systemsteuerung (DXCPL) erzwungen werden, indem sie die Direct3D 12-Debugebene erzwingen und zusätzlich die GPU-basierte Überprüfung erzwingen (neue Registerkarte in der Systemsteuerung). Nach der Aktivierung bleibt GBV aktiviert, bis das Direct3D 12-Gerät freigegeben wird. Alternativ kann GBV programmgesteuert aktiviert werden, bevor Sie das Direct3D 12-Gerät erstellen:
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 den Code mit aktivierter Debugebene ausführen. GBV kann jedoch viel verlangsamen. Entwickler können die Aktivierung von GBV mit kleineren Datasets (z. B. Engine-Demos oder kleine Spielebenen mit weniger PSO und Ressourcen) oder während der frühen Anwendungsaufführung in Betracht ziehen, um Leistungsprobleme zu reduzieren. Bei größeren Inhalten sollten Sie GBV auf einem oder zwei Testcomputern in einem nächtlichen Testdurchlauf aktivieren.
Debugausgabe
GBV erzeugt die Debugausgabe nach einem 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 möchten möglicherweise ihre eigene Wait-after-Execute einfügen, um die Debugausgabe zu synchronisieren.
Die GBV-Ausgabe gibt an, wo in einem Shader ein Fehler aufgetreten ist, zusammen mit der aktuellen Anzahl von Draw/Dispatch und Identitäten verwandter Objekte (z. B. Befehlsliste, Warteschlange, PSO usw.).
Beispiel für Debugnachricht
Die folgende Fehlermeldung gibt an, dass auf eine Ressource mit dem Namen "Hauptfarbpuffer" in einem Shader als Shaderressource zugegriffen wurde, sich aber im ungeordneten Zugriffsstatus befand, als der Shader auf der GPU ausgeführt wurde. Weitere Informationen, z. B. die Position in der Shaderquelle, der Name der Befehlsliste und die Draw-Anzahl (Draw Index) sowie 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]
Debuggen von Layer-APIs
Rufen Sie EnableDebugLayerauf, um die Debugebene zu aktivieren.
Rufen Sie zum Aktivieren der GPU-basierten Überprüfung SetEnableGPUBasedValidationauf, 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