WDDM 子设备的枚举过程
这里的子设备指的是显示适配器(display adapter)的子设备。
显示适配器子设备的枚举是通过显示端口驱动程序(display port driver), 显示Mini端口驱动程序(display miniport driver), and video present network (VidPN) manager的协作来完成的。
显示端口驱动程序调用显示Mini端口驱动程序的 DxgkDdiStartDevice 函数。 DxgkDdiStartDevice 在 NumberOfChildren 参数中返回 显示适配器的子设备数。 DxgkDdiStartDevice 还会在 NumberOfVideoPresentSources 参数中返回显示适配器所支持的视频显示源的第 N 个。 随后,这些视频源会由数字0,1,.。。N-1。
显示端口驱动程序调用显示Mini端口驱动程序的 DxgkDdiQueryChildRelations 函数,该函数枚举显示适配器的子设备。Mini端口驱动程序在函数 DxgkDdiQueryChildRelations中为每个子设备对应的结构体中填充该设备的属性信息。
- 对于每个类型为HpdAwarenessInterruptible 或 HpdAwarenessPolled的子设备,,显示端口驱动程序会调用Mini端口驱动程序的DxgkDdiQueryChildStatus 函数来确定子设备是否有连接的外部设备。
显示端口驱动程序为满足以下条件之一的每个子设备创建一个 PDO:
- 子设备的 HpdAwareness 值为 HpdAwarenessAlwaysConnected。
- 子设备的 HpdAwareness 为 HpdAwarenessPolled 或 HpdAwarenessInterruptible,操作系统从上一个查询或通知子设备已连接到外部设备。
显示端口驱动程序为每个满足以下条件之一的子设备调用显示微型端口驱动程序的 DxgkDdiQueryDeviceDescriptor 函数:
- 已知子设备已连接外部设备。
- 假定子设备已连接外部设备。
- 子设备的类型为 TypeOther。
如果连接的监视器 (或其他显示设备) 支持 EDID 描述符, DxgkDdiQueryDeviceDescriptor 将返回扩展的显示信息数据 (EDID) 块。
注意:在初始化期间,显示端口驱动程序对每个监视器调用 DxgkDdiQueryDeviceDescriptor ,以获取监视器 EDID 的第一个128字节块。 这为显示端口驱动程序在初始化时所需的内容: PnP 硬件 ID、实例 ID、兼容 Id 和设备文本。 稍后,monitor 类函数驱动程序 ( # A0) 为每个监视器调用 DxgkDdiQueryDeviceDescriptor ,以获取第一个128字节的 edid 块和额外的128字节 edid 扩展块。 这意味着将调用显示微型端口驱动程序两次,以提供每个监视器 EDID 的第一个128字节块。
VidPN 管理器会为显示适配器支持的所有视频源和视频提供目标获取标识符。 视频显示源由数字0,1,.。。N-1,其中 N 是显示微型端口驱动程序的 DxgkDdiStartDevice 函数返回的源的数目。 视频显示目标具有唯一的整数标识符,这些标识符之前是在 DxgkDdiQueryChildRelations 过程中由显示微型端口驱动程序创建的。 TypeVideoOutput 类型的每个子设备都与视频显示目标相关联,子设备的 DXGK 子描述符结构的 ChildUid 成员 将用作视频显示目标的标识符。
VidPN 管理器使用以下过程来生成初始 VidPN。
如果在注册表中记录了最后一个已知良好的 VidPN,请将其用作初始 VidPN。否则,调用显示微型端口驱动程序的 DxgkDdiRecommendFunctionalVidPn 函数以获取初始 VidPN。
如果 DxgkDdiRecommendFunctionalVidPn 未能返回可接受的功能 vidpn,请创建包含一个视频显示路径的简单 vidpn;这就是一个 (源,目标) 对。 调用显示微型端口驱动程序的 DxgkDdiIsSupportedVidPn 函数,验证建议的 VidPN 是否正常工作。 如果 DxgkDdiIsSupportedVidPn 报告建议的 vidpn 将不起作用,请继续尝试,直到找到合适的 vidpn。
调用显示微型端口驱动程序的 DxgkDdiEnumVidPnCofuncModality 函数来确定适用于 VidPN 的源和目标模式。