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:

  1. 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
  2. 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.