WdDM 1.3 visualizza le attività del driver miniport per supportare le visualizzazioni wireless Miracast su Windows 8.1
Nota
A partire da Windows 10 (WDDM 2.0), il sistema operativo viene fornito con uno stack Miracast predefinito che può funzionare su qualsiasi GPU. Per informazioni sullo stack Microsoft Miracast e sui requisiti dei driver e dell'hardware per supportare le visualizzazioni Miracast a partire da Windows 10, vedere la documentazione seguente:
Creazione di soluzioni di proiezione Wireless di alto livello con Windows 10
La documentazione di WHLK pertinente in Device.Graphics.WDDM13.DisplayRender.WirelessDisplay
Gli sviluppatori di driver non devono più implementare uno stack Miracast personalizzato. Microsoft potrebbe rimuovere il supporto per gli stack Miracast personalizzati in una versione futura di Windows.
Per supportare le visualizzazioni wireless Miracast su Windows 8.1, i driver miniport di WDDM 1.3 che vengono eseguiti in modalità kernel devono eseguire le attività seguenti.
Supporto dell'interfaccia Miracast
Se il driver miniport di visualizzazione WDDM 8.1 supporta le visualizzazioni Miracast, deve segnalare la struttura DXGK_MIRACAST_DISPLAY_INTERFACE , che include puntatori alle funzioni Miracast implementate dal driver, quando il sottosistema kernel di grafica Microsoft DirectX chiama la funzione DxgkDdiQueryInterface .
Se il sottosistema del kernel grafico DirectX del sistema operativo (Dxgkrnl.sys) non chiama la funzione DxgkDdiQueryInterface per eseguire una query sull'interfaccia di visualizzazione Miracast, non supporta le visualizzazioni wireless Miracast e il driver miniport di visualizzazione non deve segnalare alcuna destinazione Miracast.
Il driver non deve segnalare più di una destinazione Miracast in qualsiasi dispositivo grafico WDDM completo, altrimenti il sistema operativo non avvia la scheda.
Dopo che Dxgkrnl chiama DxgkDdiQueryInterface per eseguire una query sull'interfaccia di visualizzazione Miracast, il driver può quindi segnalare il tipo di destinazione come D3DKMDT_VOT_MIRACAST durante l'inizializzazione del dispositivo quando Dxgkrnl chiama la funzione DxgkDdiQueryChildRelations .
La destinazione Miracast deve rimanere in uno stato disconnesso fino a quando Dxgkrnl non avvia una sessione connessa Miracast. Quando si avvia una sessione Miracast e un monitoraggio è connesso al sink Miracast o il driver riceve una richiesta di I/O dal driver Miracast in modalità utente perché un nuovo monitor è connesso al sink Miracast, il driver miniport di visualizzazione deve segnalare un valore di rilevamento del plug-hot di arrivo del monitor al sistema operativo chiamando la funzione DxgkCbIndicateChildStatus . In questa chiamata, il driver deve impostare i valori seguenti nella struttura DXGK_CHILD_STATUS :
Membro | Valore |
---|---|
Tipo | Valore costante StatusMiracastdell'enumerazione DXGK_CHILD_STATUS_TYPE |
Miracast. Collegato | TRUE |
Miracast. MiracastMonitorType | Valore che indica il tipo di connessione. Se il sink Miracast è incorporato nel monitor o nel televisore, questo membro deve essere impostato sul valore costante D3DKMDT_VOT_MIRACAST dell'enumerazione D3DKMDT_VIDEO_OUTPUT_TECHNOLOGY . |
La tabella seguente elenca le funzioni Miracast implementate dal driver miniport WDDM 1.3:
Funzione | Descrizione |
---|---|
DxgkDdiMiracastCreateContext | Crea un contesto per avviare un'istanza in modalità kernel di un dispositivo di visualizzazione Miracast. |
DxgkDdiMiracastDestroyContext | Crea un contesto per avviare un'istanza in modalità kernel di un dispositivo di visualizzazione Miracast. |
DxgkDdiMiracastIoControl | Elabora una richiesta di I/O sincrona che ha origine da una chiamata driver in modalità utente Miracast a MiracastIoControl. |
DxgkDdiMiracastQueryCaps | Esegue una query sulle funzionalità Miracast dell'adattatore di visualizzazione corrente. |
Avvio della sessione Miracast
Quando la sessione Miracast è stata avviata, il sistema operativo chiama la funzione DxgkDdiQueryChildStatus . Il driver miniport di visualizzazione deve impostare DXGK_CHILD_STATUS. Digitare un valore di StatusMiracast e usare la struttura figlio Miracast in DXGK_CHILD_STATUS. Se un monitoraggio è connesso al sink Miracast, il driver deve impostare Miracast. Connesso a D3DKMDT_VOT_MIRACAST.
Il driver deve specificare il valore di D3DKMDT_VIDEO_SIGNAL_INFO. VsyncFreqDivider, ovvero il rapporto tra la frequenza VSync di un monitor che viene visualizzato tramite una sessione connessa Miracast alla frequenza VSync del sink Miracast. Ad esempio, se la frequenza di aggiornamento verticale del sink Miracast è 240 Hz e la frequenza di interruzione VSync dello schermo connesso è 30 Hz, il driver deve impostare VsyncFreqDivider su 8.
Gestione degli interrupt per i blocchi di codifica completati
I dati per un singolo frame trasmesso attraverso la connessione Miracast wireless possono essere suddivisi in uno o più blocchi di codifica. Ogni volta che la GPU completa la codifica di uno di questi blocchi, deve generare un interrupt. In risposta a questo interrupt, il driver miniport di visualizzazione deve chiamare la funzione DxgkCbNotifyInterrupt e completare la struttura figlio MiracastEncodeChunkCompleted nella struttura DXGKARGCB_NOTIFY_INTERRUPT_DATA , inclusa l'impostazione del tipo di interrupt DXGK_INTERRUPT_TYPE su DXGK_INTERRUPT_MICACAST_CHUNK_PROCESSING_COMPLETE.
Come parte della gestione degli interrupt, il driver può facoltativamente specificare MiracastEncodeChunkCompleted. Membri pPrivateDriverData e PrivateDataDriverSize nella struttura DXGKARGCB_NOTIFY_INTERRUPT_DATA . Il driver in modalità utente può accedere a questi dati del driver privato nel MIRACAST_CHUNK_DATA. Membro PrivateDriverData .
Se, in un periodo di tempo, il driver miniport di visualizzazione genera più pacchetti con dati in blocchi rispetto al driver di visualizzazione in modalità utente, lo spazio di memoria disponibile per i nuovi blocchi può essere esaurito. In questo caso il driver miniport di visualizzazione restituisce STATUS_NO_MEMORY in MiracastEncodeChunkCompleted. Stato e deve chiamare la funzione DxgkCbNotifyDpc per notificare all'utilità di pianificazione GPU del sistema operativo la condizione di errore. Una chiamata alla funzione GetNextChunkData restituirà il codice di stato STATUS_CONNECTION_RESET e le chiamate successive inizieranno a ricevere blocchi inviati dopo l'operazione di reimpostazione. Poiché alcuni blocchi sono stati persi, il driver dovrebbe generare e trasmettere un nuovo I-frame.
Restrizioni per le modalità di origine
Per gestire i vincoli della pipeline in pixel, un driver miniport di visualizzazione WDDM 1.3 limita in genere le modalità di origine esposte al sistema operativo. Il driver lo fa popolando solo l'elenco delle modalità di origine con le modalità esposte dal monitor supportato anche dalla pipeline pixel. Ad esempio, il driver non modifica l'EDID in base ai vincoli della pipeline pixel.
Analogamente, per Miracast visualizza il driver miniport di visualizzazione limita il set di modalità di origine esposte al sistema operativo quando enumera il set di modalità di origine e di destinazione. Per Miracast vengono visualizzate le funzionalità di codifica GPU, le proprietà di rete e le funzionalità di decodifica sink possono ridurre il numero di modalità di origine che la pipeline di pixel Miracast può supportare.
Se un driver miniport di visualizzazione chiama la funzione DXGK_VIDPNSOURCEMODESET_INTERFACE::p fnAddMode per tentare di aggiungere una modalità stereo 3D a un'origine connessa a una destinazione Miracast, la chiamata di funzione ha esito negativo.
Chiamata di funzioni di callback fornite dal sistema operativo
Il sistema operativo fornisce le funzioni di callback in modalità kernel Miracast seguenti:
Funzione | Descrizione |
---|---|
DxgkCbMiracastSendMessage | Invia un messaggio asincrono al driver di visualizzazione in modalità utente. |
DxgkCbMiracastSendMessageCallback | Usato in una chiamata a DxgkCbMiracastSendMessage per specificare la struttura IO_STATUS_BLOCK per l'IRP completato. |
DxgkCbReportChunkInfo | |
Segnala informazioni su un blocco di codifica. |
Invio di messaggi in modo asincrono dalla modalità kernel alla modalità utente
Qualsiasi messaggio inviato dal driver miniport di visualizzazione al driver in modalità utente associato tramite una chiamata DxgkCbMiracastSendMessage non viene recapitata fino all'avvio della sessione connessa Miracast. Pertanto, se la funzione StartMiracastSession del driver in modalità utente non è ancora stata chiamata, il messaggio inviato viene posticipato fino a quando StartMiracastSession non viene restituito . Se viene inviato un messaggio dopo la chiamata della funzione StopMiracastSession, il messaggio viene eliminato dal sistema operativo e la funzione DxgkCbMiracastSendMessageCallback viene chiamata con lo stato di errore impostato in pIoStatusBlock-Status>.
Modifica di un driver miniport di visualizzazione esistente per supportare le visualizzazioni Miracast
Quando viene chiamata la funzione DxgkDdiStartDevice , il driver miniport di visualizzazione deve aggiungere una nuova destinazione Miracast e contrassegnare il valore di consapevolezza del plug-hot di destinazione come HpdAwarenessInterruptible in modo che il sistema operativo non esegua il polling di questa destinazione. Inoltre, quando viene chiamata la funzione DxgkDdiQueryChildRelations , il driver deve segnalare D3DKMDT_VOT_MIRACAST come tipo di connessione.
Il driver non deve segnalare più di una destinazione Miracast in qualsiasi dispositivo grafico WDDM completo. Se un driver segnala più di una destinazione Miracast, il sistema operativo non riesce all'avvio dell'adattatore. Il driver non deve inoltre segnalare alcun monitoraggio su questa destinazione se la sessione connessa Miracast non viene avviata.
Il driver deve anche segnalare una struttura di DXGK_MIRACAST_DISPLAY_INTERFACE corretta, con puntatori a funzioni che si trovano nello spazio di indirizzi in modalità kernel, quando il sottosistema del kernel grafico DirectX chiama la funzione DxgkDdiQueryInterface .
Quando si avvia una sessione Miracast e un monitor è connesso al sink Miracast, il driver miniport di visualizzazione deve impostare il DXGK_CHILD_STATUS. Membro del tipo sul valore della costante StatusMiracast e deve anche impostare DXGK_CHILD_STATUS. Miracast. Connesso a TRUE per segnalare un HPD di arrivo del monitoraggio al sistema operativo. Il driver deve impostare il DXGK_CHILD_STATUS. Miracast. Membro MiracastMonitorType al tipo di monitoraggio corretto connesso al sink. Se il sink fa parte del monitoraggio, questo membro deve essere impostato su D3DKMDT_VOT_MIRACAST.
Se il driver conosce l'EDID del monitor, deve segnalare questo EDID quando il sistema operativo chiama la funzione DxgkDdiQueryDeviceDescriptor .
A seconda delle funzionalità hardware, l'elenco di modalità sink Miracast e la larghezza di banda di rete, il driver deve segnalare la modalità di origine corretta, la modalità di destinazione, la modalità di rotazione e la modalità di ridimensionamento. Per la modalità di destinazione, il driver deve segnalare il valore corretto del membro VSyncFreqDivider in D3DKMDT_VIDEO_SIGNAL_INFO. Il sistema operativo corrisponde alla modalità di destinazione rispetto alla modalità di monitoraggio e elimina qualsiasi modalità non supportata dal monitor.