Partager via


WDDM 1.3 affiche les tâches du pilote miniport pour prendre en charge les écrans sans fil Miracast sur Windows 8.1

Notes

À compter de Windows 10 (WDDM 2.0), le système d’exploitation est fourni avec une pile Miracast intégrée qui peut fonctionner sur n’importe quel GPU. Pour plus d’informations sur la pile Microsoft Miracast et la configuration requise des pilotes et du matériel pour prendre en charge les affichages Miracast à partir de Windows 10, consultez la documentation suivante :

Les développeurs de pilotes ne doivent plus implémenter une pile Miracast personnalisée. Microsoft peut supprimer la prise en charge des piles Miracast personnalisées dans une version ultérieure de Windows.

Pour prendre en charge les écrans sans fil Miracast sur Windows 8.1, WDDM 1.3 affiche les pilotes miniport qui s’exécutent en mode noyau doivent effectuer les tâches suivantes.

Prise en charge de l’interface Miracast

Si le pilote miniport d’affichage WDDM 8.1 prend en charge les affichages Miracast, il doit signaler la structure DXGK_MIRACAST_DISPLAY_INTERFACE , qui comporte des pointeurs vers les fonctions Miracast implémentées par le pilote, lorsque le sous-système du noyau graphique Microsoft DirectX appelle la fonction DxgkDdiQueryInterface .

Si le sous-système du noyau graphique DirectX du système d’exploitation (Dxgkrnl.sys) n’appelle pas la fonction DxgkDdiQueryInterface pour interroger l’interface d’affichage Miracast, elle ne prend pas en charge les affichages sans fil Miracast, et le pilote de miniport d’affichage ne doit signaler aucune cible Miracast.

Le pilote ne doit pas signaler plus d’une cible Miracast sur un périphérique graphique WDDM complet, sinon le système d’exploitation ne parvient pas à démarrer l’adaptateur.

Une fois que Dxgkrnl a appelé DxgkDdiQueryInterface pour interroger l’interface d’affichage Miracast, le pilote peut signaler le type cible comme D3DKMDT_VOT_MIRACAST pendant l’initialisation de l’appareil lorsque Dxgkrnl appelle la fonction DxgkDdiQueryChildRelations .

La cible Miracast doit rester dans un état déconnecté jusqu’à ce que Dxgkrnl démarre une session connectée à Miracast. Lorsqu’une session Miracast démarre et qu’un moniteur est connecté au récepteur Miracast ou que le pilote reçoit une demande d’E/S du pilote en mode utilisateur Miracast parce qu’un nouveau moniteur s’est connecté au récepteur Miracast, le pilote miniport d’affichage doit signaler une valeur de prise de conscience hpD (Hot Plug Detection) d’arrivée du moniteur au système d’exploitation en appelant la fonction DxgkCbIndicateChildStatus . Dans cet appel, le pilote doit définir les valeurs suivantes dans la structure DXGK_CHILD_STATUS :

Membre Valeur
Type Valeur constante StatusMiracast de l’énumération DXGK_CHILD_STATUS_TYPE
Miracast. Connecté TRUE
Miracast. MiracastMonitorType Valeur qui indique le type de connexion. Si le récepteur Miracast est incorporé dans le moniteur ou le téléviseur, ce membre doit être défini sur la valeur constante D3DKMDT_VOT_MIRACAST de l’énumération D3DKMDT_VIDEO_OUTPUT_TECHNOLOGY .

Le tableau suivant répertorie les fonctions Miracast que le pilote miniport d’affichage WDDM 1.3 implémente :

Fonction Description
DxgkDdiMiracastCreateContext Crée un contexte pour démarrer une instance en mode noyau d’un périphérique d’affichage Miracast.
DxgkDdiMiracastDestroyContext Crée un contexte pour démarrer une instance en mode noyau d’un périphérique d’affichage Miracast.
DxgkDdiMiracastIoControl Traite une demande d’E/S synchrone qui provient d’un appel de pilote en mode utilisateur Miracast à MiracastIoControl.
DxgkDdiMiracastQueryCaps Interroge les fonctionnalités Miracast de l’adaptateur d’affichage actuel.

