WDDM 1.3 display miniport driver tasks to support Miracast wireless displays on Windows 8.1

Hinweis

Ab Windows 10 (WDDM 2.0) wird das Betriebssystem mit einem integrierten Miracast-Stapel ausgeliefert, der auf jeder GPU funktionieren kann. Informationen zum Microsoft Miracast-Stapel und zu den Anforderungen an Treiber und Hardware zur Unterstützung von Miracast-Displays ab Windows 10 finden Sie in der folgenden Dokumentation:

Treiberentwickler sollten keinen benutzerdefinierten Miracast-Stapel mehr implementieren. Microsoft kann die Unterstützung für benutzerdefinierte Miracast-Stapel in einer zukünftigen Version von Windows entfernen.

Um miracast wireless displays auf Windows 8.1 zu unterstützen, müssen WDDM 1.3-Anzeige-Miniporttreiber, die im Kernelmodus ausgeführt werden, die folgenden Aufgaben ausführen.

Unterstützung der Miracast-Schnittstelle

Wenn der WDDM 8.1-Anzeigeminiporttreiber Miracast-Displays unterstützt, muss er die DXGK_MIRACAST_DISPLAY_INTERFACE-Struktur melden, die Zeiger auf vom Treiber implementierte Miracast-Funktionen enthält, wenn das Microsoft DirectX-Grafikkernsubsystem die Funktion DxgkDdiQueryInterface aufruft.

Wenn das DirectX-Grafikkernsubsystem des Betriebssystems (Dxgkrnl.sys) die DxgkDdiQueryInterface-Funktion nicht aufruft, um die Miracast-Anzeigeschnittstelle abzufragen, unterstützt es keine drahtlosen Miracast-Displays, und der Anzeigeminiporttreiber sollte kein Miracast-Ziel melden.

Der Treiber sollte nicht mehr als ein Miracast-Ziel auf einem vollständigen WDDM-Grafikgerät melden, andernfalls kann das Betriebssystem den Adapter nicht starten.

Nachdem Dxgkrnl DxgkDdiQueryInterface aufgerufen hat, um die Miracast-Anzeigeschnittstelle abzufragen, kann der Treiber den Zieltyp während der Geräteinitialisierung als D3DKMDT_VOT_MIRACAST melden, wenn Dxgkrnl die DxgkDdiQueryChildRelations-Funktion aufruft .

Das Miracast-Ziel sollte in einem getrennten Zustand bleiben, bis Dxgkrnl eine verbundene Miracast-Sitzung startet. Wenn eine Miracast-Sitzung gestartet wird und ein Monitor mit der Miracast-Senke verbunden ist oder der Treiber eine E/A-Anforderung vom Miracast-Benutzermodustreiber empfängt, da ein neuer Monitor mit der Miracast-Senke verbunden ist, sollte der Display-Miniporttreiber einen HPD-Sensibilisierungswert (Monitor Arrival Hot-Plug Detection) an das Betriebssystem melden, indem er die DxgkCbIndicateChildStatus-Funktion aufruft . In diesem Aufruf sollte der Treiber die folgenden Werte in der DXGK_CHILD_STATUS-Struktur festlegen:

Mitglied Wert
Typ StatusMiracast-Konstantenwert der DXGK_CHILD_STATUS_TYPE-Enumeration
Miracast. Verbunden TRUE
Miracast. MiracastMonitorType Wert, der den Verbindungstyp angibt. Wenn die Miracast-Senke im Monitor oder TV eingebettet ist, sollte dieser Member auf den D3DKMDT_VOT_MIRACAST konstanten Wert der D3DKMDT_VIDEO_OUTPUT_TECHNOLOGY-Enumeration festgelegt werden.

In der folgenden Tabelle sind die Miracast-Funktionen aufgeführt, die der WDDM 1.3-Anzeigeminiporttreiber implementiert:

Funktion BESCHREIBUNG
DxgkDdiMiracastCreateContext Erstellt einen Kontext zum Starten eines Kernelmodus instance eines Miracast-Anzeigegeräts.
DxgkDdiMiracastDestroyContext Erstellt einen Kontext zum Starten eines Kernelmodus instance eines Miracast-Anzeigegeräts.
DxgkDdiMiracastIoControl Verarbeitet eine synchrone E/A-Anforderung, die von einem Miracast-Benutzermodustreiberaufruf an MiracastIoControl stammt.
DxgkDdiMiracastQueryCaps Fragt die Miracast-Funktionen der aktuellen Grafikkarte ab.

Starten der Miracast-Sitzung

