Auflisten untergeordneter Geräte eines Grafikkartes
In der folgenden Schrittfolge wird beschrieben, wie der Anzeigeporttreiber, der Anzeigeminiporttreiber und der VidPN-Manager (Video Present Network) zur Initialisierungszeit zusammenarbeiten, um untergeordnete Geräte eines Grafikkartes aufzulisten.
Der Anzeigeporttreiber ruft die DxgkDdiStartDevice-Funktion des Anzeigeminiporttreibers auf. DxgkDdiStartDevice gibt (im Parameter NumberOfChildren ) die Anzahl der Geräte zurück, die untergeordnete Elemente der Grafikkarte sind (oder werden könnten, indem sie andocken). DxgkDdiStartDevice gibt (im Parameter NumberOfVideoPresentSources ) auch die Anzahl N der von der Grafikkarte unterstützten Videoquellen zurück. Diese Videoquellen werden anschließend durch die Zahlen 0, 1, ... N -1.
Der Anzeigeporttreiber ruft die DxgkDdiQueryChildRelations-Funktion des Anzeigeminiporttreibers auf, die untergeordnete Geräte der Grafikkarte aufzählt. DxgkDdiQueryChildRelations füllt ein Array von DXGK_CHILD_DESCRIPTOR Strukturen aus: eine für jedes untergeordnete Gerät. Beachten Sie, dass alle untergeordneten Geräte der Grafikkarte on-board sind: Monitore und andere externe Geräte, die mit der Grafikkarte verbunden sind, gelten nicht als untergeordnete Geräte. Weitere Informationen finden Sie unter Untergeordnete Geräte der Grafikkarte. DxgkDdiQueryChildRelations muss potenzielle untergeordnete Geräte sowie die untergeordneten Geräte auflisten, die zur Initialisierungszeit physisch vorhanden sind. Wenn beispielsweise das Verbinden eines Laptopcomputers mit einer Dockingstation dazu führt, dass eine neue Videoausgabe angezeigt wird, muss DxgkDdiQueryChildRelations diese Videoausgabe aufzählen, unabhängig davon, ob der Computer zur Initialisierungszeit angedockt ist. Wenn beim Verbinden eines Dongles mit einem Videoausgabeconnector mehrere Monitore den Connector gemeinsam nutzen können, muss DxgkDdiQueryChildRelations ein untergeordnetes Gerät für jeden Branch des Dongles aufzählen, unabhängig davon, ob der Dongle zur Initialisierungszeit verbunden ist.
Für jedes untergeordnete Gerät (aufgezählt wie in Schritt 1 beschrieben), das über den HPD-Erkennungswert HpdAwarenessInterruptible oder HpdAwarenessPolled verfügt, ruft der Anzeigeporttreiber die DxgkDdiQueryChildStatus-Funktion des Anzeigeminiporttreibers auf, um zu bestimmen, ob ein externes Gerät mit dem untergeordneten Gerät verbunden ist.
Der Anzeigeporttreiber erstellt eine PDO für jedes untergeordnete Gerät, das eine der folgenden Bedingungen erfüllt:
- Das untergeordnete Gerät hat den HPD-Sensibilisierungswert HpdAwarenessAlwaysConnected.
- Das untergeordnete Gerät weist den HPD-Erkennungswert HpdAwarenessPolled oder HpdAwarenessInterruptible auf, und das Betriebssystem weiß aus einer vorherigen Abfrage oder Benachrichtigung, dass das untergeordnete Gerät über ein externes Gerät verbunden ist.
Der Anzeigeporttreiber ruft die DxgkDdiQueryDeviceDescriptor-Funktion des Anzeigeminiporttreibers für jedes untergeordnete Gerät auf, das eine der folgenden Bedingungen erfüllt:
- Es ist bekannt, dass ein externes Gerät an das untergeordnete Gerät angeschlossen ist.
- Es wird davon ausgegangen, dass ein externes Gerät an das untergeordnete Gerät angeschlossen ist.
- Das untergeordnete Gerät weist den Typ TypeOther auf.
DxgkDdiQueryDeviceDescriptor gibt einen EDID-Block (Extended Display Information Data) zurück, wenn der verbundene Monitor (oder ein anderes Anzeigegerät) EDID-Deskriptoren unterstützt.
Hinweis: Während der Initialisierung ruft der Anzeigeporttreiber DxgkDdiQueryDeviceDescriptor für jeden Monitor auf, um den ersten 128-Byte-Block der EDID des Monitors abzurufen. Dies gibt dem Anzeigeporttreiber das, was er zur Initialisierungszeit benötigt: PnP-Hardware-ID, instance-ID, kompatible IDs und Gerätetext. Zu einem späteren Zeitpunkt ruft der Monitor class function driver (Monitor.sys) DxgkDdiQueryDeviceDescriptor für jeden Monitor auf, um den ersten 128-Byte-EDID-Block und zusätzliche EDID-Erweiterungsblöcke mit 128 Byte abzurufen. Dies bedeutet, dass der Anzeige-Miniporttreiber zweimal aufgerufen wird, um den ersten 128-Byte-Block der EDID jedes Monitors bereitzustellen.
Der VidPN-Manager ruft Bezeichner für alle vorhandenen Videoquellen und Videoinhalte ab, die von der Grafikkarte unterstützt werden. Die vorliegenden Videoquellen werden durch die Zahlen 0, 1, ... N - 1, wobei N die Anzahl der Quellen ist, die von der DxgkDdiStartDevice-Funktion des Anzeigeminiporttreibers zurückgegeben werden. Die videoseitigen Ziele verfügen über eindeutige ganzzahlige Bezeichner, die zuvor vom Anzeigeminiporttreiber während DxgkDdiQueryChildRelations erstellt wurden. Jedes untergeordnete Gerät vom Typ TypeVideoOutput ist einem Videoziel zugeordnet, und der ChildUid-Member der DXGK_CHILD_DESCRIPTOR Struktur des untergeordneten Geräts wird als Bezeichner für das video vorliegende Ziel verwendet.
Der VidPN-Manager verwendet das folgende Verfahren, um eine anfängliche VidPN zu erstellen.
Wenn eine letzte als gut bekannte VidPN in der Registrierung aufgezeichnet wird, verwenden Sie sie als anfängliche VidPN.
Rufen Sie andernfalls die DxgkDdiRecommendFunctionalVidPn-Funktion des Anzeigeminiporttreibers auf, um eine anfängliche VidPN zu erhalten.
Wenn DxgkDdiRecommendFunctionalVidPn keinen funktionsfähigen VidPN zurückgibt, der akzeptabel ist, erstellen Sie eine einfache VidPN, die einen vorhandenen Videopfad enthält. d. h. ein Paar (Quelle, Ziel). Rufen Sie die DxgkDdiIsSupportedVidPn-Funktion des Anzeigeminiporttreibers auf, um zu überprüfen, ob die vorgeschlagene VidPN funktioniert. Wenn DxgkDdiIsSupportedVidPn meldet, dass die vorgeschlagene VidPN nicht funktioniert, versuchen Sie es weiterhin, bis eine geeignete VidPN gefunden wird.
Rufen Sie die DxgkDdiEnumVidPnCofuncModality-Funktion des Anzeigeminiporttreibers auf, um die Für die VidPN verfügbaren Quell- und Zielmodi zu ermitteln.