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

window 显示驱动开发-视频内存的直接交替(二)

DirectFlip 设备驱动程序接口 (DDI)

这些函数和结构是针对Windows 8而新增的或更新的:

  • CheckDirectFlipSupport
  • CheckDirectFlipSupport (D3D11_1)
  • DxgkDdiSetVidPnSourceAddress
  • D3D11_1_DDI_CHECK_DIRECT_FLIP_FLAGS
  • D3DDDI_CHECK_DIRECT_FLIP_FLAGS
  • D3DDDIARG_CHECKDIRECTFLIPSUPPORT
  • D3DKMT_DIRECTFLIP_SUPPORT
  • D3DKMT_QUERYADAPTERINFO
  • D3DKMT_WAITFORVERTICALBLANKEVENT2
  • D3DKMTWaitForVerticalBlankEvent2
  • DXGK_DRIVERCAPS
  • DXGK_SEGMENTFLAGS
  • DXGK_SETVIDPNSOURCEADDRESS_FLAGS

 1. 核心函数与结构概览

以下是为支持 Direct Flip 功能 在 Windows 8 (WDDM 1.2) 中新增或更新的关键接口:

类型名称作用
函数CheckDirectFlipSupport检查硬件是否支持 Direct Flip(用户模式 D3D11.1 驱动)。
函数DxgkDdiSetVidPnSourceAddress内核模式驱动设置扫描源地址,实现直接翻转(关键路径)。
结构体D3D11_1_DDI_CHECK_DIRECT_FLIP_FLAGS定义 Direct Flip 支持的检查标志(如窗口化兼容性)。
枚举D3DKMT_DIRECTFLIP_SUPPORT描述 Direct Flip 支持级别(完全/部分/不支持)。
回调D3DKMTWaitForVerticalBlankEvent2扩展的垂直同步等待接口,支持 Direct Flip 时序控制。

2. 关键函数详解

(1) CheckDirectFlipSupport (UMD)
调用方:Direct3D 11.1+ 用户模式驱动。

作用:验证当前交换链配置是否支持 Direct Flip。

参数:

typedef struct _D3DDDIARG_CHECKDIRECTFLIPSUPPORT {D3DKMT_HANDLE hDevice;          // 设备句柄D3DKMT_HANDLE hPrimarySurface;  // 主表面句柄D3DKMT_HANDLE hSecondarySurface;// 后台缓冲区句柄BOOL Supported;                 // 输出:是否支持
} D3DDDIARG_CHECKDIRECTFLIPSUPPORT;

实现示例:

BOOL CheckDirectFlipSupport(D3D11_1_DDI_CHECK_DIRECT_FLIP_FLAGS Flags) {return (Flags & D3D11_1_DDI_CHECK_DIRECT_FLIP_SURFACE_REQUIREMENTS) != 0;
}

(2) DxgkDdiSetVidPnSourceAddress (KMD)
调用时机:翻转操作时由 Dxgkrnl 调用。

关键参数:

typedef struct _DXGKARG_SETVIDPNSOURCEADDRESS {DXGK_VIDPNSOURCEADDRESS_FLAGS Flags;  // 包含 DirectFlip 标志HANDLE hPrimaryAllocation;            // 前台缓冲区分配句柄PHYSICAL_ADDRESS PrimaryAddress;      // 扫描物理地址
} DXGKARG_SETVIDPNSOURCEADDRESS;

驱动行为:

若 Flags.DirectFlip=1,直接配置显示控制器扫描地址,跳过 DWM 合成。

必须验证缓冲区格式/布局是否符合扫描要求(如线性内存、无压缩)。

3. 关键结构体与枚举

(1) D3D11_1_DDI_CHECK_DIRECT_FLIP_FLAGS

typedef enum _D3D11_1_DDI_CHECK_DIRECT_FLIP_FLAGS {D3D11_1_DDI_CHECK_DIRECT_FLIP_SURFACE_REQUIREMENTS = 0x1,  // 表面需满足扫描条件D3D11_1_DDI_CHECK_DIRECT_FLIP_WINDOWED             = 0x2   // 支持窗口化 Direct Flip
} D3D11_1_DDI_CHECK_DIRECT_FLIP_FLAGS;

(2) D3DKMT_DIRECTFLIP_SUPPORT

typedef enum _D3DKMT_DIRECTFLIP_SUPPORT {D3DKMT_DIRECTFLIP_NONE      = 0,  // 不支持D3DKMT_DIRECTFLIP_PARTIAL   = 1,  // 部分支持(如仅全屏)D3DKMT_DIRECTFLIP_FULL      = 2   // 完全支持(全屏+窗口化)
} D3DKMT_DIRECTFLIP_SUPPORT;

