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

window 显示驱动开发-呈现开销改进

从Windows 8.1开始,Microsoft Direct3D 运行时更高效地处理内部交换缓冲区,从而减少 GPU 上的处理负载。 为了支持这种更好的性能,Windows 显示驱动程序模型 (WDDM) 1.3 及更高版本驱动程序必须支持新的现有设备驱动程序接口, (DDI) 和新纹理格式作为共享图面:

WDDM 1.3 提供 DDI

这些参考主题介绍如何在显示微型端口驱动程序和用户模式显示驱动程序中实现此功能:

  • pfnPresent1 (D3D)
  • pfnPresent1 (DXGI)
  • D3DDDIARG_PRESENT1
  • D3DDDIARG_PRESENTSURFACE
  • D3DKMT_COMPOSITION_PRESENTHISTORYTOKEN
  • DXGI_DDI_ARG_PRESENT1
  • DXGI_DDI_ARG_PRESENTSURFACE
  • D3DDDI_DEVICEFUNCS (新的 pfnPresent1 函数指针)
  • D3DDDIFORMAT (新的 D3DDDIFMT_G8R8 和 D3DDDIFMT_R8 常量值)
  • D3DKMT_PRESENT_MODEL (新的 D3DKMT_PM_REDIRECTED_COMPOSITION 常量值)
  • D3DKMT_PRESENTHISTORYTOKEN (新的 Composition 成员)
  • DXGI_DDI_BASE_ARGS (新的 pDXGIDDIBaseFunctions4 成员)
  • DXGI1_3_DDI_BASE_FUNCTIONS (新的 pfnPresent1 函数指针)

1. 核心功能概述

WDDM 1.3 引入 pfnPresent1 系列函数,优化了传统的呈现路径,主要改进包括:

  • 更高效的交换链管理:减少 DWM(桌面窗口管理器)合成开销。
  • 支持新的呈现模型:如 D3DKMT_PM_REDIRECTED_COMPOSITION(重定向合成)。
  • 扩展的格式支持:新增 D3DDDIFMT_G8R8 和 D3DDDIFMT_R8 像素格式。
  • 呈现历史记录:通过 D3DKMT_PRESENTHISTORYTOKEN 跟踪呈现操作。

2. 关键数据结构与枚举

(1) 呈现参数结构体

结构体作用
D3DDDIARG_PRESENT1包含 Direct3D 9/10/11 的扩展呈现参数(如脏矩形、旋转标志)。
DXGI_DDI_ARG_PRESENT1DXGI 路径的扩展呈现参数(支持低延迟模式、部分更新)。
D3DKMT_PRESENTHISTORYTOKEN记录呈现操作的令牌(新增 Composition 成员标识合成路径)。

(2) 新增像素格式

typedef enum _D3DDDIFORMAT {D3DDDIFMT_G8R8 = 50,  // 16-bit 灰度+红色通道D3DDDIFMT_R8    = 51,  // 8-bit 单通道
} D3DDDIFORMAT;

(3) 呈现模型枚举

typedef enum _D3DKMT_PRESENT_MODEL {D3DKMT_PM_REDIRECTED_COMPOSITION = 4,  // 重定向合成(DWM 优化路径)
} D3DKMT_PRESENT_MODEL;

3. 驱动实现步骤

(1) 用户模式驱动(UMD)
注册 pfnPresent1 回调:

// Direct3D 路径(D3D9/10/11)
D3DDDI_DEVICEFUNCS DeviceFuncs = {0};
DeviceFuncs.pfnPresent1 = YourD3DPresent1Handler;// DXGI 路径
DXGI1_3_DDI_BASE_FUNCTIONS DXGIFuncs = {0};
DXGIFuncs.pfnPresent1 = YourDXGIPresent1Handler;


处理 D3DDDIARG_PRESENT1:
(2) 内核模式驱动(KMD)
处理重定向合成:

