Énumération des appareils enfants d’une carte graphique
La séquence d’étapes suivante décrit comment le pilote de port d’affichage, le pilote de miniport d’affichage et le gestionnaire de réseau VidPN (Video Present Network) collaborent au moment de l’initialisation pour énumérer les périphériques enfants d’une carte graphique.
Le pilote de port d’affichage appelle la fonction DxgkDdiStartDevice du pilote miniport d’affichage. DxgkDdiStartDevice retourne (dans le paramètre NumberOfChildren ) le nombre d’appareils qui sont (ou peuvent devenir en ancrer) des enfants de l’adaptateur d’affichage. DxgkDdiStartDevice retourne également (dans le paramètre NumberOfVideoPresentSources ) le nombre N de sources vidéo présentes prises en charge par l’adaptateur d’affichage. Ces sources présentes vidéo seront ensuite identifiées par les numéros 0, 1, ... N -1.
Le pilote de port d’affichage appelle la fonction DxgkDdiQueryChildRelations du pilote miniport d’affichage, qui énumère les périphériques enfants de l’adaptateur d’affichage. DxgkDdiQueryChildRelations remplit un tableau de structures DXGK_CHILD_DESCRIPTOR : une pour chaque appareil enfant. Notez que tous les appareils enfants de l’adaptateur d’affichage sont intégrés : les moniteurs et autres périphériques externes qui se connectent à l’adaptateur graphique ne sont pas considérés comme des appareils enfants. Pour plus d’informations, consultez Appareils enfants de l’adaptateur graphique. DxgkDdiQueryChildRelations doit énumérer les appareils enfants potentiels ainsi que les appareils enfants physiquement présents au moment de l’initialisation. Par exemple, si la connexion d’un ordinateur portable à une station d’accueil entraîne l’apparition d’une nouvelle sortie vidéo, DxgkDdiQueryChildRelations doit énumérer cette sortie vidéo, que l’ordinateur soit ancré ou non au moment de l’initialisation. En outre, si la connexion d’un dongle à un connecteur de sortie vidéo permet à plusieurs moniteurs de partager le connecteur, DxgkDdiQueryChildRelations doit énumérer un appareil enfant pour chaque branche du dongle, que le dongle soit connecté ou non au moment de l’initialisation.
Pour chaque appareil enfant (énuméré comme décrit à l’étape 1) qui a une valeur de sensibilisation HPD hpdAwarenessInterruptible ou HpdAwarenessPolled, le pilote de port d’affichage appelle la fonction DxgkDdiQueryChildStatus du pilote miniport d’affichage pour déterminer si l’appareil enfant a un appareil externe connecté à celui-ci.
Le pilote de port d’affichage crée un PDO pour chaque appareil enfant qui remplit l’une des conditions suivantes :
- L’appareil enfant a une valeur de sensibilisation HPD de HpdAwarenessAlwaysConnected.
- L’appareil enfant a une valeur de sensibilisation HPD hpdAwarenessPolled ou HpdAwarenessInterruptible, et le système d’exploitation sait par une requête ou une notification précédente que l’appareil enfant a un appareil externe connecté.
Le pilote de port d’affichage appelle la fonction DxgkDdiQueryDeviceDescriptor du pilote miniport d’affichage pour chaque appareil enfant qui satisfait à l’une des conditions suivantes :
- L’appareil enfant est connu pour avoir un appareil externe connecté.
- L’appareil enfant est supposé avoir un appareil externe connecté.
- L’appareil enfant a un type TypeOther.
DxgkDdiQueryDeviceDescriptor retourne un bloc EDID (Extended Display Information Data) si le moniteur connecté (ou tout autre périphérique d’affichage) prend en charge les descripteurs EDID.
Remarque : Pendant l’initialisation, le pilote de port d’affichage appelle DxgkDdiQueryDeviceDescriptor pour chaque moniteur afin d’obtenir le premier bloc de 128 octets de l’EDID du moniteur. Cela donne au pilote de port d’affichage ce dont il a besoin au moment de l’initialisation : ID matériel PnP, ID de instance, ID compatibles et texte du périphérique. Ultérieurement, le pilote de fonction de classe monitor (Monitor.sys) appelle DxgkDdiQueryDeviceDescriptor pour chaque moniteur afin d’obtenir le premier bloc EDID de 128 octets et les blocs d’extension EDID supplémentaires de 128 octets. Cela signifie que le pilote miniport d’affichage sera appelé deux fois pour fournir le premier bloc de 128 octets de l’EDID de chaque moniteur.
Le gestionnaire VidPN obtient des identificateurs pour toutes les sources vidéo présentes et les cibles de présentation vidéo prises en charge par la carte graphique. Les sources présentes de la vidéo sont identifiées par les nombres 0, 1, ... N - 1, où N est le nombre de sources retournées par la fonction DxgkDdiStartDevice du pilote miniport d’affichage. Les cibles présentes vidéo ont des identificateurs entiers uniques qui ont été créés précédemment par le pilote de miniport d’affichage pendant DxgkDdiQueryChildRelations. Chaque appareil enfant de type TypeVideoOutput est associé à une cible de présentation vidéo, et le membre ChildUid de la structure DXGK_CHILD_DESCRIPTOR de l’appareil enfant est utilisé comme identificateur de la cible vidéo présente.
Le gestionnaire VidPN utilise la procédure suivante pour générer un VidPN initial.
Si un dernier VidPN correct connu est enregistré dans le Registre, utilisez-le comme VidPN initial.
Sinon, appelez la fonction DxgkDdiRecommendFunctionalVidPn du pilote miniport d’affichage pour obtenir un VidPN initial.
Si DxgkDdiRecommendFunctionalVidPn ne parvient pas à retourner un VidPN fonctionnel acceptable, créez un VidPN simple qui contient un chemin d’accès vidéo présent ; c’est-à-dire une paire (source, cible). Appelez la fonction DxgkDdiIsSupportedVidPn du pilote miniport d’affichage pour vérifier que le VidPN proposé fonctionnera. Si DxgkDdiIsSupportedVidPn signale que le VidPN proposé ne fonctionnera pas, continuez à essayer jusqu’à ce qu’un VidPN approprié soit trouvé.
Appelez la fonction DxgkDdiEnumVidPnCofuncModality du pilote miniport d’affichage pour déterminer les modes source et cible disponibles pour le VidPN.