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


Обработка ошибок EvtIddCxMonitorAssignSwapChain

Изменение в обработке ошибок EvtIddCxMonitorAssignSwapChain

В выпусках Windows 10 до версии 1903 остальная часть композиции настольных компьютеров не знала, не удалось ли EvtIddCxMonitorAssignSwapChain. Он продолжал отображать и представлять кадры, которые не обрабатывает непрямый адаптер отображения, в результате чего IddCx завершает непрямый драйвер отображения (IDD) через некоторое время.

Начиная с Windows 10 версии 1903 (IddCx 1.4), обработка ошибок IddCx для этого обратного вызова изменилась для всех версий драйверов и представила код состояния STATUS_GRAPHICS_INDIRECT_DISPLAY_ABANDON_SWAPCHAIN . Дополнительные сведения см. в разделе EvtIddCxMonitorAssignSwapChain.

Обработка ошибок в потоке обработки кадров

После успешного возвращения идентификатора из EvtIddCxMonitorAssignSwapChain он владеет объектом hSwapChain . Если драйвер сталкивается с ошибкой, которая предотвращает его продолжение обработки кадра, он может вызвать WdfObjectDelete , чтобы освободить владение. ОС обнаружит удаление и приведет к созданию новой цепочки переключения.

Если драйвер знает, что он не может восстановиться после этой ошибки, он должен вызвать IddCxReportCriticalError , чтобы остановить устройство.

Рекомендуемый подход к обработке ошибок цепочки буферов

Существует несколько причин сбоя в обратном вызове EvtIddCxMonitorAssignSwapChain или при обработке кадров. К категориям сбоев относятся следующие:

  • Временные проблемы, относящиеся к решению, такие как временная проблема с оборудованием. Эта проблема может быть устранена с помощью упрощенных механизмов восстановления, которые не повлияют на взаимодействие с пользователем, так как восстановление происходит быстро (обычно в течение секунды) и не влияет на визуальное содержимое на экране (например, без мерцаний).
  • Постоянные проблемы, относящиеся к решению, такие как взаимоблокировка в драйвере или серьезная проблема с оборудованием. Этот тип проблемы обычно не может быть восстановлен быстро, если вообще.
  • Ошибки API DirectX, вызванные событиями, внешними для драйвера. Например, драйвер не контролирует такие события, как когда адаптер, на котором устройство D3D обрабатывает образ рабочего стола, был PnpStopped или произошел сбой на уровне GPU, и он был сброшен.
  • Ошибки API DirectX, вызванные драйвером. Ошибки драйвера могут привести к возникновению ошибки устройства D3D или зависания. Например, вызов CopySubResource с координатами за пределами границы текстуры приведет устройство к состоянию ошибки.
  • Ошибки API DirectX, вызванные другим драйвером GPU IHV. Эти ошибки могут быть результатом правильных шаблонов вызовов в идентификаторе, которые активируют ошибки драйвера GPU IHV.

Драйверу трудно точно различать различные ошибки DirectX. Основное различие заключается в том, что ошибки, вызванные внешними компонентами DirectX, скорее всего, будут временными, и система восстановится в стабильном состоянии; в то время как, если ошибка вызвана непрямым отображением или драйвером GPU, ошибки, скорее всего, будут возникать снова.

Дополнительные сведения о распространении этих ошибок в ОС см. в статье EvtIddCxMonitorAssignSwapChain.

Ниже приведены некоторые рекомендации по работе с каждым типом ошибки в драйвере.

Временные проблемы, относящиеся к решению

Драйвер должен устранить проблему при обработке кадра. Это действие может привести к небольшой задержке в обработке кадра. Если ошибка возникает регулярно, драйвер может рассмотреть возможность упреждения ошибки до постоянной проблемы.

Постоянные проблемы, связанные с решением

Драйвер должен вызывать IddCxReportCriticalError , используя основной код, равный или выше 0x100, и использовать уникальные основные или незначительные коды, чтобы представить тип ошибки, чтобы помочь клиентам и телеметрии исследования.

Ошибка DirectX

Самый простой способ обработки ошибок DirectX заключается в том, чтобы распространить их обратно в ОС, чтобы повторить повторную попытку. Драйвер должен вернуть STATUS_GRAPHICS_INDIRECT_DISPLAY_ABANDON_SWAPCHAIN из EvtIddCxMonitorAssignSwapChain или, если ошибка возникает при обработке кадра, драйвер должен освободить цепочку буферов, вызвав WdfObjectDelete.

Этот простой подход обрабатывает ошибки, инициируемые внешними событиями, так как ОС стабилизирует и создает новую цепочку буферов (возможно, на новом адаптере Dxgi). Если использование DirectX драйвера ограничено, этот подход работает хорошо.

Для более сложных драйверов, которые могут столкнуться с ошибками DirectX, вызванными ошибками в идентификаторе или драйверами, работающими на старых или ошибках драйверов DirectX, этот подход может завершиться бесконечным циклом сбоев цепочки идентификаторов. Чтобы избежать бесконечного цикла, идентификатор идентификатора может отслеживать частоту этих ошибок и перемещаться по этапам восстановления, когда данный этап достиг достаточного количества циклов ошибок. Если возникают ошибки DirectX, важно, чтобы драйвер уничтожил устройство DX и создал новое устройство, так как после того, как устройство DX находится в состоянии ошибки, оно никогда не восстановится и необходимо повторно создать.

Текущий этап Действие драйвера, если оно обнаруживает слишком много ошибок последовательной цепочки буферов DirectX
LuID адаптера отрисовки, предоставленного в EvtIddCxMonitorAssignSwapChain , является аппаратным адаптером Используйте Dxgi, чтобы найти LUID адаптера программного обеспечения и вызвать IddCxAdapterSetRenderAdapter , чтобы запросить, чтобы ОС использовала адаптер программного обеспечения для отрисовки рабочего стола.
Адаптер отрисовки LUID, предоставленный в EvtIddCxMonitorAssignSwapChain , является адаптером программного обеспечения Драйвер должен вызывать IddCxReportCriticalError с помощью основного кода, равного или выше 0x100, и использовать уникальные основные или незначительные коды, чтобы представлять тип ошибки, чтобы помочь клиентам и телеметрии исследования

Например, драйвер может рассмотреть пять последовательных сбоев DirectX в EvtIddCxMonitorAssignSwapChain или пять сбоев при обработке кадров с 1 минутой в качестве критериев для текущего этапа в таблице выше.