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


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

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

Изменения DDI

DxgkddiCollectDbgInfo2

Чтобы помочь анализу TDR, операционная система исторически вызывала функцию обратного вызова драйвера в режиме ядра (KMD) DxgkddiCollectDbgInfo, чтобы разрешить драйверу записывать собственные данные в отчет TDR, который система отправляет с компьютера клиента.

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.

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

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

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

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