Windows 图形显示驱动开发-WDDM 3.2-自动显示切换(八)
适配器启动时间
驱动程序启动时,需要响应 OS 的轮询请求。 驱动程序可以通过尝试通信来发现多路复用器是否切换到了它们,但这可能会很耗时或不可靠。 作为 GPU 启动序列的一部分,OS 会调用 DxgkDdiDisplayMuxUpdateState DDI,以显示连接到多路复用器的每个目标,并指示是否已切换到该目标。
驱动程序启动时,需要响应 OS 的轮询请求。 驱动程序可以尝试通过与 OS 通信来发现是否已将多路复用器切换到其 GPU,但这可能会很耗时或不可靠。
取而代之的是,作为 GPU 启动序列的一部分,OS 会为每个连接到多路复用器的目标调用 DxgkDdiDisplayMuxUpdateState 并指示多路复用器是否已切换到该目标。 在调用任何轮询 DDI 之前,OS会向驱动程序报告多路复用器是否已切换到驱动程序的 GPU。
ADS 驱动程序继续以相同方式向 OS 报告内部面板,OS 调用 DxgkDdiQueryAdapterInfo(DXGKQAITYPE_INTEGRATED_DISPLAY_DESCRIPTOR2) 来查询内部面板的详细信息。 对于连接到多路复用器的任何目标,驱动程序需要确保 DXGK_CHILD_CAPABILITIES.HpdAwareness 设置为 HpdAwarenessInterruptible。
D0 转换
每当连接了多路复用器的 GPU 从低功耗状态返回到电源开启状态时,OS 都会调用 DxgkDdiDisplayMuxUpdateState 来告诉驱动程序多路复用器是连接到了目标 GPU 还是切换到了其他 GPU。
启动顺序
下面的启动序列重点介绍了 ADS 特定的方面。 在此序列中,系统启动时:
- 连接到多路复用器的 iGPU。
- 用户重启前的最后配置是多路复用器连接到 dGPU。
启动序列本质上是异步的,因此此序列仅供示例之用。
- 系统开机,iGPU 通过多路复用器与面板连接。
- iGPU 会在面板上显示启动屏幕。
- Windows 加载并在内部 lid 上显示启动动画。
- 由于 iGPU 和 dGPU 上都有 _DEP 功能,OS 的多路复用器驱动程序会在 GPU 驱动程序之前启动。 多路复用器驱动程序使用 ACPI 调用来确保多路复用器配置正确。 多路复用器驱动程序验证 ACPI 多路复用器的实现是否符合 ADS 要求。
- Dxgkrnl 为 iGPU 调用 DxgkDdiAddDevice。
- Dxgkrnl 为 iGPU 调用 DxgkDdiQueryInterface(DXGK_DISPLAYMUX_INTERFACE)。 即使当前系统不支持 ADS,如果系统支持 ADS,驱动程序也会返回其接口。
- Dxgkrnl 调用 DxgkDdiDisplayMuxGetDriverSupportLevel 以获取驱动器的 ADS 支持级别。
- Dxgkrnl 调用 DxgkDdiDisplayMuxReportPresence (TRUE),让 iGPU 知道系统中的 ADS 多路复用器正在运行。
- Dxgkrnl 调用 DxgkDdiStartDevice。 iGPU 驱动程序会返回包括内部面板 VidPn 目标在内的子数量。
- Dxgkrnl 调用 DxgkDdiDisplayMuxGetRuntimeStatus 以检查 iGPU 是否支持 ADS,以及驱动程序是否从系统获取了所有必要信息。
- Dxgkrnl 为 iGPU 公开的每个子节点调用 DxgkDdiQueryChildStatus。
- 一旦 Dxgkrnl 找到连接到多路复用器的 iGPU 报告子节点,它就会调用 DxgkDdiDisplayMuxUpdateState 通知 iGPU 多路复用器已连接到该目标。
- 由于 iGPU 公开了连接的内部监视器,因此 Dxgkrnl 使用 DxgkddiSettimingsfromvidpn 在 iGPU 上设置模式。
- Dxgkrnl 启动 dGPU 驱动程序,然后重复步骤 5-12 运行 dGPU。
- Dxgkrnl 检测到 iGPU、dGPU 和多路复用器均已正确配置,因此为多路复用器对创建了多路复用器对和 PnP 设备接口属性。
- Dxgkrnl 从注册表中读取最后一个多路复用器配置。 由于上一个配置为 dGPU,因此 Dxgkrnl 现在将启动前面所述的多路复用器切换序列,将多路复用器切换到 dGPU。