共用方式為


GPU 型驗證和 Direct3D 12 偵錯層

本主題描述如何充分利用 Direct3D 12 偵錯層。 GPU 型驗證 (GBV) 可在 CPU 上的 API 呼叫期間,在 GPU 時間軸上啟用驗證案例。 GBV 從 Windows 10 年度更新版圖形工具開始提供。

GPU 型驗證的用途

GPU 型驗證有助於識別下列錯誤:

  • 在著色器中使用未初始化或不相容的描述元。
  • 在著色器中使用參考已刪除資源的描述項。
  • 驗證升級的資源狀態和資源狀態衰減。
  • 索引超出著色器中描述元堆積結尾的索引。
  • 著色器存取處於不相容狀態的資源。
  • 在著色器中使用未初始化或不相容的取樣器。

GBV 的運作方式是建立已修補的著色器,這些著色器已直接將驗證新增至著色器。 修補的著色器會檢查著色器執行期間存取的根引數和資源,並將錯誤回報給記錄緩衝區。 GBV 也會將額外的作業和分派呼叫插入應用程式命令清單中,以驗證和追蹤 GPU 時程表上命令清單所加總的資源狀態變更。

由於 GBV 需要能夠執行著色器,因此 COPY 命令清單會由 COMPUTE 命令清單模擬。 這可能會變更硬體執行複本的方式,但不應該變更最終結果。 應用程式仍會察覺這些是 COPY 命令清單,偵錯層會驗證它們,

開啟 GPU 型驗證

您可以在 Direct3D 12 偵錯層上強制使用 DirectX 主控台 (DXCPL) ,並在控制台的新索引標籤上強制執行 GPU 型驗證, (新的索引標籤強制執行 GBV) 。 啟用之後,GBV 會保持啟用狀態,直到 Direct3D 12 裝置發行為止。 或者,在建立 Direct3D 12 裝置之前,可以程式設計方式啟用 GBV:

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

一般而言,您應該在大部分時間都啟用偵錯層來執行程式碼。 不過,GBV 可能會讓事情變慢很多。 開發人員可能會考慮使用較小的資料集來啟用 GBV (,例如引擎示範或具有較少 PSO 和資源的小遊戲層級) ,或在早期應用程式啟動期間啟用,以減少效能問題。 使用較大的內容時,請考慮在一或兩部測試機器上開啟 GBV,並在夜間測試階段中開啟。

偵錯輸出

GBV 會在 呼叫 ExecuteCommandLists 完成 GPU 上的執行之後產生偵錯輸出。 由於這是在 GPU 時間軸上,偵錯輸出可能會與其他 CPU 時間軸驗證非同步。 應用程式開發人員可能會想要插入自己的等候後執行,以同步處理偵錯輸出。

GBV 輸出會識別著色器發生錯誤的位置,以及相關物件的目前繪製/分派計數和識別 (,例如命令清單、佇列、PSO 等) 。

偵錯訊息範例

下列錯誤訊息表示在著色器中以著色器資源的形式存取名為「主要色彩緩衝區」的資源,但在 GPU 上執行著色器時處於未排序的存取狀態。 也會提供其他資訊,例如著色器來源中的位置、命令清單的名稱和 Draw count (Draw Index) ,以及相關的 D3D 介面物件名稱。

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]

偵錯層 API

若要啟用偵錯層,請呼叫 EnableDebugLayer

若要啟用 GPU 型驗證,請呼叫 SetEnableGPUBasedValidation,並參考下列介面的方法:

請參閱下列列舉和結構: