Sincronización de subprocesos y TDR

En la ilustración siguiente se muestra cómo funciona la sincronización de subprocesos para el controlador de minipuerto de pantalla de Windows en el modelo de controlador de pantalla de Windows (WDDM).

Diagrama que muestra la sincronización de subprocesos en WDDM.

Si se produce un tiempo de espera de hardware, se inicia el proceso de detección y recuperación de tiempo de espera (TDR ). El programador de GPU llama a la función DxgkDdiResetFromTimeout del controlador, que restablece la GPU. DxgkDdiResetFromTimeout se llama sincrónicamente con cualquier otra función de controlador de miniporte de pantalla, excepto para las funciones de administración de energía en tiempo de ejecución DxgkDdiSetPowerComponentFState y DxgkDdiPowerRuntimeControlRequest. Es decir, ningún otro subproceso se ejecuta en el controlador mientras se ejecuta el subproceso DxgkDdiResetFromTimeout . El sistema operativo también garantiza que no se pueda tener acceso al búfer de fotogramas desde cualquier aplicación durante la llamada a DxgkDdiResetFromTimeout; por lo tanto, el controlador puede restablecer un bucle bloqueado por fase de controlador de memoria (PLL) y así sucesivamente.

Mientras el subproceso de recuperación ejecuta DxgkDdiResetFromTimeout, se pueden seguir llamando a interrupciones y llamadas a procedimientos diferidos (DPC). La función KeSynchronizeExecution se puede usar para sincronizar partes del procedimiento de restablecimiento con interrupciones del dispositivo.

Después de que el controlador vuelva de DxgkDdiResetFromTimeout, se puede llamar a la mayoría de las funciones de controlador y el sistema operativo comienza a limpiar los recursos que ya no son necesarios. Durante el período de limpieza, se llama a las siguientes funciones de controlador por los motivos indicados:

  • Se llama al controlador para notificar a una asignación que se está expulsando.

    Por ejemplo, si la asignación se pagina en un segmento de memoria, se llama a la función DxgkDdiBuildPagingBuffer del controlador con el miembro Operation de la estructura DXGKARG_BUILDPAGINGBUFFER establecida en DXGK_OPERATION_TRANSFER y con el miembro Transfer.Size establecido en cero para informar al controlador sobre la expulsión. Tenga en cuenta que no hay ninguna transferencia de contenido implicada porque el contenido se perdió durante el restablecimiento.

    Si la asignación se pagina en un segmento de apertura, se llama a la función DxgkDdiBuildPagingBuffer del controlador con el miembro Operation de DXGKARG_BUILDPAGINGBUFFER establecido en DXGK_OPERATION_UNMAP_APERTURE_SEGMENT para informar al controlador de que desasignación de la apertura.

  • Se llama a la función DxgkDdiReleaseSwizzlingRange del controlador para liberar intervalos de apertura y de segmentos desenlazamiento.

El controlador no debe acceder a la GPU durante las llamadas anteriores a menos que sea absolutamente necesario.

Una vez finalizado el período de limpieza, el sistema operativo llama a la función DxgkDdiRestartFromTimeout del controlador para informar al controlador de que se ha completado la limpieza y que el sistema operativo reanudará el uso del adaptador para su representación.