NTSTATUS DxgkDdiPresent(CONST DXGKARG_PRESENT* pPresent
) {if (pPresent->PresentModel == D3DKMT_PM_REDIRECTED_COMPOSITION) {// 跳过传统合成路径,直接扫描输出ProgramScanout(pPresent->hAllocation);}return STATUS_SUCCESS;
}

更新呈现历史令牌:

void UpdatePresentHistory(D3DKMT_PRESENTHISTORYTOKEN* pToken,BOOL IsComposition
) {pToken->Composition = IsComposition;  // 标记是否经 DWM 合成
}

4. WHCK 认证要求

测试项验证目标工具依赖
Device.Graphics.WDDM13.Present1pfnPresent1 的功能正确性(如脏矩形处理)。HLK Present 测试套件。
Device.Graphics.WDDM13.RedirectedComposition重定向合成路径的功耗和性能优势。GPUView + 功耗分析仪。
Device.Graphics.WDDM13.FormatSupport新增像素格式(如 D3DDDIFMT_R8)的渲染正确性。PIX 捕获工具。

5. 调试与优化建议

  • ETW 事件:监控 Microsoft-Windows-DxgKrnl 的 Present1_* 事件。
  • 脏矩形优化:仅更新屏幕变化区域(通过 pDirtyRects),降低带宽占用。
  • 低延迟模式:在 DXGI_DDI_ARG_PRESENT1 中处理 DXGI_DDI_PRESENT_FLAG_LOW_LATENCY 标志。

6. 示例:处理 DXGI Present1

HRESULT APIENTRY DXGIPresent1(DXGI_DDI_ARG_PRESENT1* pArgs
) {if (pArgs->Flags & DXGI_DDI_PRESENT_FLAG_LOW_LATENCY) {BypassComposition();  // 绕过 DWM 合成}SubmitFrame(pArgs->pSurfaces, pArgs->NumSurfaces);return S_OK;
}

7. 总结

必要性:WDDM 1.3+ 驱动需实现 pfnPresent1 以支持现代合成优化。

关键改进:

  • 重定向合成降低 DWM 开销。
  • 新增像素格式支持更多应用场景(如灰度渲染)。
  • 呈现历史记录助力调试工具。

性能收益:全屏应用(如游戏)可减少 20-30% 的呈现延迟

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

相关文章:

  • 如何在 Django 中集成 MCP Server
  • Leetcode 3556. Sum of Largest Prime Substrings
  • TPAMI 2025 | CEM:使用因果效应图解释底层视觉模型
  • Hive 分区详解:从基础概念到实战应用
  • R 语言科研绘图 --- 热力图-汇总
  • Linux系统:动静态库的制作与安装
  • ollama list模型列表获取 接口代码
  • Python环境搭建
  • 220Vac 1kW 无刷直流电机驱动器硬件方案
  • Spring AI 之多模态
  • [BUG]Debian/Linux操作系统中 安装 curl等软件显示无候选安装(E: 软件包 curl 没有可安装候选)
  • 国芯思辰| SerDes芯片SCS5501/SCS5502助力汽车触屏流媒体后视镜,兼容MAX9295A/MAX96717
  • Oracle 的 TX、TM、UL 锁对比
  • 【后端高阶面经:MongoDB篇】40、怎么优化MongoDB的查询性能?
  • 001 dart刷题
  • QT6.9中opencv引用路径的其中一种设置
  • AlphaCore GPU 物理仿真引擎内测邀请
  • crc32代码设计
  • .NET 8使用AOT发布ASP.NET Core应用
  • 《软件工程》第 7 章 - 软件体系结构设计
  • Wan2.1 图生视频 多卡推理批量生成视频
  • 在Windows上,将 Ubuntu WSL 安装并迁移到 D 盘完整教程(含 Appx 安装与迁移导入)
  • Cocos Creator 之 Label的实际宽高改变文本背景大小及常用方法
  • 【Volumetric Heatmap热力图插件的使用】
  • SpringBoot性能优化的12招
  • Flutter Container组件、Text组件详解
  • 商城图片性能优化实战:懒加载与下一代格式的化学反应
  • 游戏行业DDoS防护:基于IP信誉库的实时拦截方案
  • ArrayBlockingQueue 和 LinkedBlockingQueue 有什么区别?
  • 第一章第2节:安全生命周期(识别→防护→检测→响应→恢复)