Поделиться через


Улучшения отладки TDR

Чтобы помочь анализу TDR (обнаружение времени ожидания и восстановление), ОПЕРАЦИОННая система исторически называется обратным вызовом драйвера в режиме ядра DxgkddiCollectDbgInfo , чтобы разрешить драйверу записывать собственные полезные данные в отчет TDR, который система отправляет с клиентского компьютера.

Улучшения отладки TDR, описанные в этой статье, доступны начиная с Windows 11 версии 24H2 (WDDM 3.2). Разработчики графических драйверов должны быть знакомы с обнаружением и восстановлением времени ожидания GPU в Windows, как описано в разделе "Обнаружение времени ожидания" и восстановление и TDR в Windows 8 и более поздних версиях.

Изменения DDI

DxgkddiCollectDbgInfo2

DxgkddiCollectDbgInfo2 добавляется в виде расширения отладки TDR. Этот обратный вызов позволяет ОС передавать более подробные сведения в KMD о первопричине TDR. Драйвер режима ядра (KMD), в свою очередь, может сохранить состояние, соответствующее части GPU, ответственной за TDR.

DxgkddiCollectDbgInfo2 — это супермножество существующего dxgkddiCollectDbgInfo.

  • Драйвер WDDM 3.2 не требуется для реализации DxgkddiCollectDbgInfo2, в этом случае ОС вызывает DxgkddiCollectDbgInfo.

  • Если KMD реализует DxgkddiCollectDbgInfo2, ОС вызывает его вместо DxgkddiCollectDbgInfo во всех случаях.

Структура DRIVER_INITIALIZATION_DATA расширена, чтобы включить указатель на DxgkddiCollectDbgInfo2.

DXGKARG_COLLECTDBGINFO2

ОС передает добавленную структуру DXGKARG_COLLECTDBGINFO2 в DxgkddiCollectDbgInfo2.

Макет DXGKARG_COLLECTDBGINFO2 обратно совместим с существующей структурой DXGKARG_COLLECTDBGINFO, чтобы разрешить реализации DxgkDdiCollectDbgInfo2 повторно использовать существующие вспомогательные средства DxgkDdiCollectDbgInfo по мере необходимости. По этой причине поля Reason, pBuffer, BufferSize и pExtension имеют одинаковую семантику.

Следующие другие поля находятся в DXGKARG_COLLECTDBGINFO2, но не в DXGKARG_COLLECTDBGINFO.

  • TdrType
  • TdrPayloadSize
  • TdrPayload

Для некоторых типов TDR ОС предоставляет дополнительные сведения в буфере TdrPayload байт TdrPayloadSize. Он может иметь значение NULL, и драйвер, как ожидается, обработает этот случай без сбоя.

Если полезные данные не равно NULL, его можно привести к структуре, соответствующей типу TDR. Ос может увеличивать эти структуры в обратном порядке, добавляя новые поля в конце. Драйвер должен проверка TdrPayloadSize перед доступом к полям TdrPayload, чтобы убедиться, что ОС реализует нужную версию полезных данных или более позднюю.

Память, на которую указывает TdrPayload, допустима только во время вызова DxgkddiCollectDbgInfo2. Драйвер не должен хранить указатель на TdrPayload после завершения вызова DxgkddiCollectDbgInfo2 .

Начиная с WDDM 3.2, следующие структуры полезных данных добавляются как возможные полезные данные для TdrPayload, чтобы они указывали на.

  • DXGK_TDR_PAYLOAD_ENGINE_TIMEOUT для полезных данных времени ожидания двигателя (TdrType равно DXGK_TDR_TYPE_ENGINE_TIMEOUT).

  • DXGK_TDR_PAYLOAD_VSYNC_TIMEOUT для полезных данных времени ожидания VSync (TdrType равно DXGK_TDR_TYPE_VSYNC_TIMEOUT).