Partager via


Synchronisation des threads et TDR

La figure suivante montre le fonctionnement de la synchronisation des threads pour le pilote de miniport d'affichage (KMD) en mode noyau dans WDDM.

Diagramme montrant la synchronisation de threads dans WDDM.

Si un délai d’expiration matériel se produit, le système lance le processus de détection et récupération des délais d'expiration (TDR). Le planificateur GPU appelle la fonction DxgkDdiResetFromTimeout du pilote, qui réinitialise le GPU :

  • DxgkDdiResetFromTimeout est appelé de façon synchrone avec toute autre fonction KMD, à l’exception des fonctions de gestion de l’alimentation du runtime DxgkDdiSetPowerComponentFState et DxgkDdiPowerRuntimeControlRequest. Autrement dit, le système d’exploitation garantit qu’aucun autre thread ne s’exécute dans le pilote pendant que le thread DxgkDdiResetFromTimeout s’exécute.
  • Le système d’exploitation garantit également que les applications ne peuvent pas accéder à la mémoire tampon de trame pendant l’appel à DxgkDdiResetFromTimeout. Par conséquent, le pilote peut réinitialiser une boucle verrouillée par phase de contrôleur de mémoire (PLL), et ainsi de suite.

Pendant que le thread de récupération exécute DxgkDdiResetFromTimeout, les interruptions et les appels de procédure différée peuvent continuer à s'exécuter. La fonction KeSynchronizeExecution peut être utilisée pour synchroniser des parties de la procédure de réinitialisation avec des interruptions d’appareil.

Une fois le pilote retourné par DxgkDdiResetFromTimeout, la plupart des fonctions de pilote peuvent être appelées à nouveau, et le système d’exploitation commence à nettoyer les ressources qui ne sont plus nécessaires. Pendant la période de nettoyage, les fonctions de pilote suivantes sont appelées pour les raisons indiquées :

  • Le pilote est appelé à informer d’une allocation supprimée.

    Par exemple, si l’allocation a été paginée dans un segment de mémoire, la fonction DxgkDdiBuildPagingBuffer du pilote est appelée avec le membre Operation de la structure DXGKARG_BUILDPAGINGBUFFER définie sur DXGK_OPERATION_TRANSFER et avec le membre Transfer.Size défini sur zéro pour informer le pilote de l’éviction. Aucun transfert de contenu n’est impliqué, car le contenu a été perdu pendant la réinitialisation.

    Si l'allocation a été mappée dans un segment d'ouverture, la fonction DxgkDdiBuildPagingBuffer du pilote est appelée avec le membre Operation de DXGKARG_BUILDPAGINGBUFFER défini sur DXGK_OPERATION_UNMAP_APERTURE_SEGMENT pour indiquer au pilote de retirer l'allocation du segment d'ouverture.

  • La fonction DxgkDdiReleaseSwizzlingRange du pilote est appelée pour libérer une ouverture de désentrelacement et des plages d'ouverture de segment.

Le pilote ne doit pas accéder au GPU pendant les appels précédents, sauf s’il est absolument nécessaire.

Une fois la période de nettoyage terminée, le système d’exploitation appelle la fonction DxgkDdiRestartFromTimeout du pilote pour informer le pilote que le nettoyage est terminé et que le système d’exploitation reprend à l’aide de l’adaptateur pour le rendu.