Wenn die Miracast-Sitzung gestartet wurde, ruft das Betriebssystem die DxgkDdiQueryChildStatus-Funktion auf. Der Anzeigeminiporttreiber sollte DXGK_CHILD_STATUS festlegen. Geben Sie einen Wert von StatusMiracast ein, und verwenden Sie die untergeordnete Miracast-Struktur in DXGK_CHILD_STATUS. Wenn ein Monitor mit der Miracast-Senke verbunden ist, sollte der Treiber Miracast festlegen. MitD3DKMDT_VOT_MIRACAST verbunden.

Der Treiber muss den Wert von D3DKMDT_VIDEO_SIGNAL_INFO angeben. VsyncFreqDivider, das ist das Verhältnis der VSync-Rate eines Monitors, der über eine verbundene Miracast-Sitzung angezeigt wird, zur VSync-Rate der Miracast-Senke. Wenn die vertikale Aktualisierungsrate der Miracast-Senke beispielsweise 240 Hz beträgt und die VSync-Unterbrechungsfrequenz des verbundenen Displays 30 Hz beträgt, sollte der Treiber VsyncFreqDivider auf 8 festlegen.

Behandeln von Interrupts für abgeschlossene Codierungsblöcke

Die Daten für einen einzelnen Frame, der über die drahtlose Miracast-Verbindung übertragen wird, können in einen oder mehrere Codierungsblöcke unterteilt werden. Jedes Mal, wenn die GPU die Codierung eines dieser Blöcke abgeschlossen hat, muss ein Interrupt generiert werden. Als Reaktion auf diesen Interrupt muss der Anzeigeminiporttreiber die DxgkCbNotifyInterrupt-Funktion aufrufen und die untergeordnete MiracastEncodeChunkCompleted-Struktur in der DXGKARGCB_NOTIFY_INTERRUPT_DATA-Struktur abschließen, einschließlich festlegen des DXGK_INTERRUPT_TYPE Interrupttyps auf DXGK_INTERRUPT_MICACAST_CHUNK_PROCESSING_COMPLETE.

Im Rahmen der Interruptbehandlung kann der Treiber optional den MiracastEncodeChunkCompleted angeben. pPrivateDriverData - und PrivateDataDriverSize-Member in der DXGKARGCB_NOTIFY_INTERRUPT_DATA-Struktur . Der Benutzermodustreiber kann auf diese privaten Treiberdaten im MIRACAST_CHUNK_DATA zugreifen. PrivateDriverData-Member .

Wenn der Anzeigeminiporttreiber über einen bestimmten Zeitraum mehr Pakete mit Blockdaten generiert, als der Benutzermodusanzeigetreiber verbraucht, kann der verfügbare freie Speicherplatz für neue Blöcke knapp werden. In diesem Fall gibt der Anzeigeminiporttreiber STATUS_NO_MEMORY in MiracastEncodeChunkCompleted zurück. Status, und sie muss die DxgkCbNotifyDpc-Funktion aufrufen, um den GPU-Planer des Betriebssystems über die Fehlerbedingung zu benachrichtigen. Ein Aufruf der GetNextChunkData-Funktion gibt den STATUS_CONNECTION_RESET status Code zurück, und nachfolgende Aufrufe empfangen Blöcke, die nach dem Zurücksetzungsvorgang übermittelt wurden. Da einige Blöcke verloren gegangen sind, sollte der Treiber einen neuen I-Frame generieren und übertragen.

Einschränkungen für Quellmodi

Um Einschränkungen der Pixelpipeline zu behandeln, schränkt ein WDDM 1.3-Anzeigeminiporttreiber in der Regel Quellmodi ein, die für das Betriebssystem verfügbar gemacht werden. Dazu füllt der Treiber die Liste der Quellmodi nur mit Modi auf, die vom Monitor verfügbar gemacht werden, die auch von der Pixelpipeline unterstützt werden. Beispielsweise ändert der Treiber die EDID nicht basierend auf Pixelpipelineeinschränkungen.

In ähnlicher Weise schränkt der Anzeige-Miniporttreiber für Miracast-Anzeigen den Satz von Quellmodi ein, die dem Betriebssystem verfügbar gemacht werden, wenn er den Satz der Quell- und Zielmodi aufzählt. Für Miracast zeigt die GPU-Codierungsfunktionen, Netzwerkeigenschaften und Senke-Decodierungsfunktionen an, die die Anzahl der Quellmodi reduzieren können, die die Miracast-Pixelpipeline unterstützen kann.

Wenn ein Anzeigeminiporttreiber die Funktion DXGK_VIDPNSOURCEMODESET_INTERFACE::p fnAddMode aufruft , um zu versuchen, einer Quelle, die mit einem Miracast-Ziel verbunden ist, einen 3D-Stereomodus hinzuzufügen, schlägt der Funktionsaufruf fehl.

