显示切换 (ADS) 功能,该功能支持在集成 GPU (iGPU) 和独立 GPU (dGPU) 之间无缝切换笔记本电脑的内部面板。 ADS 是一项可选的 WDDM 功能,从 Windows 11 24H2 更新 2025.01D 版(WDDM 3.2)开始支持。
概述
一些已发布的笔记本电脑配备了多路复用器 (mux) 设备,允许内部面板在集成 GPU (iGPU) 和独立 GPU (dGPU) 之间切换。 目前,图形驱动程序会在这些笔记本电脑中触发并执行切换,而 OS 对此一无所知,这就导致了一些不理想的用户体验。
ADS 允许 OS 控制使用系统中的多路复用器设备,以便在扫描到内部面板时在 iGPU 和 dGPU 之间进行切换。 因此,OS 可以带来更好的用户体验。
最初版本的 ADS 仅支持在 iGPU 和 dGPU 之间切换内部面板。 将来,此功能可能会扩展,以支持笔记本电脑中外部连接器的复用功能。
高级设计
通常,系统必须确保在切换过程中,内部面板的内容不会出现任何闪烁或故障。 OS 不会将此功能限制于任何特定的显示协议。 本文重点介绍如何使用 eDP 实施 ADS,但还有更多行业标准可以使用(如 MIPI 或 DSI)。 在无需进行任何其他操作系统更改的情况下,平台设计可以自由使用另一种显示连接协议,只要它们可以实现相同的体验。
本部分中的子部分标识功能设计的各个要素,并详细介绍了每个要素的高层次方法。
控制多路复用器设备
为了减少 iGPU 和 dGPU 图形驱动程序之间的依赖性,多路复用器被作为独立设备公开,OS 可以独立于图形驱动程序进行控制。 这种方法的优点包括:
- 它降低了图形驱动程序的复杂性,因为驱动程序不需要知道如何控制 OEM 可能使用的每种不同的多路复用器。
- 它可以减少或消除图形驱动程序之间的依赖关系,这样可以减少驱动程序更新的频率,并使 OEM 更轻松地选择 GPU 和复用器。
- 当图形驱动程序不可用时,OS 可以切换多路复用器。
公开多路复用器设备
由于此解决方案用于内部 iGPU 和 dGPU 之间的多路复用,因此通过 ACPI 公开多路复用器是合理的。
多路复用器驱动程序的功能
多路复用器驱动器必须满足以下高级功能要求:
- 它必须提供多路复用器的状态、当前控制内部面板的目标以及任何能力上限。
- 它必须提供触发切换和报告切换状态的方法。
有关多路复用器 ACPI 设备及其方法的详细信息,请参阅 ACPI。
为了实现无缝切换,在 GPU 切换期间,多路复用器设备始终需要满足以下条件:
- 面板电源。 在任何时候,多路复用器都需要由任一 GPU 提供面板电源。 让两个 GPU 同时为面板供电也是可行的。
- 在切换时,来自两个 GPU 的亮度启用控制信号。
- 切换时两个 GPU 的亮度级别(脉宽调制)。
多路复用器在两个 GPU 和面板之间切换以下信息:
- 亮度启用控制信号
- 亮度等级(脉宽调制)
- DisplayPort (DP) 辅助线
- 热插拔检测 (HPD) 线
- DP 数据线
多路复用器必须能够在面板未处于活动状态时进行切换。 至少在内部面板切换时,多路复用器不应该触发任何 HPD 信号到 GPU。
GPU 驱动程序不应调用多路复用器 ACPI 方法。
自动显示切换 DDI
为满足多路复用要求,增加了多个 DDI。 在多路复用切换过程中,OS 会在五个不同的点上调用驱动程序的 DDI,使用的功能如下。 各种调用取决于切换的阶段,以及驱动程序是否在控制当前拥有显示控制权的 GPU。
DxgkDdiDisplayMuxPreSwitchAway:呼叫当前与显示屏连接的驱动程序。 此调用会通知驱动程序,系统计划将显示器切换到另一个 GPU(从 GPU0 切换到 GPU1)。
DxgkDdiDisplayMuxPreSwitchAwayGetPrivateData:从当前连接到面板的驱动程序(来自 GPU0)调用以收集任何专用切换数据。
DxgkDdiDisplayMuxPreSwitchTo:对当前未连接到显示器的驱动程序进行呼叫。 此调用会通知驱动程序,OS 计划将显示器切换到该 GPU (GPU1)。
DxgkDdiDisplayMuxSwitchCanceled:调用驱动程序,以指示切换顺序在切换完成前被取消。
DxgkDdiDisplayMuxPostSwitchAway:多路复用器切换完成,GPU0 的驱动程序不再与显示器连接。
DxgkDdiDisplayMuxPostSwitchToPhase1:多路复用器切换完成,GPU1 的驱动程序已连接到显示器。 此驱动程序现在应执行第 1 阶段任务。
DxgkDdiDisplayMuxPostSwitchToPhase2:多路复用器切换完成,并且 GPU1 的驱动程序已连接到显示器。 此驱动程序现在应执行第 2 阶段任务。
DxgkDdiDisplayMuxUpdateState:在适配器启动和返回 D0 电源状态时调用,以便让驱动程序知道当前的多路复用器状态。