Partager via


Améliorations de la débogabilité du TDR

Pour faciliter l'analyse TDR (timeout detection and recovery), le système d'exploitation appelait historiquement le callback DxgkddiCollectDbgInfo du pilote en mode noyau pour permettre au pilote d'écrire sa propre charge utile dans le rapport TDR que le système charge à partir de la machine du client.

Les améliorations du débogage TDR, décrites dans cet article, sont disponibles à partir de Windows 11, version 24H2 (WDDM 3.2). Les développeurs de pilotes graphiques doivent être familiarisés avec la détection et la récupération du délai d'attente du GPU dans Windows, comme décrit dans Détection et récupération du délai d'attente et TDR dans Windows 8 et versions ultérieures.

Modifications de l’DDI

DxgkddiCollectDbgInfo2

DxgkddiCollectDbgInfo2 est ajouté en tant qu'extension de débogage TDR. Ce rappel permet au système d'exploitation de transmettre à KMD des informations plus détaillées sur la cause première du TDR. Le pilote en mode noyau (KMD), à son tour, peut sauvegarder l'état pertinent pour la partie du GPU responsable du TDR.

DxgkddiCollectDbgInfo2 est un surensemble du DxgkddiCollectDbgInfo existant.

  • Un pilote WDDM 3.2 n'est pas tenu d'implémenter DxgkddiCollectDbgInfo2, auquel cas le système d'exploitation appelle DxgkddiCollectDbgInfo.

  • Si KMD implémente DxgkddiCollectDbgInfo2, le système d'exploitation l'invoque au lieu de DxgkddiCollectDbgInfo dans tous les cas.

La structure DRIVER_INITIALIZATION_DATA est étendue pour inclure un pointeur vers DxgkddiCollectDbgInfo2.

DXGKARG_COLLECTDBGINFO2

Le système d'exploitation transmet la structure DXGKARG_COLLECTDBGINFO2 ajoutée à DxgkddiCollectDbgInfo2.

La structure DXGKARG_COLLECTDBGINFO2 est rétrocompatible avec la structure DXGKARG_COLLECTDBGINFO existante afin de permettre à l'implémentation de DxgkDdiCollectDbgInfo2 de réutiliser les aides DxgkDdiCollectDbgInfo existantes en fonction des besoins. C'est pourquoi les champs Reason, pBuffer, BufferSize et pExtension ont la même sémantique.

Les autres champs suivants se trouvent dans DXGKARG_COLLECTDBGINFO2, mais pas dans DXGKARG_COLLECTDBGINFO.

  • TdrType
  • TdrPayloadSize
  • TdrPayload

Pour certains types de TDR, le système d'exploitation fournit des informations supplémentaires dans le tampon TdrPayload de TdrPayloadSize octets. Elle peut être NULL, et le pilote est censé gérer ce cas sans plantage.

Lorsque la charge utile n'est pas NULL, elle peut être moulée dans une structure correspondant au type de TDR. Le système d'exploitation peut développer ces structures de manière rétrocompatible, en ajoutant de nouveaux champs à la fin. Le pilote doit vérifier TdrPayloadSize avant d'accéder aux champs de TdrPayload pour s'assurer que le système d'exploitation implémente la version de payload souhaitée ou une version ultérieure.

La mémoire vers laquelle pointe TdrPayload n'est valide que pendant l'appel DxgkddiCollectDbgInfo2. Le pilote ne doit pas stocker un pointeur sur TdrPayload après la fin de l'appel DxgkddiCollectDbgInfo2.

À partir de WDDM 3.2, les structures de charge utile suivantes sont ajoutées en tant que charges utiles possibles vers lesquelles TdrPayload peut pointer.