支持集成显示面板上的亮度控制

本文介绍在集成显示面板上支持亮度控制的机制和要求。 它概述了系统提供的监视器驱动程序 (Monitor.sys)、内核模式显示微型端口驱动程序 (KMD) 和 BIOS 之间通过 ACPI 方法的协作。 无论是通过 KMD 还是 ACPI,目标是确保用户能够轻松调整显示器的亮度,在优化电源使用时增强其计算体验。

Monitor.sys 中的亮度控制支持

亮度控制在 Monitor.sys 中实现。 此系统提供的监视器驱动程序提供以下支持:

  • 实现 Windows Management Instrumentation (WMI) 接口,以允许应用程序(如操作系统的亮度滑块)与亮度级别交互。

  • 向设备电源策略引擎 (DPPE) 注册,以便亮度级别响应电源策略中的更改。

  • 向高级配置和电源接口 (ACPI) 注册以处理基于 ACPI 的亮度快捷键。 为了与旧版 Windows 2000 显示驱动程序模型兼容,监视器驱动程序会实现基于 IOCTL 的亮度控制。

内核模式显示微型端口驱动程序 (KMD) 或 BIOS 公开的 ACPI 方法都支持更改集成显示面板的亮度。 对于标记为具有在计算机 (D3DKMDT_VOT_INTERNAL) 中进行内部连接的输出技术的第一个视频目标,监视器驱动程序会调用 KMD 的 DxgkDdiQueryInterface 函数来查询以下两个接口:

  • 亮度控制接口。 GUID_DEVINTERFACE_BRIGHTNESS and DXGK_BRIGHTNESS_INTERFACE_VERSION_1 标识此接口。

  • 亮度控制接口 V.2。 GUID_DEVINTERFACE_BRIGHTNESS_2 and DXGK_BRIGHTNESS_INTERFACE_VERSION_2 标识此接口。

如果 KMD 至少不支持亮度控制接口,则监视器驱动程序会使用 ACPI 查询子设备上的_BCL、_BCM 和 _BQC 方法。 有关这些方法的详细信息,请参阅 ACPI 网站上的 ACPI 规范。

注意

在 Windows 显示驱动程序模型 (WDDM) 中,ACPI 标识符不用于标识集成的显示面板。 这不同于 Windows 2000 显示驱动程序模型,该模型仅支持具有标识符 0x0110 的显示面板。

如果 KMD 或 BIOS 公开的 ACPI 方法支持亮度控制,监视器驱动程序会注册亮度快捷键的 ACPI 通知。 没有其他备用机制可以向监视器驱动程序发出有关快捷键通知的信号。 如果监视器驱动程序无法使用亮度控制机制,或者 KMD 提供亮度控制接口但无法调用 DxgkDdiGetPossibleBrightness 函数,则监视器驱动程序不支持亮度控制。

亮度级别

亮度级别表示为 0 到 100 范围内的单字节值,其中 0 表示关闭,100 是笔记本电脑支持的最大亮度。 每台笔记本电脑报告的最大亮度级别必须为 100;但是,笔记本电脑不需要支持零级别。

值从 0 到 100 的唯一要求是,较大的值必须表示较高的亮度级别。 级别之间的增量不需要统一,笔记本电脑可以支持任意数量的非重复值,最大为 101 个级别。 你必须决定如何将硬件级别映射到亮度级别值范围。 但是,对 KMD 的 DxgkDdiGetPossibleBrightness 函数的调用所报告的亮度级别值不应比硬件支持的值更多。

通过 BIOS 禁用自动亮度变化

KMD 应该将参数的位 2 设置为 _DOS 方法。 设置此位可避免系统 BIOS 和显示器驱动程序都控制显示面板亮度时可能出现的问题。 有关 _DOS 方法及其参数的详细信息,请参阅 ACPI 规范。 通过设置位 2,系统 BIOS 被告知它不应执行任何自动亮度更改。

支持亮度控制的 BIOS 要求

要使 KMD 以最佳方式支持控制集成面板亮度,系统 BIOS 必须通过 ACPI 提供以下项。

亮度控制方法

集成面板设备应支持 ACPI 亮度控制方法(_BCL、_BCM 和 _BQC)。 _BCL 和 _BCM 自 ACPI 规范 1.0b 版以来一直没有变化;你可以在 ACPI 3.0 规范的 B.6.2 和 B.6.3 节中找到它们的定义。 _BQC 为可选,在 ACPI 3.0 规范的 B.6.4 节中定义。 有关亮度级别的定义,请参阅亮度级别。

