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 测试工具和内核调试器是调试必备。

你可能感兴趣的:(windows图形显示驱动开发,驱动开发)