Mejoras de depuración de TDR
Para ayudar al análisis de TDR (detección y recuperación de tiempo de espera), antes el sistema operativo llamaba a la devolución de llamada DxgkddiCollectDbgInfo del controlador en modo kernel para permitir al controlador escribir su propia carga en el informe de TDR que el sistema carga desde la máquina del cliente.
Las mejoras de depuración de TDR, descritas en este artículo, están disponibles a partir de Windows 11, versión 24H2 (WDDM 3.2). Los desarrolladores de controladores de gráficos deben estar familiarizados con la detección y recuperación del tiempo de espera de GPU en Windows, tal como se describe en Detección y recuperación de tiempo de espera y TDR en Windows 8 y versiones posteriores.
Cambios de DDI
DxgkddiCollectDbgInfo2
Se ha agregado DxgkddiCollectDbgInfo2 como extensión de depuración de TDR. Esta devolución de llamada permite al sistema operativo pasar información más detallada a KMD sobre la causa principal del TDR. El controlador en modo kernel (KMD), a su vez, puede guardar el estado que es relevante para la parte de la GPU responsable del TDR.
DxgkddiCollectDbgInfo2 es un superconjunto de DxgkddiCollectDbgInfo existente.
No es necesario un controlador WDDM 3.2 para implementar DxgkddiCollectDbgInfo2, en cuyo caso el sistema operativo llama a DxgkddiCollectDbgInfo.
Si KMD implementa DxgkddiCollectDbgInfo2, el sistema operativo lo invoca en lugar de DxgkddiCollectDbgInfo en todos los casos.
La estructura DRIVER_INITIALIZATION_DATA se extiende para incluir un puntero a DxgkddiCollectDbgInfo2.
DXGKARG_COLLECTDBGINFO2
El sistema operativo pasa la estructura DXGKARG_COLLECTDBGINFO2 agregada a DxgkddiCollectDbgInfo2.
El diseño de DXGKARG_COLLECTDBGINFO2 es compatible con versiones anteriores con la estructura DXGKARG_COLLECTDBGINFO existente para permitir que la implementación de DxgkDdiCollectDbgInfo2 reutilice los DxgkDdiCollectDbgInfo auxiliares según sea necesario. Por este motivo, los campos Reason, pBuffer, BufferSize y pExtension tienen la misma semántica.
Los siguientes campos están en DXGKARG_COLLECTDBGINFO2, pero no en DXGKARG_COLLECTDBGINFO.
- TdrType
- TdrPayloadSize
- TdrPayload
Para algunos tipos de TDR, el sistema operativo proporciona información adicional en el búfer TdrPayload de TdrPayloadSize bytes. Puede ser NULL y se espera que el controlador controle este caso sin bloqueo.
Cuando la carga no es NULL, se puede convertir en una estructura que corresponda al tipo TDR. El sistema operativo podría aumentar estas estructuras de una manera compatible con versiones anteriores, agregando nuevos campos al final. El controlador debe comprobar TdrPayloadSize antes de acceder a los campos de TdrPayload para asegurarse de que el sistema operativo implementa la versión de carga deseada o posterior.
La memoria a la que apunta TdrPayload solo es válida durante la llamada a DxgkddiCollectDbgInfo2. El controlador no debe almacenar un puntero a TdrPayload más allá del final de la llamada a DxgkddiCollectDbgInfo2.
A partir de WDDM 3.2, se agregan las siguientes estructuras de carga como posibles cargas útiles a las que apuntar TdrPayload.
DXGK_TDR_PAYLOAD_ENGINE_TIMEOUT para una carga de tiempo de espera del motor (TdrType es igual a DXGK_TDR_TYPE_ENGINE_TIMEOUT).
DXGK_TDR_PAYLOAD_VSYNC_TIMEOUT para una carga de tiempo de espera de VSync (TdrType es igual a DXGK_TDR_TYPE_VSYNC_TIMEOUT).