以下是 Dispmprt.h 中定义的 ACPI 亮度控制方法的别名:

  • ACPI_METHOD_OUTPUT_BCL - 允许 Windows 查询显示输出设备支持的亮度级别列表。 如果存在集成的 LCD 并支持亮度级别,则需要使用此方法。

  • ACPI_METHOD_OUTPUT_BCM - 允许 Windows 设置显示输出设备的亮度级别。 Windows 仅设置 ACPI_METHOD_OUTPUT_BCL 方法报告的级别。 如果实现 ACPI_METHOD_OUTPUT_BCL 方法,则需要使用 ACPI_METHOD_OUTPUT_BCM 方法。

禁用自动系统 BIOS 亮度控制

系统 BIOS 应支持将参数的第 2 位设置为图形适配器上的 _DOS 方法,以允许禁用自动系统 BIOS 亮度更改。 此位是对此方法中位的先前定义值的补充。 有关此位的详细信息,请参阅 ACPI 3.0 规范中的 B.4.1 节。

如果不支持此位,则监视器驱动程序和系统 BIOS 都可以更改亮度级别,从而导致亮度闪烁。 此外,亮度可能会设置为不是用户请求的值。

Dispmprt.h 中定义的ACPI_METHOD_DISPLAY_DOS 是 ACPI 自动亮度控制方法的别名。 此别名表示系统 BIOS 能够自动切换活动显示输出或控制 LCD 的亮度。 其参数可为下列值之一。

含义
ACPI_ARG_ENABLE_AUTO_LCD_BRIGHTNESS 当电源从 AC 更改为 DC 时,系统 BIOS 应自动控制 LCD 的亮度级别。
ACPI_ARG_DISABLE_AUTO_LCD_BRIGHTNESS 当电源从 AC 更改为 DC 时,系统 BIOS 不应自动控制 LCD 的亮度级别。

亮度快捷键通知

亮度快捷键通知应面向集成显示面板设备,而不是图形适配器。

支持 Dispmprt.h 中定义的以下通知:

通知 含义
ACPI_NOTIFY_CYCLE_BRIGHTNESS_HOTKEY 用户按下了用于循环显示亮度的热键。
ACPI_NOTIFY_INC_BRIGHTNESS_HOTKEY 用户按下了用于增加显示亮度的热键。
ACPI_NOTIFY_DEC_BRIGHTNESS_HOTKEY 用户按下了用于减小显示亮度的热键。
ACPI_NOTIFY_ZERO_BRIGHTNESS_HOTKEY 用户按下了将显示亮度降低至零的热键。

这些快捷键通知是 ACPI 3.0 规范中的新内容,在 B.7 节中进行了介绍。 通常,笔记本电脑不支持所有这些快捷键通知。

对于增加和减少亮度级别,监视器驱动程序的默认行为是:

  • 对于 ACPI_NOTIFY_INC_BRIGHTNESS_HOTKEY,亮度增量至少比之前的亮度级别高出百分之五,直到达到下一个可用的百分之五步进级别(5、10、15、...、95、100)。

  • 对于 ACPI_NOTIFY_DEC_BRIGHTNESS_HOTKEY,亮度减量至少比之前的亮度级别低百分之五,直到达到下一个可用的百分之五步进级别(5、10、15、...、95、100)。

使用快捷键递增或递减可以在亮度级别创建非对称模式,如以下示例所示。

  • 指定为 0、1、5、10、...、95、100 的可用 _BCL 亮度控制级别

    • 使用 ACPI_NOTIFY_INC_BRIGHTNESS_HOTKEY 通知的结果:
      0、5、10、15、20、25、30、35、40、45、50、55、60、65、70、75、80、85、90、95、100

    • 使用 ACPI_NOTIFY_DEC_BRIGHTNESS_HOTKEY 通知的结果:
      100、95、90、85、80、75、70、65、60、55、50、45、40、35、30、25、20、15、10、5、0

  • 指定为 1、5、10、...、95、100 的可用 _BCL 亮度控制级别

    • 使用 ACPI_NOTIFY_INC_BRIGHTNESS_HOTKEY 通知的结果:
      1、10、15、20、25、30、35、40、45、50、55、60、65、70、75、80、85、90、95、100

    • 使用 ACPI_NOTIFY_DEC_BRIGHTNESS_HOTKEY 通知的结果:
      100、95、90、85、80、75、70、65、60、55、50、45、40、35、30、25、20、15、10、5、1

    在后一个示例中,1 是最后一个可用值,因此驱动程序会将亮度级别设置为 1,即使它与上一个值 5 相差不到 5%。

IHV 或 OEM 可以通过在以下注册表项中设置 MinimumStepPercentage 的 DWORD 值来更改 Windows Vista 和 Windows 7 上的默认显示器驱动程序行为:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\monitor\Parameters\

支持显示输出和 ACPI 事件