Задачи драйвера минипорта дисплея WDDM 1.3 для поддержки беспроводных дисплеев Miracast на Windows 8.1

Примечание

Начиная с Windows 10 (WDDM 2.0), операционная система поставляется со встроенным стеком Miracast, который может работать на любом GPU. Сведения о стеке Microsoft Miracast и требованиях к драйверам и оборудованию для поддержки дисплеев Miracast начиная с Windows 10 см. в следующей документации:

Разработчики драйверов больше не должны реализовывать пользовательский стек Miracast. Корпорация Майкрософт может удалить поддержку пользовательских стеков Miracast в будущей версии Windows.

Чтобы поддерживать беспроводные дисплеи Miracast на Windows 8.1, драйверам мини-портов дисплея WDDM 1.3, работающим в режиме ядра, необходимо выполнить следующие задачи.

Поддержка интерфейса Miracast

Если драйвер минипорта дисплея WDDM 8.1 поддерживает дисплеи Miracast, он должен сообщать о структуре DXGK_MIRACAST_DISPLAY_INTERFACE , которая содержит указатели на реализованные драйвером функции Miracast, когда подсистема ядра графики Microsoft DirectX вызывает функцию DxgkDdiQueryInterface .

Если подсистема графического ядра DirectX операционной системы (Dxgkrnl.sys) не вызывает функцию DxgkDdiQueryInterface для запроса интерфейса отображения Miracast, то она не поддерживает беспроводные дисплеи Miracast, и драйвер минипорта дисплея не должен сообщать о целевом объекте Miracast.

Драйвер не должен сообщать о нескольких целевых объектах Miracast на любом полном графическом устройстве WDDM, в противном случае операционная система не сможет запустить адаптер.

После того как Dxgkrnl вызывает DxgkDdiQueryInterface для запроса интерфейса отображения Miracast, драйвер может сообщить о целевом типе как D3DKMDT_VOT_MIRACAST во время инициализации устройства, когда Dxgkrnl вызывает функцию DxgkDdiQueryChildRelations.

Целевой объект Miracast должен оставаться в отключенном состоянии, пока Dxgkrnl не запустит сеанс, подключенный к Miracast. При запуске сеанса Miracast и подключении монитора к приемнику Miracast или драйвер получает запрос ввода-вывода от драйвера пользовательского режима Miracast, так как к приемнику Miracast подключен новый монитор, драйвер минипорта дисплея должен сообщить операционной системе значение осведомленности о прибытии монитора с горячим подключением (HPD) в операционную систему, вызвав функцию DxgkCbIndicateChildStatus . В этом вызове драйвер должен задать следующие значения в структуре DXGK_CHILD_STATUS :

Член Значение
Тип Значение константы StatusMiracast перечисления DXGK_CHILD_STATUS_TYPE
Miracast. Подключен TRUE
Miracast. MiracastMonitorType Значение, указывающее тип подключения. Если приемник Miracast внедрен в монитор или телевизор, этому элементу следует задать значение D3DKMDT_VOT_MIRACAST константы перечисления D3DKMDT_VIDEO_OUTPUT_TECHNOLOGY .

В следующей таблице перечислены функции Miracast, которые реализует драйвер мини-порта дисплея WDDM 1.3:

Функция Описание
DxgkDdiMiracastCreateContext Создает контекст для запуска экземпляра устройства отображения Miracast в режиме ядра.
DxgkDdiMiracastDetextContext Создает контекст для запуска экземпляра устройства отображения Miracast в режиме ядра.
DxgkDdiMiracastIoControl Обрабатывает синхронный запрос ввода-вывода, исходящий из вызова драйвера в пользовательском режиме Miracast к MiracastIoControl.
DxgkDdiMiracastQueryCaps Запрашивает возможности Miracast текущего видеоадаптера.

Запуск сеанса Miracast

После запуска сеанса Miracast операционная система вызывает функцию DxgkDdiQueryChildStatus . Драйвер мини-порта дисплея должен задать DXGK_CHILD_STATUS. Введите значение StatusMiracast и следует использовать дочернюю структуру Miracast в DXGK_CHILD_STATUS. Если монитор подключен к приемнику Miracast, драйвер должен установить Miracast. Подключено к D3DKMDT_VOT_MIRACAST.

Драйвер должен указать значение D3DKMDT_VIDEO_SIGNAL_INFO. VsyncFreqDivider— отношение скорости VSync монитора, отображаемого через сеанс, подключенный к Miracast, к скорости VSync приемника Miracast. Например, если вертикальная частота обновления приемника Miracast составляет 240 Гц, а частота прерываний VSync подключенного дисплея — 30 Гц, драйвер должен установить VsyncFreqDivider в значение 8.

Обработка прерываний для завершенных блоков кодирования

Данные для одного кадра, передаваемые через беспроводное соединение Miracast, можно разбить на один или несколько блоков кодирования. Каждый раз, когда GPU завершает кодирование одного из этих блоков, он должен создать прерывание. В ответ на это прерывание драйвер минипорта дисплея должен вызвать функцию DxgkCbNotifyInterrupt и завершить дочернюю структуру MiracastEncodeChunkCompleted в структуре DXGKARGCB_NOTIFY_INTERRUPT_DATA , в том числе задать тип прерывания DXGK_INTERRUPT_TYPEDXGK_INTERRUPT_MICACAST_CHUNK_PROCESSING_COMPLETE.