Démarrage de la session Miracast

Lorsque la session Miracast a été démarrée, le système d’exploitation appelle la fonction DxgkDdiQueryChildStatus . Le pilote de miniport d’affichage doit définir DXGK_CHILD_STATUS. Tapez la valeur StatusMiracast et utilisez la structure enfant Miracast dans DXGK_CHILD_STATUS. Si un moniteur est connecté au récepteur Miracast, le pilote doit définir Miracast. Connecté à D3DKMDT_VOT_MIRACAST.

Le pilote doit spécifier la valeur de D3DKMDT_VIDEO_SIGNAL_INFO. VsyncFreqDivider, qui est le rapport entre le taux de synchronisation VSync d’un moniteur qui s’affiche via une session connectée Miracast et le taux de synchronisation VSync du récepteur Miracast. Par exemple, si la fréquence de rafraîchissement verticale du récepteur Miracast est de 240 Hz et que la fréquence d’interruption VSync de l’affichage connecté est de 30 Hz, le pilote doit définir VsyncFreqDivider sur 8.

Gestion des interruptions pour les blocs d’encodage terminés

Les données d’une trame unique transmises via la connexion Miracast sans fil peuvent être divisées en un ou plusieurs blocs d’encodage. Chaque fois que le GPU termine l’encodage de l’un de ces blocs, il doit générer une interruption. En réponse à cette interruption, le pilote miniport d’affichage doit appeler la fonction DxgkCbNotifyInterrupt et terminer la structure enfant MiracastEncodeChunkCompleted dans la structure DXGKARGCB_NOTIFY_INTERRUPT_DATA , y compris définir le type d’interruption DXGK_INTERRUPT_TYPEsur DXGK_INTERRUPT_MICACAST_CHUNK_PROCESSING_COMPLETE.

Dans le cadre de la gestion des interruptions, le pilote peut éventuellement spécifier miracastEncodeChunkCompleted. Membres pPrivateDriverData et PrivateDataDriverSize dans la structure DXGKARGCB_NOTIFY_INTERRUPT_DATA . Le pilote en mode utilisateur peut accéder à ces données de pilote privé dans le MIRACAST_CHUNK_DATA. Membre PrivateDriverData .

Si, sur une période donnée, le pilote de miniport d’affichage génère plus de paquets avec des données de bloc que le pilote d’affichage en mode utilisateur en consomme, l’espace mémoire disponible pour les nouveaux blocs peut s’exécuter. Dans ce cas, le pilote de miniport d’affichage retourne STATUS_NO_MEMORY dans MiracastEncodeChunkCompleted. État, et il doit appeler la fonction DxgkCbNotifyDpc pour informer le planificateur GPU du système d’exploitation de la condition d’erreur. Un appel à la fonction GetNextChunkData retourne le code STATUS_CONNECTION_RESET status, et les appels suivants commencent à recevoir des blocs qui ont été envoyés après l’opération de réinitialisation. Étant donné que certains blocs ont été perdus, le pilote doit générer et transmettre un nouveau I-frame.

Restrictions sur les modes sources

Pour gérer les contraintes du pipeline de pixels, un pilote miniport d’affichage WDDM 1.3 restreint généralement les modes sources exposés au système d’exploitation. Pour ce faire, le pilote remplit uniquement la liste des modes sources avec les modes exposés par le moniteur que le pipeline de pixels prend également en charge. Par exemple, le pilote ne modifie pas l’EDID en fonction des contraintes de pipeline de pixels.

De même, pour les affichages Miracast, le pilote miniport d’affichage limite l’ensemble des modes sources qui sont exposés au système d’exploitation lorsqu’il énumère l’ensemble des modes source et cible. Pour Miracast affiche les fonctionnalités d’encodage GPU, les propriétés réseau et les fonctionnalités de décodage du récepteur peuvent réduire le nombre de modes sources que le pipeline de pixels Miracast peut prendre en charge.

