当前位置: 首页 > ai >正文

window 显示驱动开发-视频内存供应和回收(一)

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):

  1. Low:缓存数据(可优先回收)。
  2. Normal:常规资源。
  3. 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 状态是健壮性关键。

http://www.xdnf.cn/news/7967.html

相关文章:

  • jquery.table2excel方法导出
  • 鸿蒙仓颉开发语言实战教程:实现商城应用首页
  • 尼科彻斯定理
  • Vue 3.0中自定义指令
  • 01-jenkins学习之旅-window-下载-安装
  • 【云原生安全】零信任与机密计算
  • Qt C++实现马的遍历问题
  • 【JavaEE】(1) 计算机如何工作
  • 阿里巴巴 MCP 分布式落地实践:快速转换 HSF 到 MCP server
  • 记录:uniapp 上线部署到微信小程序vendorjs包过大的问题
  • 外网如何连接内网中的mysql数据库服务器?简单网络工具方案
  • Cause: org.apache.ibatis.ognl.OgnlException: sqlSegment
  • 【C++】位图+布隆过滤器
  • JAVA EE(进阶)_CSS
  • 如何排查服务器 CPU 温度过高的问题并解决?
  • C++ 前缀和数组
  • C++STL(二)类模板
  • YCKC【二分查找专题】题解
  • 《对话记忆的进化史:智能体大模型如何实现跨轮次的深度交互》
  • 国酒华夏实业酒水供应链:全品类覆盖打造一站式购销平台
  • 第四十三节:人脸检测与识别-人脸识别基础 (Eigenfaces, Fisherfaces, LBPH)
  • Selenium自动化测试终极指南:从原理到实战
  • 【Python生成器全解析】从基础到高阶应用实战
  • C语言—Linux环境下CMake设置库(动态/静态)
  • 借助IEDA ,Git版本管理工具快速入门
  • 多线程(七)
  • 开疆智能Profinet转RS485网关连接工业型土壤水分温度传感器 配置案例
  • 如何在 Windows 10 或 11 上安装 Adminer?
  • 非欧空间计算加速:图神经网络与微分几何计算的GPU优化(流形数据的内存布局优化策略)
  • MEMO数据DID与ZK技术:赋能RWA代币化与可信流通的新基石