В рамках обработки прерываний драйвер может при необходимости указать MiracastEncodeChunkCompleted. Элементы pPrivateDriverData и PrivateDataDriverSize в структуре DXGKARGCB_NOTIFY_INTERRUPT_DATA . Драйвер пользовательского режима может получить доступ к данным этого частного драйвера в MIRACAST_CHUNK_DATA. Элемент PrivateDriverData .

Если в течение определенного периода времени драйвер мини-порта дисплея создает больше пакетов с блоками данных, чем использует драйвер дисплея в пользовательском режиме, то доступное свободное место в памяти для новых блоков может иссяк. В этом случае драйвер мини-порта дисплея возвращает STATUS_NO_MEMORY в MiracastEncodeChunkCompleted. Состояние, и он должен вызвать функцию DxgkCbNotifyDpc , чтобы уведомить планировщик GPU операционной системы о состоянии ошибки. Вызов функции GetNextChunkData вернет код состояния STATUS_CONNECTION_RESET , а последующие вызовы начнут получать блоки, отправленные после операции сброса. Поскольку некоторые фрагменты были потеряны, драйвер должен создать и передать новый I-кадр.

Ограничения на режимы источника

Для обработки ограничений пиксельного конвейера драйвер минипорта дисплея WDDM 1.3 обычно ограничивает режимы источника, предоставляемые операционной системе. Драйвер делает это, заполняя список режимов источника режимами, предоставляемыми монитором, который также поддерживает конвейер пикселей. Например, драйвер не изменяет EDID на основе ограничений конвейера пикселей.

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

Если драйвер мини-порта дисплея вызывает функцию DXGK_VIDPNSOURCEMODESET_INTERFACE::p fnAddMode , чтобы попытаться добавить трехмерный стереорежим в источник, подключенный к целевому объекту Miracast, вызов функции завершается ошибкой.

Вызов функций обратного вызова, предоставляемых операционной системой

Операционная система предоставляет следующие функции обратного вызова в режиме ядра Miracast:

Функция Описание
DxgkCbMiracastSendMessage Отправляет асинхронное сообщение драйверу отображения пользовательского режима.
DxgkCbMiracastSendMessageCallback Используется в вызове DxgkCbMiracastSendMessage для указания структуры IO_STATUS_BLOCK для завершенного IRP.
DxgkCbReportChunkInfo
Сообщает сведения о блоке кодирования.

Асинхронная отправка сообщений из режима ядра в пользовательский режим

Любое сообщение, которое драйвер минипорта дисплея отправляет связанному драйверу пользовательского режима через вызов DxgkCbMiracastSendMessage , не доставляется до запуска сеанса, подключенного к Miracast. Таким образом, если функция StartMiracastSession драйвера пользовательского режима еще не была вызвана, отправленное сообщение откладывается до тех пор, пока не будет возвращено значение StartMiracastSession . Если сообщение отправляется после вызова функции StopMiracastSession, то сообщение удаляется операционной системой, а функция DxgkCbMiracastSendMessageCallback вызывается с состоянием ошибки, установленным в pIoStatusBlock-Status>.

Изменение существующего драйвера минипорта дисплея для поддержки дисплеев Miracast

При вызове функции DxgkDdiStartDevice драйвер мини-порта дисплея должен добавить новый целевой объект Miracast и пометить значение осведомленности целевого объекта с горячим подключением (HPD) как HpdAwarenessInterruptible , чтобы операционная система не опрашивала этот целевой объект. Кроме того, при вызове функции DxgkDdiQueryChildRelations драйвер должен сообщить о D3DKMDT_VOT_MIRACAST в качестве типа подключения.

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

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

При запуске сеанса Miracast и подключении монитора к приемнику Miracast драйвер мини-порта дисплея должен задать DXGK_CHILD_STATUS. Введите для элемента значение константы StatusMiracast , а также задать DXGK_CHILD_STATUS. Miracast. Подключено к TRUE, чтобы сообщить о прибытии монитора HPD в операционную систему. Драйвер должен задать DXGK_CHILD_STATUS. Miracast. Элемент MiracastMonitorType для правильного типа монитора, подключенного к приемнику. Если приемник является частью монитора, для этого элемента должно быть задано значение D3DKMDT_VOT_MIRACAST.

Если драйвер знает EDID монитора, он должен сообщить об этом EDID, когда операционная система вызывает функцию DxgkDdiQueryDeviceDescriptor .

В зависимости от аппаратных возможностей, списка режимов приемника Miracast и пропускной способности сети драйвер должен сообщить о правильном исходном режиме, целевом режиме, режиме поворота и режиме масштабирования. Для целевого режима драйвер должен сообщить правильное значение члена VSyncFreqDivider в D3DKMDT_VIDEO_SIGNAL_INFO. Операционная система сопоставляет целевой режим с режимом монитора и обрезает любой режим, который монитор не поддерживает.