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 (KMD) en modo kernel en WDDM.
Si se produce un agotamiento de tiempo de espera de hardware, el sistema 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, la cual restablece la GPU:
- DxgkDdiResetFromTimeout se llama sincrónicamente con cualquier otra función KMD, excepto en las funciones de administración de energía en tiempo de ejecución DxgkDdiSetPowerComponentFState y DxgkDdiPowerRuntimeControlRequest. Es decir, el sistema operativo garantiza que ningún otro subproceso se ejecute en el controlador mientras se ejecuta el DxgkDdiResetFromTimeout subproceso.
- El sistema operativo también garantiza que las aplicaciones no puedan acceder al búfer de cuadros durante la llamada a DxgkDdiResetFromTimeout. Por lo tanto, el controlador puede restablecer un bucle de enganche de fase del controlador de memoria (PLL) y así sucesivamente.
Mientras el subproceso de recuperación ejecuta DxgkDdiResetFromTimeout, se pueden seguir efectuando interrupciones y llamadas a procedimientos diferidos (DPC). La función
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 ejecutan las siguientes funciones del controlador por las razones indicadas.
Se llama al controlador para notificar sobre una asignación que está siendo desalojada.
Por ejemplo, si la asignación se pagina en un segmento de memoria, se llama a la función DxgkDdiBuildPagingBuffer 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. No se implica ninguna transferencia de contenido 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 para que desasigne la asignación de la apertura.
Se llama a la función DxgkDdiReleaseSwizzlingRange del controlador para liberar una apertura desreferenciada y los rangos de apertura de segmentos.
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 volverá a utilizar el adaptador para el renderizado.