window 显示驱动开发-视频内存供应和回收(三)
硬件认证要求
有关硬件设备在实现此功能时必须满足的要求的信息,请参阅 Device.Graphics... 上的相关 WHCK 文档。OfferReclaim。 请注意,这些要求列出了驱动程序必须提供分配的方案。
1. WHCK 测试核心要求
Windows Hardware Compatibility Kit (WHCK) 对 Offer/Reclaim 功能的认证测试集中在以下关键领域:
(测试项:Device.Graphics.WDDM12.Render.OfferReclaim)
测试类别 | 具体要求 | 验证方法 |
---|---|---|
基本功能 | 驱动程序必须正确实现 OfferResources 和 ReclaimResources DDI。 | 验证驱动能响应 OS 的 Offer/Reclaim 请求,并返回正确的状态码(如 DISCARDED )。 |
内存释放 | Offer 后,GPU 内存应能被系统重新分配。 | 监控内存压力场景下 Offer 操作的实际内存释放效果。 |
数据一致性 | 若 Reclaim 返回 OK ,资源内容必须保留;若返回 DISCARDED ,驱动需重建资源。 | 注入强制丢弃测试,检查应用是否能正确恢复渲染。 |
优先级处理 | 高优先级资源(如交换链缓冲区)应避免被回收。 | 测试不同 D3DDDI_OFFER_PRIORITY 级别的资源回收策略。 |
多线程安全 | Offer/Reclaim 操作需与其他渲染命令线程安全。 | 并发执行资源提交、Offer 和 Reclaim 操作,检查竞态条件。 |
2. 驱动程序必须支持的场景
根据 WHCK 文档,驱动需在以下场景触发 Offer/Reclaim:
应用显式请求:Direct3D 应用调用 IDXGIDevice2::OfferResources/ReclaimResources。
系统内存压力:OS 在低内存时自动请求驱动释放非活跃资源。
后台应用:最小化或非焦点窗口的交换链缓冲区应被 Offer。
3. 认证关键检查点
检查项 | 合规性标准 | 失败后果 |
---|---|---|
Offer 后资源可释放 | 驱动必须允许 OS 回收内存物理页。 | 内存泄漏或认证失败。 |
Reclaim 状态处理 | 正确处理 DISCARDED 并重建资源。 | 渲染错误或应用崩溃。 |
优先级尊重 | 高优先级资源(如 D3DDDI_OFFER_PRIORITY_HIGH )不被过早回收。 | 前台应用性能下降。 |
无内存损坏 | Offer/Reclaim 后,其他未回收资源必须保持可用。 | 系统蓝屏或图形损坏。 |
4. 实现示例(合规性关键代码)
(1) 内核模式驱动(KMD)正确处理 Reclaim
NTSTATUS DxgkDdiReclaimAllocations(DXGKARG_RECLAIM_ALLOCATIONS* pReclaim) {for (UINT i = 0; i < pReclaim->NumAllocations; i++) {if (IsResourceInUse(pReclaim->pAllocations[i])) {// 资源仍被占用,拒绝回收pReclaim->pResults[i] = DXGK_RECLAIM_RESULT_BUSY;} else if (IsResourceContentLost(pReclaim->pAllocations[i])) {// 内容已丢失,需应用重建pReclaim->pResults[i] = DXGK_RECLAIM_RESULT_DISCARDED;} else {// 成功回收pReclaim->pResults[i] = DXGK_RECLAIM_RESULT_OK;}}return STATUS_SUCCESS;
}
(2) 用户模式驱动(UMD)处理 DISCARDED 状态
HRESULT YourReclaimResourcesHandler(DXGI_DDI_ARG_RECLAIMRESOURCES* pArgs
) {for (UINT i = 0; i < pArgs->NumResources; i++) {if (pArgs->pDiscarded[i]) {RebuildTexture(pArgs->phResources[i]); // 重建纹理数据}}return S_OK;
}
5. 调试与认证准备建议
使用 WPA (Windows Performance Analyzer):分析 Microsoft-Windows-DxgKrnl ETW 事件,检查 Offer/Reclaim 调用的时间和频率。
WHCK 测试工具:运行 DXGKRNL_TEST 中的 OfferReclaim 压力测试(如强制内存压力模拟)。
日志记录:在驱动中记录 Offer/Reclaim 操作的资源句柄和结果,便于问题追踪。
6. 常见认证失败原因
问题 | 修复建议 |
---|---|
Offer 后内存未释放 | 检查驱动是否正确解除 GPU 页表映射。 |
Reclaim 返回错误状态 | 确保资源状态机正确跟踪(如 BUSY/DISCARDED)。 |
多线程竞争导致崩溃 | 使用同步锁(如 KeAcquireSpinLock )保护资源列表。 |
7. 总结
强制要求:WDDM 1.2+ 驱动必须通过 WHCK OfferReclaim 测试以获得认证。
核心挑战:平衡内存释放和性能,确保关键资源不被过度回收。
工具链依赖:ETW、WHCK 测试工具和内核调试器是调试必备。