Перечисление дочерних устройств видеоадаптера
В следующей последовательности шагов описывается, как драйвер порта дисплея, драйвер мини-порта дисплея и диспетчер сети видеотрансляций (VidPN) совместно работают во время инициализации для перечисления дочерних устройств видеоадаптера.
Драйвер порта дисплея вызывает функцию DxgkDdiStartDevice драйвера минипорта дисплея. DxgkDdiStartDevice возвращает (в параметре NumberOfChildren ) количество устройств, которые являются (или могут стать дочерними элементами) видеоадаптера. DxgkDdiStartDevice также возвращает (в параметре NumberOfVideoPresentSources ) число N источников представления видео, поддерживаемых видеоадаптером. Эти видео-источники будут впоследствии идентифицированы по номерам 0, 1, ... N -1.
Драйвер порта дисплея вызывает функцию DxgkDdiQueryChildRelations драйвера минипорта дисплея, которая перечисляет дочерние устройства видеоадаптера. DxgkDdiQueryChildRelations заполняет массив DXGK_CHILD_DESCRIPTOR структур: по одной для каждого дочернего устройства. Обратите внимание, что все дочерние устройства видеоадаптера являются встроенными: мониторы и другие внешние устройства, подключающиеся к адаптеру дисплея, не считаются дочерними устройствами. Дополнительные сведения см. в разделе Дочерние устройства видеоадаптера. DxgkDdiQueryChildRelations должен перечислять потенциальные дочерние устройства, а также дочерние устройства, которые физически присутствуют во время инициализации. Например, если подключение ноутбука к док-станции приведет к появлению нового видеовыхода, DxgkDdiQueryChildRelations должен перечислить эти выходные данные независимо от того, закреплен ли компьютер во время инициализации. Кроме того, если подключение аппаратных ключей к соединителю вывода видео позволит нескольким мониторам совместно использовать соединитель, DxgkDdiQueryChildRelations должен перечислить дочернее устройство для каждой ветви ключа, независимо от того, подключен ли аппаратный ключ во время инициализации.
Для каждого дочернего устройства (перечисленного, как описано в шаге 1), которое имеет значение hpdAwarenessInterruptible или HpdAwarenessPolled, драйвер порта дисплея вызывает функцию DxgkDdiQueryChildStatus драйвера дисплея, чтобы определить, подключено ли к нему внешнее устройство.
Драйвер порта отображения создает PDO для каждого дочернего устройства, которое удовлетворяет одному из следующих условий:
- Дочернее устройство имеет значение hpdAwarenessAlwaysConnected.
- Дочернее устройство имеет значение hpdAwarenessPolled или HpdAwarenessInterruptible, а операционная система знает из предыдущего запроса или уведомления, что к дочернему устройству подключено внешнее устройство.
Драйвер порта дисплея вызывает функцию DxgkDdiQueryDeviceDescriptor драйвера дисплея miniport для каждого дочернего устройства, которое удовлетворяет одному из следующих условий:
- Известно, что к дочернему устройству подключено внешнее устройство.
- Предполагается, что к дочернему устройству подключено внешнее устройство.
- Дочернее устройство имеет тип TypeOther.
DxgkDdiQueryDeviceDescriptor возвращает блок EDID, если подключенный монитор (или другое устройство отображения) поддерживает дескрипторы EDID.
Примечание. Во время инициализации драйвер порта дисплея вызывает DxgkDdiQueryDeviceDescriptor для каждого монитора, чтобы получить первый 128-байтный блок EDID монитора. Это дает драйверу порта дисплея то, что ему нужно во время инициализации: идентификатор оборудования PnP, идентификатор экземпляра, совместимые идентификаторы и текст устройства. Позже драйвер функции класса монитора (Monitor.sys) вызывает DxgkDdiQueryDeviceDescriptor для каждого монитора , чтобы получить первый 128-байтный блок EDID и дополнительные 128-байтовые блоки расширения EDID. Это означает, что драйвер минипорта дисплея будет вызываться дважды для предоставления первого 128-байтового блока EDID каждого монитора.
Диспетчер VidPN получает идентификаторы для всех источников видеотрансляций и целевых объектов видеотрансляций, поддерживаемых видеоадаптером. Источники видео-презентации идентифицируются по числам 0, 1, ... N – 1, где N — количество источников, возвращаемых функцией DxgkDdiStartDevice драйвера дисплея miniport. Целевые объекты, представленные на видео, имеют уникальные целочисленные идентификаторы, которые ранее были созданы драйвером мини-порта дисплея во время DxgkDdiQueryChildRelations. Каждое дочернее устройство типа TypeVideoOutput связано с целевым объектом представления видео, а элемент ChildUid структуры DXGK_CHILD_DESCRIPTOR дочернего устройства используется в качестве идентификатора целевого объекта видеопретирования.
Диспетчер VidPN использует следующую процедуру для создания начального VidPN.
Если последний известный VidPN записывается в реестр, используйте его в качестве начального VidPN.
В противном случае вызовите функцию DxgkDdiRecommendFunctionalVidPn драйвера минипорта дисплея, чтобы получить начальное значение VidPN.
Если DxgkDdiRecommendFunctionalVidPn не может вернуть допустимый функциональный VidPN, создайте простой VidPN, содержащий один путь представления видео; то есть одна (исходная, целевая) пара. Вызовите функцию DxgkDdiIsSupportedVidPn драйвера мини-порта дисплея, чтобы убедиться, что предложенный VidPN будет работать. Если DxgkDdiIsSupportedVidPn сообщает, что предлагаемый VidPN не будет работать, продолжайте пытаться, пока не будет найден подходящий VidPN.
Вызовите функцию DxgkDdiEnumVidPnCofuncModality драйвера мини-порта дисплея, чтобы определить исходный и целевой режимы, доступные для VidPN.