Atualizações do IdCx 1.4 para IDs remotas
As atualizações a seguir para o IddCx versão 1.4 se aplicam somente a IDS (drivers de exibição indiretos remotos).
Os desenvolvedores de IDD remota também devem ver atualizações do IdCx 1.4 para console e IDS remotas para atualizações adicionais.
Declarar uma IDD remota para sessões remotas
Uma IDD declara que deseja criar um adaptador de ID remoto definindo o bit IDDCX_ADAPTER_FLAGS_REMOTE_SESSION_DRIVER na IDDCX_ADAPTER_CAPS. Campo Sinalizadores ao chamar IddCxAdapterInitAsync. O sistema operacional controla se a IDD está sendo carregada devido à pilha de área de trabalho remota se conectando a uma sessão remota e falhará na chamada IddCxAdapterInitAsync nos dois casos a seguir:
- A IDD não definiu IDDCX_ADAPTER_FLAGS_REMOTE_SESSION_DRIVER para um dispositivo que foi criado pela pilha de área de trabalho remota do sistema operacional para uma sessão remota
- O conjunto de IDs IDDCX_ADAPTER_FLAGS_REMOTE_SESSION_DRIVER para um dispositivo que não foi criado pela pilha de área de trabalho remota do sistema operacional
Recomendações de instalação para IDDs remotas
O UMDF permite que os drivers controlem a opção de pool de dispositivos em seus arquivos INF, usando diretivas como UmdfHostProcessSharing e DeviceGroupId. Devido a alguns problemas de contenção de bloqueio, é altamente recomendável que as IDDs remotas definam a diretiva UmdfHostProcessSharing como ProcessSharingDisabled e removam quaisquer diretivas DeviceGroupId . Essa configuração configurará a IDD remota para cada sessão estar em seu próprio processo.
Restrições adicionais em recursos IddCx existentes para IDDs remotas
IDS remotas são necessárias para definir IDDCX_ADAPTER_FLAGS_USE_SMALLEST_MODE no IDDCX_ADAPTER_CAPS. Campo Sinalizadores . Isso garante que os modos virtuais não sejam usados e, portanto, o tamanho da cadeia de troca sempre corresponderá à resolução da área de trabalho. IddCxAdapterInitAsync falhará se esse sinalizador não estiver definido.
Somente modos de destino progressivos têm suporte para IDDs remotas, portanto , IDDCX_TARGET_MODE. TargetVideoSignalInfo.targetVideoSignalInfo.scanLineOrdering deve ser definido como DISPLAYCONFIG_SCANLINE_ORDERING_PROGRESSIVE. IddCxMonitorArrival falhará se esse valor não estiver definido.
Definir a configuração de exibição para a sessão remota
Como as IDDs remotas controlam todos os monitores em uma sessão remota e a configuração de exibição de sessão remota deve espelho a do cliente, uma ID remota precisa da capacidade de especificar a configuração de exibição que o sistema operacional definirá na sessão remota. Essa configuração de exibição precisa ser definida quando a sessão é criada como uma sessão remota ou transferida para uma sessão remota.
A ID remota pode atualizar a configuração de exibição durante uma sessão remota para:
- Alterar a configuração para monitores atuais (por exemplo, alterar posição da área de trabalho, orientação, tamanho físico ou DPI)
- Defina a configuração da área de trabalho depois que os monitores forem adicionados/removidos, chamando IddCxMonitorArrival/IddCxMonitorDeparture. As IDDs remotas usam IddCxMonitorArrival e IddCxMonitorDeparture da mesma forma que as IDDs do console para informar o sistema operacional sobre chegadas e saídas do monitor.
Abaixo está a lógica que o sistema operacional usa para processar as chegadas, as saídas e as alterações de configuração da área de trabalho. Para cada sessão remota, o sistema operacional armazenará uma única configuração de área de trabalho atual fornecida pela IDD remota. Essa configuração da área de trabalho começará vazia e será atualizada sempre que uma IDD remota chamar com êxito IddCxDisplayConfigUpdate.
Quando o driver recebe uma nova configuração de exibição
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 um monitor é removido
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 um monitor chega
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
Abaixo estão alguns cenários simples para ilustrar como IddCxDisplayConfigUpdate pode ser usado.
Cenário 1: uma nova sessão começa com dois monitores conectados
Ação do driver | Topologia de exibição atual | Monitor conectado no momento | Monitores ativos no momento | Observações |
---|---|---|---|---|
Nenhum | Nenhum | Nenhum | Configuração de início da sessão | |
IddCxMonitorArrival(Mon1) | Nenhum | Seg1 | Nenhum | Nenhuma configuração de exibição ativa, portanto, nada muda |
IddCxMonitorArrival(Mon2) | Nenhum | Mon1, Mon2 | Nenhum | Ainda não há alteração na configuração de exibição |
IddCxDisplayConfigUpdate | Mon1, Mon2 | Mon1, Mon2 | Mon1, Mon2 | Como todos os monitores estão conectados, defina a configuração |
OBSERVAÇÃO: o driver poderia ter chamado IddCxDisplayConfigUpdate antes de adicionar os monitores para o mesmo resultado.
Cenário 2: Adicionar um terceiro monitor ao Cenário 1 e torná-lo ativo
Ação do driver | Topologia de exibição atual | Monitor conectado no momento | Monitores ativos no momento | Observações |
---|---|---|---|---|
IddCxMonitorArrival(Mon3) | Mon1, Mon2 | Mon1, Mon2, Mon3 | Mon1, Mon2 | Nenhuma alteração na configuração de exibição |
IddCxDisplayConfigUpdate | Mon1, Mon2, Mon3 | Mon1, Mon2, Mon3 | Mon1, Mon2, Mon3 | Novo conjunto de configurações |
Cenário 3: remover um monitor de uma configuração ativa
Ação do driver | Topologia de exibição atual | Monitor conectado no momento | Monitores ativos no momento | Observações |
---|---|---|---|---|
Mon1, Mon2 | Mon1, Mon2 | Mon1, Mon2 | Iniciando a configuração | |
IddCxDisplayConfigUpdate() | Seg1 | Mon1, Mon2 | Seg1 | Alterar a configuração para usar o Mon1 apenas primeiro |
IddCxMonitorDeparture(Mon2) | Seg1 | Seg1 | Seg1 |
Cenário 4: alterando o modo de um caminho quando o driver dá suporte apenas a um único modo
Ação do driver | Topologia de exibição atual | Monitor conectado no momento | Monitores ativos no momento | Observações |
---|---|---|---|---|
Mon1 10x7 , Mon2 19x10 | Mon1, Seg2 | Mon1, Seg2 | Iniciando a configuração | |
IddCxMonitorUpdateModes(Mon1 dá suporte a 16x9) | Nenhum | Mon1, Seg2 | Nenhum | Lista de modo atualizado para Mon1 a 16x9 |
IddCxDisplayConfigUpdate() | Mon1 16x9, Mon2 19x10 | Mon1, Seg2 | Mon1, Seg2 | Definir a configuração para Mon1 como 16x9 |
Tratamento de erros IddCxDisplayConfigUpdate
O driver remoto precisa lidar com erros de IddCxDisplayConfigUpdate. Alguns erros são esperados; por exemplo, quando a conexão estava usando uma sessão temporária.
Em casos inesperados na configuração inicial, o driver tem opções como:
- Chame IddCxReportCriticalError para encerrar o processo de driver e desconectar a sessão do usuário. É recomendável que o driver use uma combinação principal/secundária exclusiva para que esses casos possam ser identificados em falhas e relatórios watson.
- Repita a configuração caso tenha sido um erro transitório.
- Tente uma configuração diferente.
Um driver remoto pode decidir que falhas de alteração de configuração no meio da sessão não são tão críticas quanto falhas de configuração iniciais e, portanto, pode nunca chamar IddCxReportCriticalError no meio da sessão.
O driver não deve chamar IddCxReportCriticalError se IddCxDisplayConfigUpdate retornar STATUS_GRAPHICS_INDIRECT_DISPLAY_DEVICE_STOPPED como resultado da detecção do sistema operacional de que a sessão de destino está sendo desconectada ou o adaptador IddCx para essa sessão está sendo interrompido, pois isso é esperado.
Exibir alterações de API em uma sessão remota de exibição indireta
Em uma sessão XDDM remota, o painel de controle de exibição do sistema operacional não fornece ao usuário nenhum controle para alterar a configuração de exibição. Isso ocorre principalmente porque a configuração da área de trabalho de sessão remota é controlada pelo sistema cliente de conexão e não por aplicativos em execução na sessão. Por exemplo, dar suporte à interface do usuário de projeção do Win+P não faz sentido em uma sessão remota.
Em geral, para sessões de ID remota:
- Exibir o trabalho das APIs de enumeração, incluindo QueryDisplayConfig
- As APIs de configuração de exibição não funcionam. Por exemplo, não é desejável que um aplicativo em execução na sessão remota chame ChangeDisplaySettings/SetDisplayConfig para alterar a configuração da área de trabalho (por exemplo, alterar a posição da área de trabalho ou a topologia).
Curiosamente, as soluções XDDM remotas usam ChangeDisplaySetting para alterar modos e posições da área de trabalho, pois essa é a única maneira de aplicar as alterações do cliente. Como as soluções de ID remota têm a funcionalidade IdCxDisplayConfigUpdate , ChangeDisplaySetting não é mais necessário para funcionar em sessões de ID remotas.
A tabela a seguir mostra as APIs e a funcionalidade do painel de controle de exibição (CPL) em uma sessão remota XDDM e em uma sessão remota do WDDM.
API/CPL | Sessão remota do XDDM | Sessão remota do WDDM |
---|---|---|
Exibir CPL | Nenhuma informação é exibida e uma mensagem dizendo "As Configurações de Exibição não podem ser alteradas de uma sessão remota" é emitida. | Mesmo comportamento de uma sessão remota XDDM. |
Interface do usuário e funcionalidade do Win+P | A interface do usuário não é mostrada e a API falha. | Mesmo comportamento de uma sessão remota XDDM. |
APIs de enumeração de exibição herdadas (como EnumDisplaySettings & EnumDisplayDevices) | A API funciona conforme o esperado e retorna informações relevantes. | Mesmo comportamento de uma sessão remota XDDM. |
ChangeDisplaySetting herdado | Funciona e é usado para refletir as alterações da área de trabalho do cliente. | Retorna êxito por motivos de compatibilidade do aplicativo, mas ignora a chamada e não altera nenhuma configuração de exibição. A IDD usará IddCxDisplayConfigUpdate para alterar a configuração da área de trabalho. |
QueryDisplayConfig | Falhar. | Funciona conforme o esperado. |
DisplayConfigGetDeviceInfo | Falhar. | Funciona e relata as informações esperadas. |
SetDisplayConfig e DisplayConfigSetDeviceInfo | Falhar. | Mesmo comportamento de uma sessão remota XDDM. |
Monitorar o comportamento ocioso em uma sessão remota de ID
Quando a pilha de protocolo chama IWRdsProtocolConnectionCallback::StopScreenUpdates para parar de atualizar a tela do cliente, o sistema operacional destrói os swapchains e torna todos os caminhos dessa sessão inativos, resultando no retorno de chamada EVT_IDD_CX_ADAPTER_COMMIT_MODES da IDD sendo chamado com IDDCX_PATH_FLAGS_NONE definidos em IDDCX_PATH. Sinalizadores para todos os caminhos.
Quando a pilha de protocolo chama IWRdsProtocolConnectionCallback::RedrawWindow para habilitar as atualizações novamente, o sistema operacional define novos caminhos ativos usando o retorno de chamada EVT_IDD_CX_ADAPTER_COMMIT_MODES da IDD e novos swapchains serão criados.
Comportamento de desconexão em uma sessão remota de ID
Quando o usuário se desconecta de uma sessão remota, o sistema operacional destrói o devnode que hospeda o dispositivo de ID remoto para essa sessão, resultando no adaptador de ID remoto para essa sessão sendo PnpStopped. O UMDF chamará o retorno de chamada EVT_WDF_DEVICE_D0_EXIT da IDD remota.
Se a sessão estiver conectada novamente remotamente, o sistema operacional criará um novo devnode para a ID remota dessa sessão. A IDD remota deve passar pela sequência de inicialização normal novamente, inicializar o adaptador e adicionar monitores etc.