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 相同的行为)

相关推荐
福尔摩斯张5 小时前
Linux信号捕捉特性详解:从基础到高级实践(超详细)
linux·运维·服务器·c语言·前端·驱动开发·microsoft
取个名字太难了a9 小时前
第一个驱动程序
驱动开发
chenchen0000000012 小时前
全志新一代“普惠”工业芯方案:HZ-T153_MiniEVM开发板评测
驱动开发·嵌入式硬件
学不完的路路路14 小时前
解决把驱动编译进内核未生成uImage、zImage镜像的问题
linux·驱动开发·ubuntu
人生苦短,菜的抠脚15 小时前
RK Camera HAL3 工作流程简要分析
android·驱动开发
进击大厂的小白1 天前
50.共享工作队列
驱动开发
风华同学1 天前
【系统移植篇】ubuntu-base系统构建
驱动开发·ubuntu·arm
很㗊2 天前
BSP之以太网接口学习笔记
linux·驱动开发·笔记·学习
jllllyuz2 天前
QN8035 FM芯片驱动开发
驱动开发
不会书3 天前
Linux字符设备驱动的演进:从传统框架到现代实践
linux·运维·服务器·c语言·驱动开发