Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Alteração no tratamento de erros do "EvtIddCxMonitorAssignSwapChain"
Nas versões do Windows 10 anteriores à versão 1903, o resto da composição da área de trabalho não sabia se EvtIddCxMonitorAssignSwapChain falhava. Ele continuou a renderizar e apresentar quadros que o adaptador de vídeo indireto não processou, resultando em IddCx encerrando o driver de vídeo indireto (IDD) depois de algum tempo.
A partir do Windows 10 versão 1903 (IddCx 1.4), o tratamento de erros IddCx para este callback foi alterado para todas as versões de driver e introduziu o código de status STATUS_GRAPHICS_INDIRECT_DISPLAY_ABANDON_SWAPCHAIN. Consulte EvtIddCxMonitorAssignSwapChain para obter detalhes.
Tratamento de erros no loop-thread de processamento de quadros
Assim que o IDD retorna com êxito de EvtIddCxMonitorAssignSwapChain, torna-se proprietário do objeto hSwapChain. Se o driver encontrar um erro que o impeça de continuar a processar o quadro, ele pode chamar WdfObjectDelete para liberar a propriedade. O sistema operacional detetará a exclusão e fará com que uma nova cadeia de permuta seja criada.
Se o driver sabe que não pode se recuperar desse erro, ele deve chamar IddCxReportCriticalError para parar o dispositivo.
Abordagem sugerida para lidar com erros de cadeia de permuta
Há vários motivos para falhas na função de retorno de chamada EvtIddCxMonitorAssignSwapChain ou durante o processamento de quadros. As categorizações de falhas incluem:
- Problemas transitórios específicos da sua solução, como um problema temporário com o hardware. Esse tipo de problema pode ser corrigido com mecanismos de recuperação leves que não afetarão a experiência do usuário porque a recuperação acontece rapidamente (normalmente bem menos de um segundo no tempo) e não afetará o conteúdo visual na tela (por exemplo, sem cintilações).
- Problemas permanentes específicos da sua solução, como um impasse no driver ou um problema sério com o hardware. Esse tipo de problema normalmente não pode ser recuperado rapidamente, se é que isso é possível.
- Erros da API do DirectX causados por eventos externos ao seu driver. Por exemplo, o seu driver não tem controle sobre eventos como quando o adaptador no qual o seu dispositivo D3D deve processar a imagem do ambiente de trabalho foi PnpStopped ou quando ocorreu uma falha geral na GPU e foi necessário reiniciá-la.
- Erros da API do DirectX causados pelo seu driver. Falhas de controlador podem fazer com que o dispositivo D3D entre em erro ou fique bloqueado. Por exemplo, chamar CopySubResource com coordenadas fora do limite da textura colocará o dispositivo em um estado de erro.
- Erros da API do DirectX causados por outro driver de GPU IHV. Esses erros podem ser o resultado de padrões corretos de chamada no IDD que acionam bugs nos drivers de GPU de IHV.
É difícil para um driver distinguir com precisão entre os diferentes erros do DirectX. A principal diferença é que os erros causados por componentes externos do DirectX provavelmente serão transitórios e o sistema se recuperará em um estado estável; enquanto que, se o erro for causado pelo monitor indireto ou driver de GPU, é provável que bugs ocorram novamente.
Consulte EvtIddCxMonitorAssignSwapChain para obter mais informações sobre como propagar esses erros de volta para o sistema operacional, de modo que o sistema operacional tente novamente.
Abaixo estão algumas orientações sobre como lidar com cada tipo de erro no seu driver.
Problemas transitórios específicos da sua solução
O driver deve resolver o problema durante o processamento do quadro. Essa ação pode resultar em algum pequeno atraso no processamento do frame. Se o erro acontecer regularmente, o controlador poderia considerar o erro como um problema permanente.
Problemas permanentes específicos da sua solução
O driver deve chamar IddCxReportCriticalError usando um código principal igual ou superior a 0x100 e usando códigos principais/secundários exclusivos para representar o tipo de erro para ajudar as investigações de cliente/telemetria.
Erro do DirectX
A maneira mais simples de lidar com erros DirectX é propagá-los de volta para o sistema operacional para que ele tente novamente. O driver deve retornar STATUS_GRAPHICS_INDIRECT_DISPLAY_ABANDON_SWAPCHAIN de EvtIddCxMonitorAssignSwapChain ou, se o erro ocorrer durante o processamento de um frame, o driver deve liberar o swapchain chamando WdfObjectDelete.
Esta abordagem simples lida com erros desencadeados por eventos externos, pois o SO irá estabilizar e criar uma nova swapchain (possivelmente num novo adaptador DXGI). Se o uso do DirectX pelo driver for limitado, essa abordagem funcionará bem.
Para controladores mais complexos que podem encontrar erros DirectX causados por bugs no IDD ou para controladores executados em drivers DirectX antigos com erros, esta abordagem pode terminar em um loop infinito de falhas na cadeia de troca de ID. Para evitar um loop interminável, o IDD poderia monitorar a frequência desses erros e passar por estágios de recuperação quando um determinado estágio atingiu ciclos de erro suficientes. Se forem encontrados erros DirectX, é importante que o driver destrua esse dispositivo DX e crie um novo, porque uma vez que um dispositivo DX está em um estado de erro, ele nunca será recuperado e precisa ser recriado.
| Estágio atual | Ação do driver se detetar muitos erros consecutivos de DirectX no swapchain |
|---|---|
| O adaptador de renderização LUID fornecido em EvtIddCxMonitorAssignSwapChain é um adaptador de hardware | Use o Dxgi para localizar o LUID do adaptador de software e chame IddCxAdapterSetRenderAdapter para solicitar que o sistema operacional use o adaptador de software para renderizar a área de trabalho. |
| O adaptador de renderização LUID fornecido em EvtIddCxMonitorAssignSwapChain é um adaptador de software | O driver deve chamar IddCxReportCriticalError usando um código majoritário igual ou superior a 0x100 e utilizando códigos majoritários/minoritários distintos para representar o tipo de erro, ajudando as investigações de cliente/telemetria. |
Por exemplo, o driver pode considerar cinco falhas consecutivas do DirectX no EvtIddCxMonitorAssignSwapChain ou cinco falhas durante o processamento de quadros, considerando 1 minuto como critério, para tomar a ação de recuperação para o estágio atual na tabela acima.