监视器热插拔检测
本页上的信息适用于使用早于 WDDM 2.2 的版本实现的图形驱动程序。
显示适配器上的视频输出被视为显示适配器的子设备。 连接到输出的监视器或其他外部显示设备不被视为子设备。 在初始化期间,显示微型端口驱动程序的 DxgkDdiQueryChildRelations 函数为每个子设备分配一个类型和一个 HPD 感知值。 类型是 DXGK_CHILD_DEVICE_TYPE 枚举器之一:
TypeVideoOutput
TypeOther
HPD 感知值是 DXGK_CHILD_DEVICE_HPD_AWARENESS 枚举器之一:
HpdAwarenessAlwaysConnected
HpdAwarenessInterruptible
HpdAwarenessPolled
类型为 TypeVideoOutput 且 HpdAwarenessAlwaysConnected 以外的任何 HPD 感知值都称为 视频输出连接器。
如果显示微型端口驱动程序无法确定监视器是否连接到视频输出,则驱动程序应模拟可中断设备的行为,并将 HPD 感知值设置为 HpdAwarenessInterruptible。 如果显示微型端口驱动程序需要指示应将可中断监视器连接到视频输出,例如当用户输入键盘快捷方式切换到电视视图时,驱动程序应使用 ChildStatus 调用 DxgkCbIndicateChildStatus 函数。HotPlug。已连接设置为 TRUE。
在某些情况下,操作系统请求显示微型端口驱动程序报告 HPD 感知值为 HpdAwarenessPolled 的所有视频输出连接器的状态。 没有常规轮询间隔;相反,当有特定需要更新可用显示设备和模式的列表时,会发出请求。 例如,当笔记本电脑停靠时,操作系统需要知道监视器是否连接到扩展坞上的视频输出。 操作系统通过为 HPD 感知值为 HpdAwarenessPolled 的每个子设备调用显示微型端口驱动程序的 DxgkDdiQueryChildStatus 函数发出请求。
对于 HPD 感知值为 HpdAwarenessInterruptible 的视频输出连接器,显示微型端口驱动程序负责在外部显示设备热插拔或拔下时通知操作系统。 显示微型端口驱动程序的中断处理代码调用显示端口驱动程序的 DxgkCbIndicateChildStatus 函数,以报告外部显示设备已连接到特定视频输出或从特定视频输出断开连接。 当笔记本电脑停靠时,显示微型端口驱动程序的 DxgkDdiNotifyAcpiEvent 函数必须为 HPD 感知值为 HpdAwarenessInterruptible 的扩展坞上的每个视频输出调用 DxgkCbIndicateChildStatus。
如果 HPD 感知值为 HpdAwarenessPolled 的连接器 (即在笔记本电脑停靠时) 不可用,则显示微型端口驱动程序的 DxgkDdiNotifyAcpiEvent 函数必须调用 DxgkCbIndicateChildStatus 来报告连接器已断开连接。
与便携式计算机上的集成显示面板关联的视频输出是一种不寻常的情况。 操作系统需要知道便携式计算机的盖子是打开还是关闭,因此 连接的 理念用于表示打开, 未连接 的想法用于表示关闭。 与便携式计算机上的集成显示器关联的视频输出具有 HPdAwarenessInterruptible 的 HPD 感知值。 但是,这并不意味着打开或关闭盖子时,显示适配器会生成中断。 相反,当打开或关闭盖子时,ACPI BIOS 会生成中断。 该中断导致调用显示微型端口驱动程序的 DxgkDdiNotifyAcpiEvent 函数,该函数调用 DxgkCbIndicateChildStatus 来报告 (打开或关闭盖子) 的状态。 显示微型端口驱动程序通过将DXGK_CHILD_STATUS结构的 HotPlug.Connected 成员设置为 TRUE (打开) 或 FALSE (关闭) 并将DXGK_CHILD_STATUS结构传递给 DxgkCbIndicateChildStatus 来报告盖子的状态。
以下列表描述了监视器连接到 HD15 连接器时遵循的步骤,假设该连接器的 HPD 感知值为 HpdAwarenessPolled。
监视器连接到显示适配器上的 HD15 连接器。 显示适配器不会将此检测为热插拔事件。
将来的某个时间,用户模式应用程序会请求显示设备列表。
对于 HPD 感知值为 HpdAwarenessPolled 的显示适配器上的每个视频输出连接器,VidPN 管理器调用显示微型端口驱动程序的 DxgkDdiQueryChildStatus 函数,以确定外部显示设备是否已连接。 当为 HD15 连接器调用 DxgkDdiQueryChildStatus 时,它会报告外部监视器确实已连接。
以下列表描述了监视器连接到 DVI 连接器(假设该连接器的 HPD 感知值为 HpdAwarenessInterruptible)时要执行的步骤。
平板面板连接到显示适配器上的 DVI 连接器。
显示适配器检测热插拔事件并生成中断。
中断由显示微型端口驱动程序的 DxgkDdiInterruptRoutine 函数处理,该函数 (DPC) 计划延迟过程调用。 随后调用显示微型端口驱动程序的 DPC 回调函数。
DPC 回调函数将DXGK_CHILD_STATUS结构传递给显示端口驱动程序的 DxgkCbIndicateChildStatus 函数,以报告 DVI 连接器的状态。 DXGK_CHILD_STATUS 结构的 ChildUid 成员标识 DVI 连接器,在这种情况下, HotPlug.Connected 成员 (设置为 TRUE ,) 指示外部显示设备已连接。
假设 DVI 连接器支持具有三个分支的硬件保护装置:DVI、HD15 和 S-video。 在这种情况下,显示微型端口驱动程序之前会枚举与一个物理 DVI 连接器关联的三个子设备:DVI-on-DVI、HD15-on-DVI 和 S-video-on-DVI。 每个子设备都具有 TypeVideoOutput 类型,HPD 感知值 HpdAwarenessInterruptible。 以下列表描述了监视器连接到硬件保护装置的 HD15 分支时所遵循的步骤。
显示适配器检测热插拔事件并生成中断。
中断由显示微型端口驱动程序的 DxgkDdiInterruptRoutine 函数处理,该函数 (DPC) 计划延迟过程调用。 随后调用显示微型端口驱动程序的 DPC 回调函数。
DPC 回调函数确定热插拔事件位于硬件保护装置的 HD15 分支上, (HD15-on-DVI) 。
DPC 回调函数将DXGK_CHILD_STATUS结构传递给 DxgkCbIndicateChildStatus ,以报告 HD15-on-DVI 视频输出的状态。 DXGK_CHILD_STATUS 结构的 ChildUid 成员标识视频输出,在这种情况下, HotPlug.Connected 成员 (设置为 TRUE ,) 指示外部显示设备已连接。
以下列表描述了在笔记本电脑上合上盖子时要执行的步骤。
在便携式计算机上关闭盖子,这将生成 ACPI 事件。 随后,将调用显示微型端口驱动程序的 DxgkDdiNotifyAcpiEvent 函数。
DxgkDdiNotifyAcpiEvent 将DXGK_CHILD_STATUS结构传递给显示端口驱动程序的 DxgkCbIndicateChildStatus 函数,以报告与内置显示面板关联的子设备的状态。 具体而言, DxgkDdiNotifyAcpiEvent 将 DXGK_CHILD_STATUS 结构的 HotPlug.Connected 成员设置为 FALSE。