WDDM 功能的核心模式測試
本文說明在 Windows 11 24H2 版 (WDDM 3.2) 中新增的 WDDM 中核心模式測試基礎結構的設計。 此基礎結構允許測試及驗證不支援 D3D 執行時間的驅動程式,例如某些 NPU 裝置的驅動程式。 它也可以用來驗證支援 D3D 執行時間的驅動程式,而不涉及 D3D 運行時間。
概觀
在某些情況下,會引進以 WDDM 或 MCDM 為基礎的新計算裝置,且這些裝置的驅動程式不支援 D3D 運行時間。 為了協助驗證這類驅動程式,將功能新增至 Dxgkrnl ,僅使用內核模式 Thunks 進行驗證;也就是說,不需要涉及 D3D 運行時間和使用者模式驅動程式 (UMD)。
此基礎結構也允許使用精確的設定來測試 WDDM 功能,而不需要經過 D3D 運行時間或 UMD,這可能會使事情複雜化。
引進 DIS,以核心模式建置一組指定命令的命令緩衝區。 命令很簡單,因此幾乎任何執行節點都應該能夠使用先行編譯著色器或其他方式來執行這些命令。
若要支援這項功能,核心模式驅動程式 (KMD) 必須提供下列支援:
- 報告已啟用DXGK_FEATURE_KERNEL_MODE_TESTING功能。
- 實作 DXGKDDI_KERNELMODETESTINGINTERFACE 功能介面。
- 提供哪些執行節點支援建置和執行測試命令緩衝區的相關信息。
- 支援在沒有私人驅動程序數據的情況下建立內容/硬體佇列。 通常需要私人驅動程式命令的格式,才能將工作負載提交至裝置。 測試介面允許工作負載提交,而不需要私人驅動程序數據。
- 支援在支援此功能的任何裝置節點上執行 pfnBuildTestCommandBuffer 所建置的命令緩衝區。
- 支援分頁 DIS 中的 NULL 配置句柄(TRANSFER、FILL 等)。
只有在機器上啟用測試簽署時,才會使用此功能。
將會開發使用此功能的 HLK 測試。
DDI 變更
已更新下列結構和列舉,以支援內核模式測試:
DXGK_FEATURE_KERNEL_MODE_TESTING會新增至DXGK_FEATURE_ID列舉。
SupportBuildTestCommandBuffer 會新增至 DXGK_NODEMETADATA_FLAGS 結構。
TestContext 會新增至 DXGK_CREATECONTEXTFLAGS 結構。
TestQueue 會新增至 D3DDDI_CREATEHWQUEUEFLAGS 結構。
已新增下列 DIS、結構和列舉,以支援內核模式測試:
會新增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。 目前支援下列命令:
Command | 描述 |
---|---|
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。