Синхронизация потоков и TDR
На следующем рисунке показано, как работает синхронизация потоков для драйвера мини-порта дисплея в модели драйвера дисплея Windows (WDDM).
Если истекло время ожидания оборудования, инициируется процесс обнаружения и восстановления времени ожидания (TDR). Планировщик GPU вызывает функцию DxgkDdiResetFromTimeout драйвера, которая сбрасывает GPU. DxgkDdiResetFromTimeout называется синхронно с любой другой функцией драйвера минипорта дисплея, за исключением функций управления питанием среды выполнения DxgkDdiSetPowerComponentFState и DxgkDdiPowerRuntimeControlRequest. То есть ни один другой поток не выполняется в драйвере, пока выполняется поток DxgkDdiResetFromTimeout . Операционная система также гарантирует отсутствие доступа к буферу кадров из любого приложения во время вызова DxgkDdiResetFromTimeout. Таким образом, драйвер может сбросить цикл блокировки фазы контроллера памяти (PLL) и т. д.
Хотя поток восстановления выполняет DxgkDdiResetFromTimeout, можно продолжать вызывать прерывания и отложенные вызовы процедур (DPC). Функцию KeSynchronizeExecution можно использовать для синхронизации частей процедуры сброса с прерываниями устройства.
После возврата драйвера из DxgkDdiResetFromTimeout можно снова вызвать большинство функций драйвера, и операционная система начнет очищать ресурсы, которые больше не требуются. В течение периода очистки по указанным причинам вызываются следующие функции драйвера:
Драйвер вызывается для уведомления о вытеснения выделения.
Например, если выделение было выброчено на страницы в сегменте памяти, вызывается функция DxgkDdiBuildPagingBuffer драйвера с элементом OperationDXGKARG_BUILDPAGINGBUFFER структуры, для DXGK_OPERATION_TRANSFER и с элементом Transfer.Size , равным нулю, чтобы сообщить драйверу о вытеснении. Обратите внимание, что передача содержимого не выполняется, так как содержимое было потеряно во время сброса.
Если выделение выгружалось в сегменте диафрагмы, вызывается функция DxgkDdiBuildPagingBuffer драйвера с элементом Operation DXGKARG_BUILDPAGINGBUFFER имеет значение DXGK_OPERATION_UNMAP_APERTURE_SEGMENT, чтобы сообщить драйверу о необходимости отменить сопоставление выделения из диафрагмы.
Функция DxgkDdiReleaseSwizzlingRange драйвера вызывается для освобождения несвертывания диафрагмы и диапазонов диафрагмы сегментов.
Драйвер не должен обращаться к GPU во время предыдущих вызовов, если это не является абсолютно необходимым.
По истечении периода очистки операционная система вызывает функцию DxgkDdiRestartFromTimeout драйвера, чтобы сообщить драйверу о том, что очистка завершена и что операционная система возобновит использование адаптера для отрисовки.