本文說明 Windows 11 24H2 版 (WDDM 3.2) 中新增的 WDDM 中核心模式測試基礎結構的設計。 此基礎結構允許測試和驗證不支援 D3D 運行時間的驅動程式,例如某些 NPU 裝置的驅動程式。 它也可用來驗證確實支援 D3D 執行階段的驅動程式,但不需要涉及 D3D 執行階段本身。
概觀
在某些情況下,會引進以 WDDM 或 MCDM 為基礎的新計算裝置,而這些裝置的驅動程式不支援 D3D 執行時間。 為了協助驗證這類驅動程式,功能已新增至 Dxgkrnl,以僅使用核心模式代位程式進行驗證;也就是說,不涉及 D3D 執行階段與使用者模式驅動程式(UMD)。
此基礎結構也允許使用精確的設定來測試 WDDM 功能,而不需要經過 D3D 執行階段或 UMD,這可能會讓事情變得複雜。
引進 DDI 來針對一組指定的命令,在核心模式中建置命令緩衝區。 這些命令很簡單,因此幾乎任何執行節點都應該能夠使用預編譯的著色器或其他方式來執行它們。
若要支援這項功能,核心模式驅動程式 (KMD) 必須提供下列支援:
- 報告 DXGK_FEATURE_KERNEL_MODE_TESTING 功能已啟用。
- 實作 DXGKDDI_KERNELMODETESTINGINTERFACE 功能介面。
- 提供哪個執行節點支援建置和執行測試指令緩衝區的相關資訊。
- 支援建立沒有私人驅動程式資訊的背景/硬體佇列。 通常需要私人驅動程式命令的格式,才能將工作負載提交至裝置。 測試介面允許在沒有私人驅動程式資料的情況下提交工作負載。
- 支援在支援此功能之裝置的任何節點上執行 pfnBuildTestCommandBuffer 所建置的命令緩衝區。
- 支持 NULL 分配控制碼在分頁 DDI 中(TRANSFER、FILL 等)。
只有在電腦上啟用 測試簽署 時,才會使用此功能。
將會開發使用此功能的 HLK 測試。
DDI 變更
下列結構和列舉已更新,以支援核心模式測試:
DXGK_FEATURE_KERNEL_MODE_TESTING 會新增至 DXGK_FEATURE_ID 列舉。
SupportBuildTestCommandBuffer 會新增至 DXGK_NODEMETADATA_FLAGS 結構。
TestContext 會新增至 DXGK_CREATECONTEXTFLAGS 結構。
TestQueue 會新增至 D3DDDI_CREATEHWQUEUEFLAGS 結構。
已新增下列 DDI、結構和列舉,以支援核心模式測試:
已新增 DXGKDDI_KERNELMODETESTINGINTERFACE 功能介面,其中 DXGKDDI_BUILDTESTCOMMANDBUFFER::p fnBuildTestCommandBuffer 是唯一的介面成員。
核心模式測試功能的報告支援功能
OS 會呼叫 KMD 的 DxgkDdiQueryFeatureSupport 函式,並新增 DXGK_FEATURE_KERNEL_MODE_TESTING 功能識別碼,以檢查驅動程式是否支援核心模式測試。 KMD 必須確認支援此功能。
然後,系統會呼叫具有相同功能標識碼的 DxgkDdiQueryFeatureInterface ,以取得 pfnBuildTestCommandBuffer 的介面函式指標。 KMD 必須實作此函式,並提供其指標給 DXGKDDI_KERNELMODETESTINGINTERFACE 介面。
報告支援核心模式測試的執行節點
SupportBuildTestCommandBuffer 會新增至 DXGK_NODEMETADATA_FLAGS 結構。 KMD 必須設定此旗標,以指出節點可以執行 pfnBuildTestCommandBuffer 所建置的命令緩衝區。 建議盡可能多的節點支援此功能。
建立沒有私人資料的情境
TestContext 新增至 DXGK_CREATECONTEXTFLAGS ,以指出內容是測試內容。 只有在啟用測試簽署時,此旗標才會生效。
KMD 的 DxgkDdiCreateContext 應該支援針對每個節點建立內容,而不需要私人數據,以支援執行 pfnBuildTestCommandBuffer 所產生的命令緩衝區。 若要指出此支援,請在建立內容期間在 Flags 中設定 TestContext 旗標。
建立沒有驅動程式私人資料的硬體佇列
TestQueue 會新增至 D3DDDI_CREATEHWQUEUEFLAGS ,以指出硬體佇列是測試佇列。 只有在啟用測試簽署時,此旗標才會生效。
KMD 的 DxgkDdiCreateHwQueue 應該支援建立沒有驅動程式私人數據的硬體佇列。
建置命令緩衝區
KMD 的 pfnBuildTestCommandBuffer 會建置命令緩衝區,其中包含一組簡單命令的裝置特定指示。 KMD 會從 DxgkDdiQueryFeatureInterface (DXGK_FEATURE_KERNEL_MODE_TESTING) 傳回此函式的指標。
單一測試命令會提交至 pfnBuildTestCommandBuffer。 目前支援下列命令:
| 指令 | 說明 |
|---|---|
| D3DDDI_TESTCOMMAND_COPY | 透過來源和目的地 GPU 虛擬位址來複製位元組。 |
| D3DDDI_TESTCOMMANDBUFFER_FILL | 以圖樣填滿記憶體位置。 |
測試命令是基於使用 GPU 虛擬地址。 OS 保證 GPU VA 會對應至使用 標準配置類型D3DKMT_STANDARDALLOCATIONTYPE_EXISTINGHEAP 或 D3DKMT_STANDARDALLOCATIONTYPE_INTERNALBACKINGSTORE 建立的配置。
產生的命令緩衝區和專用資料會傳回使用者模式。 當命令緩衝區提交以執行時,呼叫來自使用者模式。 惡意應用程式可能會變更緩衝區的內容和私人數據。 KMD 的責任是驗證命令緩衝區和私人驅動程式數據,以避免錯誤檢查。
產生的命令緩衝區不應包含特殊許可權指令。
使用者模式用戶端驅動程式 (例如 Cuda) 會提交產生的命令緩衝區,以使用 D3DKMTSubmitCommand 或 D3DKMTSubmitCommandToHwQueue 來執行。 未來,緩衝區內容會作為使用者模式提交的一部分提交。
當產生的命令緩衝區提交執行時,保證命令緩衝區包含單一測試命令的裝置指令。
產生的命令緩衝區會提交至與傳遞給 pfnBuildTestCommandBuffer 的 hContext 相對應的節點。
DMA 緩衝區 (pDmaBuffer) 的大小限制為 4 KB,而 DMA 私人驅動程式資料的大小 (pDmaBufferPrivateData) 限制為 1 KB。