Condividi tramite


Miglioramenti del debug TDR

Per facilitare l'analisi TDR (timeout detection and recovery), il sistema operativo ha storicamente chiamato il callback DxgkddiCollectDbgInfo del driver per consentire al driver di scrivere il proprio payload nel report TDR che il sistema carica dal computer del cliente.

I miglioramenti del debug TDR, descritti in questo articolo, sono disponibili a partire da Windows 11 versione 24H2 (WDDM 3.2). Gli sviluppatori di driver grafici devono avere familiarità con il rilevamento e il ripristino di timeout GPU in Windows, come descritto in Rilevamento e ripristino di timeout e TDR in Windows 8 e versioni successive.

Modifiche DDI

DxgkddiCollectDbgInfo2

DxgkddiCollectDbgInfo2 viene aggiunto come estensione di debug TDR. Questo callback consente al sistema operativo di passare informazioni più dettagliate al KMD sulla causa radice del TDR. Il driver in modalità kernel (KMD), a sua volta, può salvare lo stato rilevante per la parte della GPU responsabile del TDR.

DxgkddiCollectDbgInfo2 è un superset per dxgkddiCollectDbgInfo esistente.

  • Un driver WDDM 3.2 non è necessario per implementare DxgkddiCollectDbgInfo2, nel qual caso il sistema operativo chiama DxgkddiCollectDbgInfo.

  • Se KMD implementa DxgkddiCollectDbgInfo2, il sistema operativo lo richiama invece di DxgkddiCollectDbgInfo in tutti i casi.

La struttura DRIVER_INITIALIZATION_DATA viene estesa per includere un puntatore a DxgkddiCollectDbgInfo2.

DXGKARG_COLLECTDBGINFO2

Il sistema operativo passa la struttura di DXGKARG_COLLECTDBGINFO2 aggiunta a DxgkddiCollectDbgInfo2.

Il layout di DXGKARG_COLLECTDBGINFO2 è compatibile con le versioni precedenti della struttura DXGKARG_COLLECTDBGINFO esistente per consentire all'implementazione dxgkDdiCollectDbgInfo2 di riutilizzare gli helper DxgkDdiCollectDbgInfo esistenti in base alle esigenze. Per questo motivo, i campi Reason, pBuffer, BufferSize e pExtension hanno la stessa semantica.

Gli altri campi seguenti si trovano in DXGKARG_COLLECTDBGINFO2, ma non in DXGKARG_COLLECTDBGINFO.

  • TdrType
  • TdrPayloadSize
  • TdrPayload

Per alcuni tipi TDR, il sistema operativo fornisce informazioni aggiuntive nel buffer TdrPayload dei byte TdrPayloadSize . Può essere NULL e si prevede che il driver gestisca questo caso senza arrestarsi in modo anomalo.

Quando il payload non è NULL, può essere eseguito il cast a una struttura che corrisponde al tipo TDR. Il sistema operativo potrebbe aumentare queste strutture in modo compatibile con le versioni precedenti, aggiungendo nuovi campi alla fine. Il driver deve controllare TdrPayloadSize prima di accedere ai campi TdrPayload per assicurarsi che il sistema operativo implementi la versione del payload desiderata o versione successiva.

La memoria a cui punta TdrPayload è valida solo durante la chiamata DxgkddiCollectDbgInfo2. Il driver non deve archiviare un puntatore a TdrPayload oltre la fine della chiamata dxgkddiCollectDbgInfo2 .

A partire da WDDM 3.2, le strutture di payload seguenti vengono aggiunte il più possibile payload per TdrPayload a cui puntare.

  • DXGK_TDR_PAYLOAD_ENGINE_TIMEOUT per un payload di timeout del motore (TdrType è uguale a DXGK_TDR_TYPE_ENGINE_TIMEOUT).

  • DXGK_TDR_PAYLOAD_VSYNC_TIMEOUT per un payload di timeout VSync (TdrType è uguale a DXGK_TDR_TYPE_VSYNC_TIMEOUT).