As tarefas do driver de miniporto do WDDM 1.3 são exibidas para dar suporte a telas sem fio Miracast em Windows 8.1
Observação
Começando em Windows 10 (WDDM 2.0), o sistema operacional é fornecido com uma pilha Miracast interna que pode funcionar em qualquer GPU. Para obter informações sobre a pilha microsoft Miracast e os requisitos de drivers e hardware para dar suporte a exibições miracast a partir de Windows 10, consulte a seguinte documentação:
Criando as melhores soluções de projeção sem fio da classe com Windows 10
A documentação relevante do WHLK em Device.Graphics.WDDM13.DisplayRender.WirelessDisplay
Os desenvolvedores de driver não devem mais implementar uma pilha Miracast personalizada. A Microsoft pode remover o suporte para pilhas miracast personalizadas em uma versão futura do Windows.
Para dar suporte a telas sem fio Miracast em Windows 8.1, os drivers de miniporto de exibição WDDM 1.3 executados no modo kernel precisam realizar as tarefas a seguir.
Suporte à interface Miracast
Se o driver de miniporto de exibição WDDM 8.1 der suporte a exibições miracast, ele deverá relatar a estrutura DXGK_MIRACAST_DISPLAY_INTERFACE , que tem ponteiros para funções Miracast implementadas pelo driver, quando o subsistema de kernel de elementos gráficos do Microsoft DirectX chama a função DxgkDdiQueryInterface .
Se o subsistema de kernel de elementos gráficos DirectX do sistema operacional (Dxgkrnl.sys) não chamar a função DxgkDdiQueryInterface para consultar a interface de exibição miracast, ela não oferecerá suporte a telas sem fio Miracast e o driver de miniporto de exibição não deverá relatar nenhum destino miracast.
O driver não deve relatar mais de um destino miracast em qualquer dispositivo gráfico WDDM completo, caso contrário, o sistema operacional não iniciará o adaptador.
Depois que Dxgkrnl chamar DxgkDdiQueryInterface para consultar a interface de exibição miracast, o driver poderá relatar o tipo de destino como D3DKMDT_VOT_MIRACAST durante a inicialização do dispositivo quando Dxgkrnl chamar a função DxgkDdiQueryChildRelations .
O destino miracast deve permanecer em um estado desconectado até que Dxgkrnl inicie uma sessão conectada do Miracast. Quando uma sessão miracast é iniciada e um monitor é conectado ao coletor Miracast ou o driver recebe uma solicitação de E/S do driver de modo de usuário miracast porque um novo monitor se conectou ao coletor Miracast, o driver de miniporto de exibição deve relatar um valor de reconhecimento hpd (detecção de plug-quente) de chegada do monitor para o sistema operacional chamando a função DxgkCbIndicateChildStatus . Nessa chamada, o driver deve definir os seguintes valores na estrutura DXGK_CHILD_STATUS :
Membro | Valor |
---|---|
Tipo | StatusMiracast valor constante da enumeração DXGK_CHILD_STATUS_TYPE |
Miracast. Conectado | TRUE |
Miracast. MiracastMonitorType | Valor que indica o tipo de conexão. Se o coletor Miracast estiver inserido no monitor ou na TV, esse membro deverá ser definido como o valor constante D3DKMDT_VOT_MIRACAST da enumeração D3DKMDT_VIDEO_OUTPUT_TECHNOLOGY . |
A tabela a seguir lista as funções miracast que o driver de miniporto WDDM 1.3 implementa:
Função | Descrição |
---|---|
DxgkDdiMiracastCreateContext | Cria um contexto para iniciar uma instância do modo kernel de um dispositivo de exibição Miracast. |
DxgkDdiMiracastDestroyContext | Cria um contexto para iniciar uma instância do modo kernel de um dispositivo de exibição Miracast. |
DxgkDdiMiracastIoControl | Processa uma solicitação de E/S síncrona originária de uma chamada de driver do modo de usuário miracast para MiracastIoControl. |
DxgkDdiMiracastQueryCaps | Consulta os recursos miracast do adaptador de exibição atual. |
Iniciando a sessão miracast
Quando a sessão miracast for iniciada, o sistema operacional chamará a função DxgkDdiQueryChildStatus . O driver de miniporto de exibição deve definir DXGK_CHILD_STATUS. Digite para um valor de StatusMiracast e deve usar a estrutura filho miracast em DXGK_CHILD_STATUS. Se um monitor estiver conectado ao coletor Miracast, o driver deverá definir Miracast. Conectado aD3DKMDT_VOT_MIRACAST.
O driver deve especificar o valor de D3DKMDT_VIDEO_SIGNAL_INFO. VsyncFreqDivider, que é a taxa da taxa VSync de um monitor que é exibida por meio de uma sessão conectada do Miracast à taxa VSync do coletor Miracast. Por exemplo, se a taxa de atualização vertical do coletor Miracast for de 240 Hz e a frequência de interrupção VSync da exibição conectada for de 30 Hz, o driver deverá definir VsyncFreqDivider como 8.
Tratamento de interrupções para partes de codificação concluídas
Os dados de um único quadro transmitidos pela conexão Miracast sem fio podem ser divididos em uma ou mais partes de codificação. Sempre que a GPU terminar de codificar uma dessas partes, ela deverá gerar uma interrupção. Em resposta a essa interrupção, o driver de miniporto de exibição deve chamar a função DxgkCbNotifyInterrupt e concluir a estrutura filho MiracastEncodeChunkCompleted na estrutura DXGKARGCB_NOTIFY_INTERRUPT_DATA , incluindo a definição do tipo de interrupção DXGK_INTERRUPT_TYPE como DXGK_INTERRUPT_MICACAST_CHUNK_PROCESSING_COMPLETE.
Como parte da manipulação de interrupção, o driver pode, opcionalmente, especificar MiracastEncodeChunkCompleted. membros pPrivateDriverData e PrivateDataDriverSize na estrutura DXGKARGCB_NOTIFY_INTERRUPT_DATA . O driver do modo de usuário pode acessar esses dados de driver privado no MIRACAST_CHUNK_DATA. Membro PrivateDriverData .
Se, durante um período de tempo, o driver de miniporto de exibição gerar mais pacotes com dados de parte do que o driver de exibição do modo de usuário consumir, o espaço de memória livre disponível para novas partes poderá se esgotar. Nesse caso, o driver de miniporto de exibição retorna STATUS_NO_MEMORY em MiracastEncodeChunkCompleted. Status e ele deve chamar a função DxgkCbNotifyDpc para notificar o agendador de GPU do sistema operacional sobre a condição de erro. Uma chamada para a função GetNextChunkData retornará o código STATUS_CONNECTION_RESET status e as chamadas subsequentes começarão a receber partes que foram enviadas após a operação de redefinição. Como algumas partes foram perdidas, o driver deve gerar e transmitir um novo quadro I.
Restrições nos modos de origem
Para lidar com restrições do pipeline de pixel, um driver de miniporto de exibição WDDM 1.3 normalmente restringe os modos de origem expostos ao sistema operacional. O driver faz isso preenchendo apenas a lista de modos de origem com modos expostos pelo monitor que o pipeline de pixel também dá suporte. Por exemplo, o driver não modifica o EDID com base em restrições de pipeline de pixel.
Da mesma forma, para Miracast exibe o driver de miniporto de exibição restringe o conjunto de modos de origem expostos ao sistema operacional quando ele enumera o conjunto de modos de origem e destino. Para Miracast exibe os recursos de codificação de GPU, as propriedades de rede e os recursos de decodificação do coletor podem reduzir o número de modos de origem aos quais o pipeline de pixels miracast pode dar suporte.
Se um driver de miniporto de exibição chamar a função DXGK_VIDPNSOURCEMODESET_INTERFACE::p fnAddMode para tentar adicionar um modo estéreo 3D a uma origem conectada a um destino miracast, a chamada de função falhará.
Chamando funções de retorno de chamada fornecidas pelo sistema operacional
O sistema operacional fornece as seguintes funções de retorno de chamada no modo kernel miracast:
Função | Descrição |
---|---|
DxgkCbMiracastSendMessage | Envia uma mensagem assíncrona para o driver de exibição do modo de usuário. |
DxgkCbMiracastSendMessageCallback | Usado em uma chamada para DxgkCbMiracastSendMessage para especificar a estrutura IO_STATUS_BLOCK para o IRP concluído. |
DxgkCbReportChunkInfo | |
Relata informações sobre uma parte de codificação. |
Enviar mensagens de forma assíncrona do modo kernel para o modo de usuário
Qualquer mensagem que o driver de miniporto de exibição envia ao driver de modo de usuário associado por meio de uma chamada DxgkCbMiracastSendMessage não é entregue até que a sessão conectada do Miracast seja iniciada. Portanto, se a função StartMiracastSession do driver do modo de usuário ainda não tiver sido chamada, a mensagem enviada será adiada até que StartMiracastSession retorne. Se uma mensagem for enviada depois que a função StopMiracastSession for chamada, a mensagem será descartada pelo sistema operacional e a função DxgkCbMiracastSendMessageCallback será chamada com o erro status definido em pIoStatusBlock-Status>.
Modificando um driver de miniporto de exibição existente para dar suporte a exibições miracast
Quando a função DxgkDdiStartDevice é chamada, o driver de miniporto de exibição precisa adicionar um novo destino miracast e deve marcar o valor de reconhecimento de HPD (detecção de hot-plug) do destino como HpdAwarenessInterruptible para que o sistema operacional não sonda esse destino. Além disso, quando a função DxgkDdiQueryChildRelations é chamada, o driver deve relatar D3DKMDT_VOT_MIRACAST como seu tipo de conexão.
O driver não deve relatar mais de um destino Miracast em nenhum dispositivo gráfico completo do WDDM. Se um driver relatar mais de um destino miracast, o sistema operacional falhará na inicialização do adaptador. O driver também não deverá relatar nenhum monitor nesse destino se a sessão conectada do Miracast não for iniciada.
O driver também precisa relatar uma estrutura de DXGK_MIRACAST_DISPLAY_INTERFACE correta, com ponteiros para funções que estão no espaço de endereço no modo kernel, quando o subsistema de kernel de elementos gráficos DirectX chama a função DxgkDdiQueryInterface .
Quando uma sessão miracast é iniciada e um monitor é conectado ao coletor Miracast, o driver de miniporto de exibição deve definir o DXGK_CHILD_STATUS. Digite membro para o valor constante StatusMiracast e também deve definir DXGK_CHILD_STATUS. Miracast. Conectado aoTRUE, para relatar uma chegada de monitor HPD ao sistema operacional. O driver deve definir o DXGK_CHILD_STATUS. Miracast. Membro MiracastMonitorType ao tipo de monitor correto conectado ao coletor. Se o coletor fizer parte do monitor, esse membro deverá ser definido como D3DKMDT_VOT_MIRACAST.
Se o driver souber o EDID do monitor, ele deverá relatar esse EDID quando o sistema operacional chamar a função DxgkDdiQueryDeviceDescriptor .
Dependendo dos recursos de hardware, da lista de modo de coletor miracast e da largura de banda da rede, o driver deve relatar o modo de origem correto, o modo de destino, o modo de rotação e o modo de dimensionamento. Para o modo de destino, o driver deve relatar o valor correto do membro VSyncFreqDivider em D3DKMDT_VIDEO_SIGNAL_INFO. O sistema operacional corresponde ao modo de destino em relação ao modo de monitor e remove qualquer modo que o monitor não dá suporte.