Aggiornamenti iddCx 1.4 per ID remoto
Gli aggiornamenti seguenti a IddCx versione 1.4 si applicano solo ai driver di visualizzazione indiretti remoti (IDD).
Gli sviluppatori IDD remoti devono anche vedere gli aggiornamenti iddCx 1.4 per gli IDD della console e degli ID remoti per gli aggiornamenti aggiuntivi.
Dichiarare un IDD remoto per le sessioni remote
Un IDD dichiara che vuole creare una scheda ID remoto impostando il bit di IDDCX_ADAPTER_FLAGS_REMOTE_SESSION_DRIVER bit nel IDDCX_ADAPTER_CAPS. Contrassegna il campo quando si chiama IddCxAdapterInitAsync. Il sistema operativo tiene traccia se l'IDD viene caricato a causa dello stack desktop remoto che si connette a una sessione remota e avrà esito negativo nella chiamata IddCxAdapterInitAsync nei due casi seguenti:
- L'IDD non ha impostato IDDCX_ADAPTER_FLAGS_REMOTE_SESSION_DRIVER per un dispositivo creato dallo stack desktop remoto del sistema operativo per una sessione remota
- Il set IDD IDDCX_ADAPTER_FLAGS_REMOTE_SESSION_DRIVER per un dispositivo che non è stato creato dallo stack desktop remoto del sistema operativo
Raccomandazioni per l'installazione per id remoti
UMDF consente ai driver di controllare l'opzione di pool di dispositivi nei file INF usando direttive come UmdfHostProcessSharing e DeviceGroupId. A causa di alcuni problemi di contesa di blocco, è consigliabile impostare la direttiva UmdfHostProcessSharing su ProcessSharingDisabled e rimuovere eventuali direttive DeviceGroupId . Questa impostazione configura l'IDD remoto per ogni sessione da eseguire nel proprio processo.
Restrizioni aggiuntive sulle funzionalità IddCx esistenti per IDD remoti
Gli ID remoti sono necessari per impostare IDDCX_ADAPTER_FLAGS_USE_SMALLEST_MODE nella IDDCX_ADAPTER_CAPS. Campo Contrassegni . Ciò garantisce che le modalità virtuali non vengano usate e quindi le dimensioni di swapchain corrispondano sempre alla risoluzione del desktop. IddCxAdapterInitAsync avrà esito negativo se questo flag non è impostato.
Sono supportate solo le modalità di destinazione progressiva per gli ID remoti, quindi IDDCX_TARGET_MODE. TargetVideoSignalInfo.targetVideoSignalInfo.scanLineOrdering deve essere impostato su DISPLAYCONFIG_SCANLINE_ORDERING_PROGRESSIVE. IddCxMonitorArrival avrà esito negativo se questo valore non è impostato.
Impostare la configurazione di visualizzazione per la sessione remota
Poiché gli ID remoti controllano tutti i monitor in una sessione remota e la configurazione della visualizzazione della sessione remota deve eseguire il mirroring di quello del client, un IDD remoto richiede la possibilità di specificare la configurazione di visualizzazione impostata dal sistema operativo nella sessione remota. Questa configurazione di visualizzazione deve essere impostata quando la sessione viene creata come sessione remota o passata a una sessione remota.
L'IDD remoto può aggiornare la configurazione di visualizzazione durante una sessione remota a:
- Modificare l'impostazione per i monitor correnti (ad esempio, modificare la posizione del desktop, l'orientamento, le dimensioni fisiche o LA DPI)
- Impostare la configurazione desktop dopo l'aggiunta/rimozione dei monitoraggi chiamando IddCxMonitorArrival/IddCxMonitorDeparture. Gli ID remoti usano IDdCxMonitorArrival e IddCxMonitorDeparture nello stesso modo degli ID console per informare il sistema operativo su monitorare gli arrivi e le partenze.
Di seguito è riportata la logica usata dal sistema operativo per elaborare le modifiche di configurazione degli arrivi, delle partenze e del desktop. Per ogni sessione remota, il sistema operativo archivierà una singola configurazione desktop corrente fornita dall'IDD remoto. Questa configurazione desktop verrà avviata vuota e verrà aggiornata ogni volta che un IDD remoto chiama correttamente IddCxDisplayConfigUpdate.
Quando il driver riceve una nuova configurazione di visualizzazione
If all monitors in the new display configuration are present in the system
If new display configuration is supported by driver (eg resolutions)
Store new display configuration
Set new display configuration (this will disable any active monitors
that are not part of new configuration)
If all monitors in the new display config are not currently present in the system
Store new display configuration
Disable all active paths and wait for the correct set of monitors to arrive
Quando viene rimosso un monitoraggio
If removed monitor is not in the current display configuration
Remove the monitor and do not change the current desktop configuration
If removed monitor is part of the current display configuration
Remove the monitor
Disable all active paths and wait for the correct set of monitors to arrive
Quando arriva un monitor
If added monitor is not part of current display configuration
Do not change the display configuration
If added monitor is part of the current display configuration
If now all the monitors in the current display configurations are present
Set the new display configuration
Di seguito sono riportati alcuni semplici scenari per illustrare come è possibile usare IddCxDisplayConfigUpdate .
Scenario 1: una nuova sessione inizia con due monitor connessi
Azione driver | Topologia di visualizzazione corrente | Monitoraggio attualmente connesso | Monitor attualmente attivi | Note |
---|---|---|---|---|
nessuno | Nessuno | Nessuno | Configurazione dell'avvio della sessione | |
IddCxMonitorArrival(Mon1) | Nessuno | Mon1 | Nessuno | Nessuna configurazione di visualizzazione attiva, quindi niente cambia |
IddCxMonitorArrival(Mon2) | Nessuno | Mon1, Mon2 | Nessuno | Ancora nessuna modifica nella configurazione di visualizzazione |
IddCxDisplayConfigUpdate | Mon1, Mon2 | Mon1, Mon2 | Mon1, Mon2 | Come tutti i monitoraggi sono connessi, impostare la configurazione |
NOTA: il driver potrebbe aver chiamato IddCxDisplayConfigUpdate prima di aggiungere i monitoraggi per lo stesso risultato.
Scenario 2: Aggiungere un terzo monitoraggio allo scenario 1 e renderlo attivo
Azione driver | Topologia di visualizzazione corrente | Monitoraggio attualmente connesso | Monitor attualmente attivi | Note |
---|---|---|---|---|
IddCxMonitorArrival(Mon3) | Mon1, Mon2 | Mon1, Mon2, Mon3 | Mon1, Mon2 | Nessuna modifica per visualizzare la configurazione |
IddCxDisplayConfigUpdate | Mon1, Mon2, Mon3 | Mon1, Mon2, Mon3 | Mon1, Mon2, Mon3 | Nuovo set di configurazione |
Scenario 3: Rimuovere un monitoraggio da una configurazione attiva
Azione driver | Topologia di visualizzazione corrente | Monitoraggio attualmente connesso | Monitor attualmente attivi | Note |
---|---|---|---|---|
Mon1, Mon2 | Mon1, Mon2 | Mon1, Mon2 | Avvio della configurazione | |
IddCxDisplayConfigUpdate() | Mon1 | Mon1, Mon2 | Mon1 | Modificare la configurazione per usare solo Mon1 |
IddCxMonitorDeparture(Mon2) | Mon1 | Mon1 | Mon1 |
Scenario 4: modifica della modalità di un percorso quando il driver supporta solo una singola modalità
Azione driver | Topologia di visualizzazione corrente | Monitoraggio attualmente connesso | Monitor attualmente attivi | Note |
---|---|---|---|---|
Mon1 10x7 , Mon2 19x10 | Mon1, Mon2 | Mon1, Mon2 | Avvio della configurazione | |
IddCxMonitorUpdateModes(Mon1 supporta 16x9) | Nessuno | Mon1, Mon2 | Nessuno | Elenco di modalità aggiornato per Mon1 a 16x9 |
IddCxDisplayConfigUpdate() | Mon1 16x9, Mon2 19x10 | Mon1, Mon2 | Mon1, Mon2 | Impostare la configurazione per Mon1 su 16x9 |
Gestione degli errori IddCxDisplayConfigUpdate
Il driver remoto deve gestire gli errori da IddCxDisplayConfigUpdate. Alcuni errori sono previsti; ad esempio, quando la connessione usava una sessione temporanea.
In casi imprevisti nella configurazione iniziale, il driver ha opzioni come:
- Chiamare IDdCxReportCriticalError per terminare il processo del driver e disconnettere la sessione utente. È consigliabile che il driver usi una combinazione principale/secondaria univoca in modo che questi casi possano essere identificati in arresti anomali e report di Watson.
- Riprovare la configurazione nel caso in cui si trattasse di un errore temporaneo.
- Provare una configurazione diversa.
Un driver remoto potrebbe decidere che gli errori di modifica della configurazione di metà sessione non sono critici come errori di configurazione iniziali e quindi potrebbero non chiamare mai IddCxReportCriticalError mid-session.
Il driver non deve chiamare IddCxReportCriticalError se IddCxDisplayConfigUpdate restituisce STATUS_GRAPHICS_INDIRECT_DISPLAY_DEVICE_STOPPED come risultato del sistema operativo che rileva che la sessione di destinazione viene disconnessa o l'adapter IddCx per tale sessione viene interrotta, perché è previsto.
Visualizzare le modifiche dell'API in una sessione remota di visualizzazione indiretta
In una sessione XDDM remota, il pannello di controllo visualizzato del sistema operativo non fornisce all'utente alcun controllo per modificare la configurazione di visualizzazione. Ciò è principalmente dovuto al fatto che la configurazione desktop sessione remota è controllata dal sistema client di connessione e non dalle applicazioni in esecuzione nella sessione. Ad esempio, il supporto dell'interfaccia utente di proiezione Win+P non ha senso in una sessione remota.
In generale per le sessioni ID remote:
- Visualizzare le API di enumerazione, tra cui QueryDisplayConfig
- Le API di impostazione di visualizzazione non funzionano. Ad esempio, non è consigliabile che un'applicazione in esecuzione nella sessione remota chiami ChangeDisplaySettings/SetDisplayConfig per modificare la configurazione desktop, ad esempio modificare la posizione del desktop o la topologia.
In particolare, le soluzioni XDDM remote usano ChangeDisplaySetting per modificare le modalità e le posizioni desktop in quanto è l'unico modo in cui è possibile applicare le modifiche dal client. Poiché le soluzioni ID remote hanno la funzionalità IddCxDisplayConfigUpdate , ChangeDisplaySetting non è più necessaria per funzionare nelle sessioni ID remote.
Nella tabella seguente vengono illustrate le API e la funzionalità del pannello di controllo visualizzato (CPL) in una sessione remota XDDM e in una sessione remota WDDM.
API/CPL | Sessione remota XDDM | Sessione remota WDDM |
---|---|---|
Visualizzare CPL | Non vengono visualizzate informazioni e viene generato un messaggio che indica che non è possibile modificare le impostazioni di visualizzazione da una sessione remota. | Stesso comportamento di una sessione remota XDDM. |
Interfaccia utente e funzionalità Win+P | L'interfaccia utente non viene visualizzata e l'API non riesce. | Stesso comportamento di una sessione remota XDDM. |
API di enumerazione legacy(ad esempio EnumDisplaySettings & EnumDisplayDevices) | L'API funziona come previsto e restituisce informazioni pertinenti. | Stesso comportamento di una sessione remota XDDM. |
Legacy ChangeDisplaySetting | Funziona e viene usato per riflettere le modifiche del desktop dal client. | Restituisce l'esito positivo per motivi di compatibilità dell'applicazione, ma ignora la chiamata e non modifica alcuna configurazione di visualizzazione. L'IDD userà IddCxDisplayConfigUpdate per modificare la configurazione del desktop. |
QueryDisplayConfig | Ha esito negativo. | Funziona come previsto. |
DisplayConfigGetDeviceInfo | Ha esito negativo. | Funziona e segnala le informazioni previste. |
SetDisplayConfig e DisplayConfigSetDeviceInfo | Ha esito negativo. | Stesso comportamento di una sessione remota XDDM. |
Monitorare il comportamento inattiva in una sessione remota ID
Quando lo stack di protocolli chiama IWRdsProtocolConnectionCallback::StopScreenUpdates per arrestare l'aggiornamento della schermata client, il sistema operativo elimina le swapchain e crea tutti i percorsi per tale sessione inattiva, causando il callback di EVT_IDD_CX_ADAPTER_COMMIT_MODES dell'IDD chiamato con IDDCX_PATH_FLAGS_NONEimpostato inIDDCX_PATH. Contrassegni per tutti i percorsi.
Quando lo stack di protocolli chiama IWRdsProtocolConnectionCallback::RedrawWindow per abilitare di nuovo gli aggiornamenti, il sistema operativo imposta nuovi percorsi attivi usando il callback EVT_IDD_CX_ADAPTER_COMMIT_MODES IDD e verranno creati nuovi swapchain.
Disconnettere il comportamento in una sessione remota ID
Quando l'utente si disconnette da una sessione remota, il sistema operativo elimina il nodo devnode che ospita il dispositivo ID remoto per tale sessione, causando l'adattatore ID remoto per tale sessione in fase di PnpStopped. UMDF chiamerà il callback dell'IDD remoto EVT_WDF_DEVICE_D0_EXIT .
Se la sessione è connessa di nuovo in remoto, il sistema operativo creerà un nuovo nodo di sviluppo per l'IDD remoto per tale sessione. L'IDD remoto deve passare nuovamente attraverso la normale sequenza di avvio, inizializzare l'adapter e quindi aggiungere monitoraggi e così via.