Aufrufen von vom Betriebssystem bereitgestellten Rückruffunktionen

Das Betriebssystem bietet die folgenden Rückruffunktionen im Miracast-Kernelmodus:

Funktion BESCHREIBUNG
DxgkCbMiracastSendMessage Sendet eine asynchrone Nachricht an den Benutzermodusanzeigetreiber.
DxgkCbMiracastSendMessageCallback Wird in einem Aufruf von DxgkCbMiracastSendMessage verwendet, um die IO_STATUS_BLOCK Struktur für die abgeschlossene IRP anzugeben.
DxgkCbReportChunkInfo
Meldet Informationen zu einem Codierungsblock.

Asynchrones Senden von Nachrichten aus dem Kernelmodus in den Benutzermodus

Jede Nachricht, die der Anzeigeminiporttreiber über einen DxgkCbMiracastSendMessage-Aufruf an den zugehörigen Benutzermodustreiber sendet, wird erst übermittelt, wenn die verbundene Miracast-Sitzung gestartet wurde. Wenn die StartMiracastSession-Funktion des Benutzermodustreibers noch nicht aufgerufen wurde, wird die gesendete Nachricht daher zurückgestellt, bis StartMiracastSession zurückgegeben wird. Wenn eine Nachricht gesendet wird, nachdem die Funktion StopMiracastSession aufgerufen wurde, wird die Nachricht vom Betriebssystem gelöscht, und die DxgkCbMiracastSendMessageCallback-Funktion wird aufgerufen, wobei der Fehler in pIoStatusBlock-Status> festgelegt status.

Ändern eines vorhandenen Display-Miniporttreibers zur Unterstützung von Miracast-Displays

Wenn die DxgkDdiStartDevice-Funktion aufgerufen wird, muss der Anzeigeminiporttreiber ein neues Miracast-Ziel hinzufügen und sollte den HpD-Bewusstseinswert (Hot-Plug Detection) des Ziels als HpdAwarenessInterruptible markieren, damit das Betriebssystem dieses Ziel nicht abruft. Wenn die DxgkDdiQueryChildRelations-Funktion aufgerufen wird, sollte der Treiber außerdem D3DKMDT_VOT_MIRACAST als Verbindungstyp melden.

Der Treiber sollte nicht mehr als ein Miracast-Ziel auf einem vollständigen WDDM-Grafikgerät melden. Wenn ein Treiber mehr als ein Miracast-Ziel meldet, schlägt das Betriebssystem beim Starten des Adapters fehl. Der Treiber sollte auch keinen Monitor für dieses Ziel melden, wenn die verbundene Miracast-Sitzung nicht gestartet wird.

Der Treiber muss auch eine richtige DXGK_MIRACAST_DISPLAY_INTERFACE-Struktur mit Zeigern auf Funktionen melden, die sich im Kernelmodus-Adressraum befinden, wenn das DirectX-Grafikkernsubsystem die DxgkDdiQueryInterface-Funktion aufruft.

Wenn eine Miracast-Sitzung gestartet wird und ein Monitor an die Miracast-Senke angeschlossen ist, sollte der Display-Miniporttreiber die DXGK_CHILD_STATUS festlegen. Geben Sie Member für den Konstantenwert StatusMiracast ein, und sollte auch DXGK_CHILD_STATUS festlegen. Miracast. MitTRUE verbunden, um einen HPD-Monitor an das Betriebssystem zu melden. Der Treiber sollte den DXGK_CHILD_STATUS festlegen. Miracast. MiracastMonitorType-Member zum richtigen Monitortyp, der mit der Senke verbunden ist. Wenn die Senke Teil des Monitors ist, sollte dieser Member auf D3DKMDT_VOT_MIRACAST festgelegt werden.

Wenn der Treiber die EDID des Monitors kennt, sollte er diese EDID melden, wenn das Betriebssystem die DxgkDdiQueryDeviceDescriptor-Funktion aufruft.

Abhängig von den Hardwarefunktionen, der Miracast-Senkenmodusliste und der Netzwerkbandbreite sollte der Treiber den richtigen Quellmodus, Zielmodus, Rotationsmodus und Skalierungsmodus melden. Für den Zielmodus sollte der Treiber den richtigen VSyncFreqDivider-Memberwert in D3DKMDT_VIDEO_SIGNAL_INFO melden. Das Betriebssystem vergleicht den Zielmodus mit dem Monitormodus und schneidet jeden Modus, den der Monitor nicht unterstützt.