Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Замечание
Начиная с Windows 10 (WDDM 2.0), операционная система поставляется со встроенным стеком Miracast, который может работать на любом GPU. Сведения о стеке Microsoft Miracast и требованиях драйверов и оборудования для поддержки экранов Miracast, начиная с Windows 10, см. в следующей документации:
Создание лучших в классе беспроводных проекционных решений с помощью Windows 10
Соответствующая документация по WHLK в Device.Graphics.WDDM13.DisplayRender.WirelessDisplay
Разработчики драйверов больше не должны реализовывать пользовательский стек 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. Подключено | ИСТИННЫЙ |
| Miracast. MiracastMonitorType | Значение, указывающее тип подключения. Если приемник Miracast внедрен в монитор или телевизор, этот элемент должен быть установлен в D3DKMDT_VOT_MIRACAST значение константы из перечисления D3DKMDT_VIDEO_OUTPUT_TECHNOLOGY. |
В следующей таблице перечислены функции Miracast, которые реализует драйвер мини-порта WDDM 1.3:
| Функция | Описание |
|---|---|
| DxgkDdiMiracastCreateContext | Создает контекст для запуска экземпляра режима ядра устройства отображения Miracast. |
| DxgkDdiMiracastDestroyContext | Создает контекст для запуска экземпляра режима ядра устройства отображения 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_TYPE в DXGK_INTERRUPT_MICACAST_CHUNK_PROCESSING_COMPLETE.
В рамках обработки прерываний драйвер может при необходимости указать MiracastEncodeChunkCompleted, а также члены pPrivateDriverData и PrivateDataDriverSize в структуре DXGKARGCB_NOTIFY_INTERRUPT_DATA. Драйвер пользовательского режима может получить доступ к данным частного драйвера в MIRACAST_CHUNK_DATA. Член PrivateDriverData .
Если в течение определенного периода времени драйвер мини-порта отображения создает больше пакетов с данными сегмента, чем использует драйвер отображения в пользовательском режиме, то доступное свободное пространство памяти для новых сегментов может исчерпаться. В этом случае драйвер мини-порта отображения возвращает STATUS_NO_MEMORY в поле MiracastEncodeChunkCompleted. Status, и необходимо вызвать функцию DxgkCbNotifyDpc, чтобы уведомить планировщик GPU операционной системы о состоянии ошибки. Вызов функции GetNextChunkData вернет код состояния STATUS_CONNECTION_RESET , а последующие вызовы начнут получать блоки, отправленные после операции сброса. Поскольку некоторые блоки были потеряны, драйвер должен создать и передать новый I-кадр.
Ограничения на режимы источника
Для обработки ограничений конвейера пикселей драйвер минипорта WDDM 1.3 обычно ограничивает режимы источника, предоставляемые операционной системе. Драйвер делает это, заполняя только список исходных режимов режимами, предоставляемыми монитором, который также поддерживает конвейер пикселей. Например, драйвер не изменяет идентификатор EDID на основе ограничений конвейера пикселей.
Аналогичным образом, для дисплеев Miracast минипорт-драйвер отображения ограничивает набор режимов источника, который предоставляется операционной системе при перечислении источника и целевых режимов. Для Miracast возможности кодирования GPU, сетевые свойства и возможности декодирования приемника могут уменьшить количество поддерживаемых режимов источника в конвейере пикселей Miracast.
Если драйвер мини-порта дисплея вызывает функцию DXGK_VIDPNSOURCEMODESET_INTERFACE::pfnAddMode для попытки добавления 3D стереорежима в источник, подключенный к 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.Type члену типа константу StatusMiracast и также должен задать DXGK_CHILD_STATUS.Miracast.Connected к TRUE, чтобы сообщить о подключении монитора через HPD к операционной системе. Драйвер должен задать DXGK_CHILD_STATUS.Miracast.MiracastMonitorType элемент с правильным типом монитора, подключенным к синку. Если приемник является частью монитора, этот элемент должен иметь значение D3DKMDT_VOT_MIRACAST.
Если драйвер знает EDID монитора, он должен сообщить об этом EDID, когда операционная система вызывает функцию DxgkDdiQueryDeviceDescriptor .
В зависимости от возможностей оборудования, списка режимов приемника Miracast и пропускной способности сети, драйвер должен сообщать о правильном исходном режиме, целевом режиме, режиме поворота и режиме масштабирования. В целевом режиме драйвер должен сообщить правильное значение члена VSyncFreqDivider в D3DKMDT_VIDEO_SIGNAL_INFO. Операционная система сравнивает целевой режим с режимом монитора и исключает любой режим, который монитор не поддерживает.