Compartir a través de


Tareas del controlador de minipuerto de pantalla WDDM 1.3 para admitir pantallas inalámbricas miracast en Windows 8.1

Nota

A partir de Windows 10 (WDDM 2.0), el sistema operativo se distribuye con una pila de Miracast integrada que puede funcionar en cualquier GPU. Para obtener información sobre la pila de Microsoft Miracast y los requisitos de controladores y hardware para admitir pantallas de Miracast a partir de Windows 10, consulte la siguiente documentación:

Los desarrolladores de controladores ya no deben implementar una pila de Miracast personalizada. Microsoft podría quitar la compatibilidad con las pilas personalizadas de Miracast en una versión futura de Windows.

Para admitir pantallas inalámbricas miracast en Windows 8.1, los controladores de minipuerto de pantalla WDDM 1.3 que se ejecutan en modo kernel deben realizar las siguientes tareas.

Compatibilidad con la interfaz miracast

Si el controlador de miniporte de pantalla WDDM 8.1 admite pantallas de Miracast, debe informar de la estructura DXGK_MIRACAST_DISPLAY_INTERFACE , que tiene punteros a las funciones de Miracast implementadas por el controlador, cuando el subsistema del kernel de gráficos de Microsoft DirectX llama a la función DxgkDdiQueryInterface .

Si el subsistema del kernel de gráficos directX (Dxgkrnl.sys) del sistema operativo no llama a la función DxgkDdiQueryInterface para consultar la interfaz de pantalla miracast, no admite pantallas inalámbricas miracast y el controlador de miniporte de pantalla no debe notificar ningún destino de Miracast.

El controlador no debe notificar más de un destino miracast en ningún dispositivo gráfico WDDM completo; de lo contrario, el sistema operativo no puede iniciar el adaptador.

Después de que Dxgkrnl llama a DxgkDdiQueryInterface para consultar la interfaz de visualización de Miracast, el controlador puede notificar el tipo de destino como D3DKMDT_VOT_MIRACAST durante la inicialización del dispositivo cuando DxgkDdiQueryChildRelations llama a la función DxgkDdiQueryChildRelations .

El destino de Miracast debe permanecer en un estado desconectado hasta que Dxgkrnl inicie una sesión conectada de Miracast. Cuando se inicia una sesión de Miracast y un monitor está conectado al receptor de Miracast o al controlador recibe una solicitud de E/S del controlador del modo de usuario de Miracast porque un nuevo monitor se ha conectado al receptor de Miracast, el controlador de miniporte de pantalla debe notificar un valor de reconocimiento de detección de enchufe activo (HPD) de llegada de monitor al sistema operativo mediante una llamada a la función DxgkCbIndicateChildStatus . En esta llamada, el controlador debe establecer los siguientes valores en la estructura DXGK_CHILD_STATUS :

Miembro Valor
Tipo Valor constante StatusMiracast de la enumeración DXGK_CHILD_STATUS_TYPE
Miracast. Conectado TRUE
Miracast. MiracastMonitorType Valor que indica el tipo de conexión. Si el receptor miracast está incrustado en el monitor o el televisor, este miembro debe establecerse en el valor constante D3DKMDT_VOT_MIRACAST de la enumeración D3DKMDT_VIDEO_OUTPUT_TECHNOLOGY .

En la tabla siguiente se enumeran las funciones de Miracast que implementa el controlador de miniporte de pantalla WDDM 1.3:

Función Descripción
DxgkDdiMiracastCreateContext Crea un contexto para iniciar una instancia en modo kernel de un dispositivo de visualización miracast.
DxgkDdiMiracastDestroyContext Crea un contexto para iniciar una instancia en modo kernel de un dispositivo de visualización miracast.
DxgkDdiMiracastIoControl Procesa una solicitud de E/S sincrónica que se origina desde una llamada de controlador en modo de usuario de Miracast a MiracastIoControl.
DxgkDdiMiracastQueryCaps Consulta las funcionalidades de Miracast del adaptador de pantalla actual.

