枚举显示适配器的子设备

以下一系列步骤介绍了显示端口驱动程序、显示微型端口驱动程序和视频呈现网络 (VidPN) 管理器在初始化时如何协作以枚举显示适配器的子设备。

  1. 显示端口驱动程序调用显示微型端口驱动程序的 DxgkDdiStartDevice 函数。 DxgkDdiStartDevice 返回 NumberOfChildren 参数中的 (,) 显示适配器的 (或可通过停靠) 子级而变为的设备数。 DxgkDdiStartDevice 还会返回 NumberOfVideoPresentSources 参数中的 (,) 显示适配器支持的视频当前源的 N 个数。 这些视频呈现来源随后将由数字 0、1...N -1。

  2. 显示端口驱动程序调用显示微型端口驱动程序的 DxgkDdiQueryChildRelations 函数,该函数枚举显示适配器的子设备。 DxgkDdiQueryChildRelations 填充 DXGK_CHILD_DESCRIPTOR 结构的数组:每个子设备各一个。 请注意,显示适配器的所有子设备都是板载设备:连接到显示适配器的监视器和其他外部设备不被视为子设备。 有关详细信息,请参阅 显示适配器的子设备DxgkDdiQueryChildRelations 必须枚举潜在的子设备以及初始化时物理存在的子设备。 例如,如果将笔记本电脑连接到扩展坞将导致出现新的视频输出, DxgkDdiQueryChildRelations 必须枚举该视频输出,而不考虑计算机是否在初始化时停靠。 此外,如果将硬件保护装置连接到视频输出连接器将允许多个监视器共享连接器, DxgkDdiQueryChildRelations 必须枚举硬件保护装置的每个分支的子设备,而不考虑硬件保护装置是否在初始化时连接。

  3. 对于按步骤 1) 中所述枚举的每个子设备 (,其 HPD 感知值为 HpdAwarenessInterruptible 或 HpdAwarenessPolled,显示端口驱动程序调用显示微型端口驱动程序的 DxgkDdiQueryChildStatus 函数,以确定子设备是否具有连接到它的外部设备。

  4. 显示端口驱动程序为每个满足以下条件之一的子设备创建 PDO:

    • 子设备具有 HpdAwarenessAlwaysConnected 的 HPD 感知值。
    • 子设备具有 HPdAwarenessPolledHpdAwarenessInterruptible 的 HPD 感知值,并且操作系统从前面的查询或通知中知道子设备已连接外部设备。
  5. 显示端口驱动程序为每个满足以下条件之一的子设备调用显示微型端口驱动程序的 DxgkDdiQueryDeviceDescriptor 函数:

    • 已知子设备已连接外部设备。
    • 假定子设备已连接外部设备。
    • 子设备的类型为 TypeOther

    如果连接的监视器 (或其他显示设备) 支持 EDID 描述符,DxgkDdiQueryDeviceDescriptor 将返回扩展显示信息数据 (EDID) 块。

    注意:在初始化期间,显示端口驱动程序为每个监视器调用 DxgkDdiQueryDeviceDescriptor ,以获取监视器 EDID 的第一个 128 字节块。 这为显示端口驱动程序提供了初始化时所需的内容:PnP 硬件 ID、实例 ID、兼容 ID 和设备文本。 稍后,监视器类函数驱动程序 (Monitor.sys) 为每个监视器调用 DxgkDdiQueryDeviceDescriptor ,以获取前一个 128 字节 EDID 块和其他 128 字节的 EDID 扩展块。 这意味着将调用显示微型端口驱动程序两次,以提供每个监视器的 EDID 的前 128 字节块。

  6. VidPN 管理器获取显示适配器支持的所有视频呈现源和视频呈现目标的标识符。 视频显示源由数字 0、1、...N - 1,其中 N 是显示微型端口驱动程序的 DxgkDdiStartDevice 函数返回的源数。 视频呈现目标具有之前由显示微型端口驱动程序在 DxgkDdiQueryChildRelations 期间创建的唯一整数标识符。 TypeVideoOutput 类型的每个子设备都与一个视频存在目标相关联,子设备DXGK_CHILD_DESCRIPTOR结构的 ChildUid 成员用作视频存在目标的标识符。

  7. VidPN 管理器使用以下过程生成初始 VidPN。

    • 如果最后一个已知良好的 VidPN 记录在注册表中,请使用它作为初始 VidPN。

    • 否则,调用显示微型端口驱动程序的 DxgkDdiRecommendFunctionalVidPn 函数以获取初始 VidPN。

    • 如果 DxgkDdiRecommendFunctionalVidPn 无法返回可接受的功能 VidPN,请创建包含一个视频当前路径的简单 VidPN;即,一个 (源、目标) 对。 调用显示微型端口驱动程序的 DxgkDdiIsSupportedVidPn 函数,以验证建议的 VidPN 是否正常工作。 如果 DxgkDdiIsSupportedVidPn 报告建议的 VidPN 将不起作用,请继续尝试,直到找到合适的 VidPN。

    • 调用显示微型端口驱动程序的 DxgkDdiEnumVidPnCofuncModality 函数,以确定可用于 VidPN 的源模式和目标模式。