(3) DXGK_SETVIDPNSOURCEADDRESS_FLAGS

typedef struct _DXGK_SETVIDPNSOURCEADDRESS_FLAGS {UINT DirectFlip           : 1;  // 当前为 Direct Flip 操作UINT SrcColorSpaceChanged : 1;  // 颜色空间变更需处理// ... 其他标志位
} DXGK_SETVIDPNSOURCEADDRESS_FLAGS;

4. 驱动实现流程

(1) 用户模式驱动(UMD)
初始化时检查支持:

D3DKMT_QUERYADAPTERINFO QueryInfo = {0};
QueryInfo.Type = KMTQAITYPE_DIRECTFLIP_SUPPORT;
D3DKMTQueryAdapterInfo(&QueryInfo);  // 获取 D3DKMT_DIRECTFLIP_SUPPORT

Present 时请求 Direct Flip:

pSwapChain->Present(0, DXGI_PRESENT_DIRECT_FLIP);

(2) 内核模式驱动(KMD)
声明能力:

DXGK_DRIVERCAPS Caps = {0};
Caps.FlipCaps.DirectFlip = 1;  // 在 DxgkDdiQueryAdapterInfo 中返回

处理翻转:

NTSTATUS DxgkDdiSetVidPnSourceAddress(DXGKARG_SETVIDPNSOURCEADDRESS* pArgs) {if (pArgs->Flags.DirectFlip) {if (!ValidateScanoutSurface(pArgs->hPrimaryAllocation)) {return STATUS_GRAPHICS_INVALID_SCANOUT_SURFACE;}ProgramHardwareScanout(pArgs->PrimaryAddress);}return STATUS_SUCCESS;
}

5. 认证与调试

WHCK 测试项:

  • Device.Graphics.WDDM12.DirectFlip.Functional
  • Device.Graphics.WDDM12.DirectFlip.Power

调试工具:

  • GPUView:观察翻转队列是否绕过 DWM。
  • ETW 日志:过滤 Microsoft-Windows-DxgKrnl 的 DirectFlip_* 事件。

6. 常见问题与解决

问题排查步骤
Direct Flip 未触发检查 DXGK_DRIVERCAPS 声明、表面格式(需 DXGI_FORMAT_R8G8B8A8_UNORM)。
切换时撕裂确保 FlipOnVSyncMmIo=1 且 VSync 信号严格同步。
窗口化模式失败验证 D3D11_1_DDI_CHECK_DIRECT_FLIP_WINDOWED 是否支持。

7. 总结

必要性:Direct Flip 是 WDDM 1.2+ 驱动必须实现的功能,尤其针对移动设备优化。

关键点:

正确实现 DxgkDdiSetVidPnSourceAddress 的 Direct Flip 路径。

严格验证扫描表面的硬件兼容性。

性能收益:全屏应用内存带宽降低 30-50%,显著提升电池续航。


 

相关文章:

  • [TriCore] 01.QEMU 虚拟化 TriCore 架构中的寄存器 指令
  • HTML应用指南:利用GET请求获取全国捞王锅物料理门店位置信息
  • 快速了解 GO之 Defer 延迟操作
  • 拥塞控制算法cubic 和bbr
  • HTML流星雨
  • golang channel 的特点、原理及使用场景
  • 进行性核上性麻痹护理之道:助力患者舒适生活
  • (11)Service Mesh架构下Java应用实现零信任安全模型
  • Pycatia基础代码解析——零件设计篇(一)
  • 数字展厅建设需融合创意设计与实用功能,打造多维用户体验!
  • Unity性能优化
  • ClickHouse性能优化技术深度解析与实践指南
  • 【R语言编程绘图-函数篇】
  • 商城图片性能优化实战:懒加载与下一代格式的化学反应
  • 【Webtrees 用户手册】第 3 章 -会员指南
  • OpenSSL 与 C++ 搭建一个支持 TLS 1.3 的服务器
  • 迭代器和生成器
  • 【Linux】网络--传输层--TCP协议基础
  • Sparse VideoGen开源:完全无损,视频生成速度加速两倍,支持Wan 2.1、HunyuanVideo等
  • HarmonyOS NEXT~鸿蒙操作系统功耗优化特性深度解析
  • 提供网站制作价格/2022年最火的电商平台
  • 专业网站设计制合肥作/app下载推广
  • 网站如何建设与安全/磐石网站seo
  • 郑州网站建设行情/成都疫情最新消息
  • 固原市建设局网站/免费的推广引流软件下载
  • 建设网站属于什么费用/搜索引擎营销分析