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


Синхронизация потоков и TDR

На следующем рисунке показано, как синхронизация потоков работает для драйвера минипорта дисплея в режиме ядра (KMD) в WDDM.

Схема, демонстрирующая синхронизацию потоков в WDDM.

Если происходит аппаратный тайм-аут, система инициирует процесс обнаружения и восстановления тайм-аута (TDR). Планировщик GPU вызывает функцию DXgkDdiResetFromTimeout драйвера, которая сбрасывает GPU:

  • DxgkDdiResetFromTimeout называется синхронно с любой другой функцией KMD, за исключением функций управления питанием среды выполнения DxgkDdiSetPowerComponentFState и DxgkDdiPowerRuntimeControlRequest. То есть операционная система гарантирует, что ни один другой поток не выполняется в драйвере во время выполнения потока DxgkDdiResetFromTimeout .
  • ОС также гарантирует, что приложения не могут получить доступ к буферу кадров во время вызова DxgkDdiResetFromTimeout. Таким образом, драйвер может сбросить блокируемый цикл контроллера памяти (PLL) и т. д.

Хотя поток восстановления выполняет DxgkDdiResetFromTimeout, прерывания и отложенные вызовы процедур (ДПС) могут продолжать вызываться. Функцию KeSynchronizeExecution можно использовать для синхронизации частей процедуры сброса с прерываниями устройства.

После возвращения драйвера из DxgkDdiResetFromTimeout большинство функций драйверов можно снова вызывать, и ОС начинает очищать ресурсы, которые больше не требуются. В течение периода очистки следующие функции драйвера вызываются по указанным причинам:

  • Драйвер вызывается для уведомления о выселении выделенного ресурса.

    Например, если выделение было размещено в сегменте памяти, функция драйвера DxgkDdiBuildPagingBuffer вызывается с элементом Operation структуры DXGKARG_BUILDPAGINGBUFFER, установленным в DXGK_OPERATION_TRANSFER, и элементом Transfer.Size, установленным в ноль, чтобы сообщить драйверу о вытеснении. Передача содержимого не осуществляется, так как оно было утрачено во время сброса.

    Если выделение было странично размещено в апертурном сегменте, функция драйвера DxgkDdiBuildPagingBuffer вызывается с элементом Operation DXGKARG_BUILDPAGINGBUFFER, установленным в DXGK_OPERATION_UNMAP_APERTURE_SEGMENT, чтобы сообщить драйверу о необходимости разобрать выделение из апертурного сегмента.

  • Функция dxgkDdiReleaseSwizzlingRange драйвера вызывается для освобождения распаковки диафрагмы и диапазонов диафрагмы сегментов.

Драйвер не должен получить доступ к GPU во время предыдущих вызовов, если это не обязательно.

После завершения очистки ОС вызывает функцию DxgkDdiRestartFromTimeout драйвера, чтобы сообщить драйверу о завершении очистки и что ОС возобновит использование адаптера для отрисовки.