共用方式為


GPU 型驗證和 Direct3D 12 偵錯層

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

GPU 型驗證的用途

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

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

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

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

開啟 GPU 型驗證

GBV 可以強制在 Direct3D 12 偵錯層上強制使用 DirectX 控制面板 (DXCPL),並另外強制使用 GPU 型驗證(控制面板中的新索引標籤)。 啟用之後,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 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,並參考下列介面的方法:

請參閱下列列舉和結構: