Compartir a través de


Control de errores evtIddCxMonitorAssignSwapChain

Cambio en el control de errores EvtIddCxMonitorAssignSwapChain

En las versiones de Windows 10 anteriores a la versión 1903, el resto de la composición de escritorio no sabía si EvtIddCxMonitorAssignSwapChain produjo un error. Continuó representando y presentar fotogramas que el adaptador de pantalla indirecto no procesaba, lo que provocaba que IddCx terminara el controlador de pantalla indirecto (IDD) después de algún tiempo.

A partir de la versión 1903 de Windows 10 (IddCx 1.4), el control de errores de IddCx para esta devolución de llamada cambió para todas las versiones del controlador e introdujo el código de estado de STATUS_GRAPHICS_INDIRECT_DISPLAY_ABANDON_SWAPCHAIN . Consulte EvtIddCxMonitorAssignSwapChain para obtener más información.

Control de errores en el subproceso de bucle de procesamiento de fotogramas

Una vez que el IDD se devuelve correctamente desde EvtIddCxMonitorAssignSwapChain, posee el objeto hSwapChain. Si el controlador encuentra un error que impide que continúe procesando el marco, puede llamar a WdfObjectDelete para liberar la propiedad. El sistema operativo detectará la eliminación y hará que se cree una nueva cadena de intercambio.

Si el controlador sabe que no se puede recuperar de este error, debe llamar a IddCxReportCriticalError para detener el dispositivo.

Enfoque sugerido para controlar los errores de la cadena de intercambio

Hay varias razones para el error en la devolución de llamada EvtIddCxMonitorAssignSwapChain o durante el procesamiento de fotogramas. Las categorizaciones de errores incluyen:

  • Problemas transitorios específicos de la solución, como un problema temporal con el hardware. Este tipo de problema se puede corregir con mecanismos de recuperación ligeros que no afectarán a la experiencia del usuario porque la recuperación se produce rápidamente (normalmente menos de un segundo en tiempo) y no afectará al contenido visual en pantalla (por ejemplo, sin parpadeos).
  • Problemas permanentes específicos de la solución, como un interbloqueo en el controlador o un problema grave con el hardware. Este tipo de problema normalmente no se puede recuperar rápidamente si está en absoluto.
  • Errores de la API de DirectX causados por eventos externos al controlador. Por ejemplo, el controlador no tiene control sobre eventos como cuando el adaptador en el que el dispositivo D3D va a procesar la imagen de escritorio fue PnpStopped o se produjo un error en toda la GPU y se restableció.
  • Errores de la API de DirectX causados por el controlador. Los errores del controlador pueden hacer que el dispositivo D3D se ponga en error o se bloquee. Por ejemplo, llamar a CopySubResource con coordenadas fuera del límite de la textura colocará el dispositivo en un estado de error.
  • Errores de la API de DirectX causados por otro controlador de GPU de IHV. Estos errores pueden ser el resultado de los patrones de llamada correctos en el IDD que desencadenan errores del controlador de GPU de IHV.

Es difícil que un controlador distinga con precisión entre los distintos errores de DirectX. La principal diferencia es que los errores causados por componentes externos de DirectX probablemente sean transitorios y el sistema se recuperará en un estado estable; mientras que, si el error se debe a la pantalla indirecta o al controlador de GPU, es probable que se produzcan errores de nuevo.

Consulte EvtIddCxMonitorAssignSwapChain para obtener más información sobre cómo propagar estos errores al sistema operativo de forma que el sistema operativo vuelva a intentarlo.

A continuación se muestran algunas instrucciones sobre cómo tratar cada tipo de error en el controlador.

Problemas transitorios específicos de la solución

El controlador debe corregir el problema al procesar el marco. Esta acción puede dar lugar a un pequeño retraso en el procesamiento del marco. Si el error se produce con regularidad, el controlador podría considerar la posibilidad de adelantar el error a un problema permanente.

Problemas permanentes específicos de la solución

El controlador debe llamar a IddCxReportCriticalError mediante un código principal igual o superior a 0x100 y usar códigos principales o secundarios únicos para representar el tipo de error para ayudar a las investigaciones de telemetría o cliente.

Error de DirectX

La manera más sencilla de controlar los errores de DirectX es volver a propagarlos al sistema operativo para que vuelva a intentarlo. El controlador debe devolver STATUS_GRAPHICS_INDIRECT_DISPLAY_ABANDON_SWAPCHAIN de EvtIddCxMonitorAssignSwapChain o, si el error se produce al procesar un fotograma, el controlador debe liberar la cadena de intercambio llamando a WdfObjectDelete.

Este enfoque sencillo controla los errores desencadenados por eventos externos, ya que el sistema operativo estabilizará y creará una nueva cadena de intercambio (posiblemente en un nuevo adaptador dxgi). Si el uso del controlador de DirectX es limitado, este enfoque funciona bien.

Para controladores más complejos que podrían alcanzar errores de DirectX causados por errores en el IDD o para controladores que se ejecutan en controladores de DirectX antiguos o con errores, este enfoque podría terminar en un bucle sin fin de errores de cadena de intercambio de identificadores. Para evitar un bucle sin fin, el IDD podría supervisar la frecuencia de estos errores y pasar por fases de recuperación cuando una fase determinada ha alcanzado suficientes ciclos de error. Si se detectan errores de DirectX, es importante que el controlador destruya ese dispositivo DX y cree uno nuevo, ya que una vez que un dispositivo DX está en un estado de error, nunca se recuperará y debe volver a crearse.

Fase actual Acción del controlador si detecta demasiados errores consecutivos de DirectX en la cadena de intercambio
LuID del adaptador de representación proporcionado en EvtIddCxMonitorAssignSwapChain es un adaptador de hardware Use Dxgi para buscar el LUID del adaptador de software y llamar a IddCxAdapterSetRenderAdapter para solicitar que el sistema operativo use el adaptador de software para representar el escritorio.
LuID del adaptador de representación proporcionado en EvtIddCxMonitorAssignSwapChain es un adaptador de software El controlador debe llamar a IddCxReportCriticalError mediante un código principal igual o superior a 0x100 y usar códigos principales o secundarios únicos para representar el tipo de error para ayudar a las investigaciones de telemetría o cliente.

Por ejemplo, el controlador podría considerar cinco errores consecutivos de DirectX en EvtIddCxMonitorAssignSwapChain o cinco errores al procesar fotogramas con 1 minuto como criterios para realizar la acción de recuperación para la fase actual de la tabla anterior.