Windows 顯示驅動程序模型 (WDDM) 1.2 及更高版本用戶模式顯示驅動程序必須使用內存套餐和回收功能(從Windows 8開始提供),以減少本地內存和系統內存中臨時表面所需的內存開銷。
最低 WDDM 版本:1.2
最低 Windows 版本:8
驅動程序實現 - 完整圖形和僅呈現:必需
WHCK 要求和測試: Device.Graphics...OfferReclaim
特別是在移動方案中,需要硬件加速的圖形密集型應用可能會大量使用 GPU 資源。 此外,在許多移動設備中,GPU 集成到 CPU 芯片集中,GPU 使用部分系統內存作為視頻內存。 為了確保在多個應用大量使用 GPU 進而對系統內存提出大量需求時提供合理的系統性能,應盡量減少顯示驅動程序的內存占用。 提供/回收設備驅動程序接口 (DDI) 提供執行此操作的機制。
1. 核心目標
減少內存開銷:通過動態回收臨時表面(Temporary Surfaces)的內存,優化 集成GPU(如移動設備)的 系統內存利用率。
適用場景:
- GPU 共享系統內存(如 Intel HD Graphics、AMD APU、移動 SoC)。
- 多應用高負載時避免內存耗盡導致的性能下降。
2. 關鍵機制
(1) 內存套餐(Offer)
作用:驅動程序標記不再需要的內存分配為“可回收”,允許 OS 臨時將其分配給其他進程或系統使用。
觸發條件:
- 應用釋放資源(如 Direct3D 紋理銷毀)。
- 驅動程序檢測到閑置表面(如后臺應用的交換鏈緩沖區)。
(2) 內存回收(Reclaim)
作用:當原始需求恢復時(如應用重新激活),驅動程序嘗試收回之前“Offer”的內存。
可能結果:
- 成功:內存內容可能保留(依賴 DXGI_RECLAIM_RESOURCE_FLAGS)
- 失敗:需重新分配內存并初始化(內容丟失)。
3. 驅動程序實現要求
?(1) 必需接口
DDI 函數 | 描述 |
---|---|
OfferResources | 標記資源為可回收(調用?DXGK_OFFER_ALLOCATION_LIST )。 |
ReclaimResources | 嘗試收回資源(返回?DXGK_RECLAIM_RESULT ?狀態)。 |
(2) 數據結構
DXGKARGCB_OFFER_ALLOCATION:
包含要 Offer 的分配句柄列表及優先級(DXGK_OFFER_PRIORITY)。
DXGK_RECLAIM_ALLOCATION_LIST:
指定需回收的資源列表及回收標志(如 Discarded 狀態)。
4. 用戶模式驅動(UMD)與內核模式驅動(KMD)協作
- UMD 觸發 Offer:調用 IDXGIDevice2::OfferResources(Direct3D 11+)或 vkOfferResources(Vulkan)。
- KMD 處理:通過 DxgkCbOfferAllocation 回調通知圖形內核。
- OS 決策:根據內存壓力決定是否實際釋放物理內存。
- UMD 觸發 Reclaim:調用 IDXGIDevice2::ReclaimResources。
- KMD 驗證:返回資源是否可重用(如 DXGK_RECLAIM_RESULT_OK)。
5. 優先級與策略
Offer 優先級(DXGK_OFFER_PRIORITY):
- Low:緩存數據(可優先回收)。
- Normal:常規資源。
- High:關鍵資源(盡量避免回收)。
回收策略:若 ReclaimResources 返回 DXGK_RECLAIM_RESULT_DISCARDED,UMD 需重建資源內容。
6. 代碼示例(KMD 側)
// Offer 資源處理(在 DxgkDdiOfferAllocations 中)
NTSTATUS DxgkDdiOfferAllocations(DXGKARG_OFFER_ALLOCATIONS* pOfferArgs
) {for (UINT i = 0; i < pOfferArgs->NumAllocations; i++) {DXGK_ALLOCATION_HANDLE hAlloc = pOfferArgs->pAllocationList[i];MarkAsOfferable(hAlloc, pOfferArgs->Priority);}return STATUS_SUCCESS;
}// Reclaim 資源處理(在 DxgkDdiReclaimAllocations 中)
NTSTATUS DxgkDdiReclaimAllocations(DXGKARG_RECLAIM_ALLOCATIONS* pReclaimArgs
) {for (UINT i = 0; i < pReclaimArgs->NumAllocations; i++) {if (IsResourceValid(pReclaimArgs->pAllocationList[i])) {pReclaimArgs->pResults[i] = DXGK_RECLAIM_RESULT_OK;} else {pReclaimArgs->pResults[i] = DXGK_RECLAIM_RESULT_DISCARDED;}}return STATUS_SUCCESS;
}
7. 應用層兼容性(DXGI 1.2+)
API 使用示例:
// Direct3D 11 應用示例
IDXGIDevice2* pDXGIDevice;
pD3DDevice->QueryInterface(IID_PPV_ARGS(&pDXGIDevice));
pDXGIDevice->OfferResources(1, &pTexture, DXGI_OFFER_RESOURCE_PRIORITY_NORMAL);
// ... 后續可能需要回收 ...
HRESULT hr = pDXGIDevice->ReclaimResources(1, &pTexture, &bDiscarded);
8. WHCK 測試要求
測試項:Device.Graphics.WDDM12.Render.OfferReclaim
驗證點:
- Offer 后內存壓力緩解。
- Reclaim 后資源功能正常。
- 正確處理 DISCARDED 狀態。
9. 性能與調試建議
日志記錄:跟蹤 Offer/Reclaim 調用頻率及結果。
內存分析:使用 ETW 事件(如 Microsoft-Windows-DxgKrnl)監控內存回收效率。
Fallback 處理:確保資源回收失敗時能優雅重建(如重新上傳紋理數據)。
10. 總結
必要性:WDDM 1.2+ 驅動必須實現 Offer/Reclaim 以通過 WHQL 認證。
優勢:顯著降低集成 GPU 的內存占用,提升多任務性能。
注意:正確處理 DISCARDED 狀態是健壯性關鍵。