windows显示驱动开发-节能与 VSync 控制

为了节省计算机上的电源,内核模式显示驱动程序可以减少发生的 VSync 监视器刷新中断数。

较新的处理器和平台通常与操作系统配合使用,以在计算机系统空闲时节省能源。 但是,定期系统活动(如触发中断)会导致峰值用电量,并可能阻止计算机系统进入暂时性睡眠状态,从而节省能源。

从具有 Service Pack 1 的 Windows Vista (SP1) 和 Windows Server 2008 开始,当屏幕未从新图形或鼠标活动刷新时,操作系统可以关闭定期 VSync 中断计数。 通过控制 VSync 中断间隔,驱动程序可以节省大量能源。

可以通过使用 Windows Server 2008 或更高版本的 Windows 驱动程序工具包 (WDK) 重新生成 Windows 显示驱动程序模型 (WDDM) 驱动程序来利用此功能。

具有适用于 VSync 控件的 Windows Vista SP1 驱动程序更改

若要使驱动程序利用此功能,它们必须支持 Windows Vista SP1 中引入的 DXGK_VIDSCHCAPS 结构中的 VSyncPowerSaveAware 成员。 必须使用 Windows Server 2008 或更高版本的 WDK,使用 VSyncPowerSaveAware 成员重新编译 WDDM 后的现有驱动程序。

如果 1/Vsync 连续 10 个周期(其中 VSync 是监视器刷新率),如果具有 SP1 或更高版本的 Windows Vista 系统,其驱动程序位于 WDDM 后面,并且支持此功能,则会关闭 VSync 中断的计数功能。 如果 VSync 速率为 60hz (Hz) ,则 VSync 中断每 16 毫秒发生一次。 因此,在没有屏幕更新的情况下,VSync 中断在 160 毫秒后关闭。 如果 GPU 活动恢复,则再次打开 VSync 中断以刷新屏幕。

Display-Only Windows 8 及更高版本的 VSync 要求

在 Windows 8 及更高版本的 Windows 操作系统中,内核模式的仅显示驱动程序 (KMDOD) 是可选的,以支持 VSync 功能,如下所示:

仅显示驱动程序支持 VSync 控件

如果 KMDOD 支持 VSync 控件功能,则必须实现 DxgkDdiControlInterrupt 和 DxgkDdiGetScanLine 函数,并且必须提供 指向KMDDOD_INITIALIZATION_DATA 结构中这两个函数的有效函数指针。

在这种情况下,KMDOD 还必须实现 DxgkDdiInterruptRoutine 和 DxgkDdiDpcRoutine 函数,以便向操作系统报告 VSync 中断。

此外,无法D3DKMDT_FREQUENCY_NOTSPECIFIEDDISPLAYCONFIG_VIDEO_SIGNAL_INFO 结构的 PixelRate、hSyncFreq 和 vSyncFreq 成员的值。

仅显示驱动程序不支持 VSync 控件

如果 KMDOD 不支持 VSync 控件功能,则它不得实现 DxgkDdiControlInterrupt 或 DxgkDdiGetScanLine 函数,并且不得向 KMDDOD_INITIALIZATION_DATA 结构中的任一函数提供有效的函数指针。

在这种情况下,Microsoft DirectX 图形内核子系统根据当前模式和上次模拟 VSync 的时间模拟 VSync 中断和扫描行的值。

此外,DISPLAYCONFIG_VIDEO_SIGNAL_INFO 结构的PixelRate、hSyncFreq 和 vSyncFreq 成员的值必须设置为 D3DKMDT_FREQUENCY_NOTSPECIFIED。

如果不满足这些条件,DirectX 图形内核子系统将不会加载 KMDOD。

注册表控制

对于 SP1 及更高版本的 Windows 操作系统的 Windows Vista,默认 VSync 空闲超时为 10 个 VSync 周期。 (可选)出于测试目的,可以使用注册表设置来控制超时。

为了避免应用程序兼容性问题,请不要更改生产驱动程序中的默认注册表设置。

注册表项路径:RTL_REGISTRY_CONTROL\GraphicsDrivers\Scheduler

完整路径:[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers\Scheduler]

项值:VsyncIdleTimeout

ValueType:REG_DWORD

值:10 = 默认值

值:0 = 禁用 VSync 控制 (生成与 Windows Vista 相同的行为)

相关推荐
17(无规则自律)16 小时前
【Linux驱动实战】:字符设备之ioctl与mutex全解析
linux·c语言·驱动开发·嵌入式硬件
weiyvyy2 天前
从开发视角看硬件接口:接口开发的本质与全景图
驱动开发·单片机·嵌入式硬件·硬件工程
Dylan~~~2 天前
AI编程新范式:规范驱动开发SpecKit框架完全指南
驱动开发·ai编程
阿拉斯攀登2 天前
【RK3576 安卓 JNI/NDK 系列 04】JNI 核心语法(下):字符串、数组与对象操作
android·驱动开发·rk3568·瑞芯微·rk安卓驱动·jni字符串操作
weiyvyy2 天前
接口开发的完整流程:从需求到验证
驱动开发·嵌入式硬件·硬件架构·硬件工程
zly88653722 天前
windsurf rules与skill的使用
linux·c语言·开发语言·驱动开发
阿拉斯攀登3 天前
【RK3576 安卓 JNI/NDK 系列 09】RK3576 实战(三):JNI 调用 librga 实现 2D 硬件加速图像处理
android·驱动开发·rk3568·瑞芯微·rk安卓驱动·rk3576 rga加速
阿拉斯攀登4 天前
第 19 篇 驱动性能优化与功耗优化实战
android·驱动开发·瑞芯微·嵌入式驱动·安卓驱动
道一云黑板报4 天前
技术拆解:AI低代码架构设计与全链路落地实现
人工智能·驱动开发·低代码·ai·企业微信·ai编程·代码规范
LXY_BUAA4 天前
《嵌入式操作系统》_高级字符设备驱动_20260316
linux·运维·服务器·驱动开发