Inicio de la sesión de Miracast

Cuando se ha iniciado la sesión de Miracast, el sistema operativo llama a la función DxgkDdiQueryChildStatus . El controlador de minipuerto de pantalla debe establecer DXGK_CHILD_STATUS. Escriba en un valor de StatusMiracast y debe usar la estructura secundaria Miracast en DXGK_CHILD_STATUS. Si un monitor está conectado al receptor miracast, el controlador debe establecer Miracast. Conectado a D3DKMDT_VOT_MIRACAST.

El controlador debe especificar el valor de D3DKMDT_VIDEO_SIGNAL_INFO. VsyncFreqDivider, que es la relación de la velocidad de VSync de un monitor que se muestra a través de una sesión conectada de Miracast a la velocidad de sincronización virtual del receptor de Miracast. Por ejemplo, si la frecuencia de actualización vertical del receptor miracast es de 240 Hz y la frecuencia de interrupción de VSync de la pantalla conectada es de 30 Hz, el controlador debe establecer VsyncFreqDivider en 8.

Control de interrupciones para fragmentos de codificación completados

Los datos de un solo fotograma transmitidos a través de la conexión inalámbrica miracast se pueden dividir en uno o más fragmentos de codificación. Cada vez que la GPU finaliza la codificación de uno de estos fragmentos, debe generar una interrupción. En respuesta a esta interrupción, el controlador de minipuerto de pantalla debe llamar a la función DxgkCbNotifyInterrupt y completar la estructura secundaria MiracastEncodeChunkCompleted en la estructura DXGKARGCB_NOTIFY_INTERRUPT_DATA , incluida la configuración del tipo de interrupción DXGK_INTERRUPT_TYPEen DXGK_INTERRUPT_MICACAST_CHUNK_PROCESSING_COMPLETE.

Como parte del control de interrupciones, el controlador puede especificar opcionalmente miracastEncodeChunkCompleted. Miembros pPrivateDriverData y PrivateDataDriverSize en la estructura DXGKARGCB_NOTIFY_INTERRUPT_DATA . El controlador en modo de usuario puede acceder a estos datos del controlador privado en el MIRACAST_CHUNK_DATA. Miembro PrivateDriverData .

Si, durante un período de tiempo, el controlador de minipuerto de pantalla genera más paquetes con datos de fragmentos que el controlador de pantalla en modo de usuario consume, el espacio disponible de memoria disponible para los nuevos fragmentos se puede agotar. En este caso, el controlador de minipuerto de pantalla devuelve STATUS_NO_MEMORY en MiracastEncodeChunkCompleted. Estado y debe llamar a la función DxgkCbNotifyDpc para notificar al programador de GPU del sistema operativo sobre la condición de error. Una llamada a la función GetNextChunkData devolverá el código de estado STATUS_CONNECTION_RESET y las llamadas posteriores comenzarán a recibir fragmentos enviados después de la operación de restablecimiento. Dado que se perdieron algunos fragmentos, el controlador debe generar y transmitir un nuevo fotograma I.

Restricciones en los modos de origen

Para controlar las restricciones de la canalización de píxeles, un controlador de miniporte de pantalla WDDM 1.3 normalmente restringe los modos de origen que se exponen al sistema operativo. El controlador lo hace rellenando solo la lista de modos de origen con los modos expuestos por el monitor que también admite la canalización de píxeles. Por ejemplo, el controlador no modifica el EDID en función de las restricciones de canalización de píxeles.

De forma similar, para Miracast muestra el controlador de minipuerto de pantalla restringe el conjunto de modos de origen que se exponen al sistema operativo cuando enumera el conjunto de modos de origen y destino. En el caso de Miracast, se muestran las funcionalidades de codificación de GPU, las propiedades de red y las funcionalidades de descodificación del receptor pueden reducir el número de modos de origen que puede admitir la canalización de píxeles de Miracast.