Si un pilote de miniport d’affichage appelle la fonction DXGK_VIDPNSOURCEMODESET_INTERFACE ::p fnAddMode pour tenter d’ajouter un mode stéréo 3D à une source connectée à une cible Miracast, l’appel de fonction échoue.

Appel des fonctions de rappel fournies par le système d’exploitation

Le système d’exploitation fournit les fonctions de rappel en mode noyau Miracast suivantes :

Fonction Description
DxgkCbMiracastSendMessage Envoie un message asynchrone au pilote d’affichage en mode utilisateur.
DxgkCbMiracastSendMessageCallback Utilisé dans un appel à DxgkCbMiracastSendMessage pour spécifier la structure IO_STATUS_BLOCK pour l’IRP terminé.
DxgkCbReportChunkInfo
Signale des informations sur un bloc d’encodage.

Envoi asynchrone de messages du mode noyau au mode utilisateur

Tout message que le pilote de miniport d’affichage envoie à son pilote en mode utilisateur associé par le biais d’un appel DxgkCbMiracastSendMessage n’est pas remis tant que la session connectée Miracast n’a pas démarré. Par conséquent, si la fonction StartMiracastSession du pilote en mode utilisateur n’a pas encore été appelée, le message envoyé est différé jusqu’au retour de StartMiracastSession . Si un message est envoyé après l’appel de la fonction StopMiracastSession, le message est supprimé par le système d’exploitation et la fonction DxgkCbMiracastSendMessageCallback est appelée avec l’erreur status définie dans pIoStatusBlock-Status>.

Modification d’un pilote miniport d’affichage existant pour prendre en charge les affichages Miracast

Lorsque la fonction DxgkDdiStartDevice est appelée, le pilote miniport d’affichage doit ajouter une nouvelle cible Miracast et doit marquer la valeur de reconnaissance de la détection de plug-in chaud (HPD) de la cible comme HpdAwarenessInterruptible afin que le système d’exploitation n’interroge pas cette cible. En outre, lorsque la fonction DxgkDdiQueryChildRelations est appelée, le pilote doit signaler D3DKMDT_VOT_MIRACAST comme type de connexion.

Le pilote ne doit pas signaler plusieurs cibles Miracast sur un périphérique graphique WDDM complet. Si un pilote signale plusieurs cibles Miracast, le système d’exploitation échoue au démarrage de l’adaptateur. Le pilote ne doit pas non plus signaler de moniteur sur cette cible si la session connectée Miracast n’est pas démarrée.

Le pilote doit également signaler une structure de DXGK_MIRACAST_DISPLAY_INTERFACE correcte, avec des pointeurs vers des fonctions qui se trouvent dans l’espace d’adressage en mode noyau, lorsque le sous-système du noyau graphique DirectX appelle la fonction DxgkDdiQueryInterface .

Lorsqu’une session Miracast démarre et qu’un moniteur est connecté au récepteur Miracast, le pilote miniport d’affichage doit définir le DXGK_CHILD_STATUS. Tapez membre à la valeur de constante StatusMiracast et doit également définir DXGK_CHILD_STATUS. Miracast. Connecté à TRUE pour signaler un HPD d’arrivée de moniteur au système d’exploitation. Le pilote doit définir le DXGK_CHILD_STATUS. Miracast. Membre MiracastMonitorType au type de moniteur approprié connecté au récepteur. Si le récepteur fait partie du moniteur, ce membre doit être défini sur D3DKMDT_VOT_MIRACAST.

Si le pilote connaît l’EDID du moniteur, il doit signaler cet EDID lorsque le système d’exploitation appelle la fonction DxgkDdiQueryDeviceDescriptor .

En fonction des fonctionnalités matérielles, de la liste du mode récepteur Miracast et de la bande passante réseau, le pilote doit signaler le mode source, le mode cible, le mode de rotation et le mode de mise à l’échelle appropriés. Pour le mode cible, le pilote doit signaler la valeur de membre VSyncFreqDivider correcte dans D3DKMDT_VIDEO_SIGNAL_INFO. Le système d’exploitation met en correspondance le mode cible par rapport au mode moniteur et supprime tout mode que le moniteur ne prend pas en charge.