Si un controlador de minipuerto de pantalla llama a la función DXGK_VIDPNSOURCEMODESET_INTERFACE::p fnAddMode para intentar agregar un modo estéreo 3D a un origen conectado a un destino de Miracast, se produce un error en la llamada de función.

Llamar a funciones de devolución de llamada proporcionadas por el sistema operativo

El sistema operativo proporciona las siguientes funciones de devolución de llamada en modo kernel de Miracast:

Función Descripción
DxgkCbMiracastSendMessage Envía un mensaje asincrónico al controlador de pantalla en modo de usuario.
DxgkCbMiracastSendMessageCallback Se usa en una llamada a DxgkCbMiracastSendMessage para especificar la estructura de IO_STATUS_BLOCK para el IRP completado.
DxgkCbReportChunkInfo
Notifica información sobre un fragmento de codificación.

Envío de mensajes de forma asincrónica desde el modo kernel al modo de usuario

Cualquier mensaje que el controlador de miniporte de pantalla envía a su controlador en modo de usuario asociado a través de una llamada DxgkCbMiracastSendMessage no se entrega hasta que se haya iniciado la sesión conectada de Miracast. Por lo tanto, si aún no se ha llamado a la función StartMiracastSession del controlador en modo de usuario, el mensaje enviado se aplaza hasta que se devuelve StartMiracastSession . Si se envía un mensaje después de llamar a la función StopMiracastSession, el sistema operativo quita el mensaje y se llama a la función DxgkCbMiracastSendMessageCallback con el estado de error establecido en pIoStatusBlock-Status>.

Modificación de un controlador de minipuerto de pantalla existente para admitir pantallas de Miracast

Cuando se llama a la función DxgkDdiStartDevice , el controlador de minipuerto de pantalla debe agregar un nuevo destino de Miracast y debe marcar el valor de reconocimiento de la detección de enchufes activos (HPD) del destino como HpdAwarenessInterruptible para que el sistema operativo no sondee este destino. Además, cuando se llama a la función DxgkDdiQueryChildRelations , el controlador debe notificar D3DKMDT_VOT_MIRACAST como tipo de conexión.

El controlador no debe notificar más de un destino miracast en cualquier dispositivo gráfico WDDM completo. Si un controlador informa de más de un destino de Miracast, el sistema operativo produce un error al iniciar el adaptador. El controlador tampoco debe notificar ningún monitor en este destino si no se inicia la sesión conectada de Miracast.

El controlador también debe notificar una estructura de DXGK_MIRACAST_DISPLAY_INTERFACE correcta, con punteros a funciones que están en el espacio de direcciones en modo kernel, cuando el subsistema del kernel de gráficos directX llama a la función DxgkDdiQueryInterface .

Cuando se inicia una sesión de Miracast y se conecta un monitor al receptor de Miracast, el controlador de minipuerto de pantalla debe establecer el DXGK_CHILD_STATUS. Escriba miembro en el valor constante StatusMiracast y también debe establecer DXGK_CHILD_STATUS. Miracast. Conectado a TRUE, para notificar un HPD de llegada de monitor al sistema operativo. El controlador debe establecer el DXGK_CHILD_STATUS. Miracast. Miembro MiracastMonitorType al tipo de monitor correcto que está conectado al receptor. Si el receptor forma parte del monitor, este miembro debe establecerse en D3DKMDT_VOT_MIRACAST.

Si el controlador conoce el EDID del monitor, debe notificar este EDID cuando el sistema operativo llama a la función DxgkDdiQueryDeviceDescriptor .

En función de las funcionalidades de hardware, la lista del modo receptor de Miracast y el ancho de banda de red, el controlador debe notificar el modo de origen, el modo de destino, el modo de rotación y el modo de escalado correctos. Para el modo de destino, el controlador debe notificar el valor de miembro VSyncFreqDivider correcto en D3DKMDT_VIDEO_SIGNAL_INFO. El sistema operativo coincide con el modo de destino en el modo de supervisión y elimina cualquier modo que el monitor no admita.