Prise en charge de la connexion à chaud

Les capacités d'affichage (telles que les modes d'affichage et les types HDR pris en charge) peuvent changer de manière dynamique sur les appareils dotés d'écrans connectés en externe (avec HDMI ou DisplayPort), tels que les décodeurs Android TV (STB) et over-the-top (OTT). dispositifs. Ce changement peut se produire à la suite d'un signal HDMI hotplug, par exemple lorsque l'utilisateur passe d'un écran à un autre ou démarre l'appareil sans écran connecté. Android 12 et versions ultérieures incluent des modifications dans le cadre pour gérer les capacités de branchement à chaud et d'affichage dynamique.

Cette page décrit la gestion des hotplugs d'affichage et les modifications apportées aux capacités d'affichage dans l'implémentation de Composer HAL. De plus, il explique comment gérer le framebuffer associé et éviter les conditions de concurrence dans ces situations.

Mettre à jour les capacités d'affichage

Cette section décrit comment le framework Android gère les modifications des capacités d'affichage initiées par Composer HAL.

Avant qu'Android puisse gérer correctement les modifications des capacités d'affichage, l'OEM doit implémenter Composer HAL de telle sorte qu'il utilise onHotplug(display, connection=CONNECTED) pour informer le framework de toute modification des capacités d'affichage. Une fois cela implémenté, Android gère les modifications apportées aux capacités d'affichage comme suit :

  1. Lors de la détection d'un changement dans les capacités d'affichage, le framework reçoit une notification onHotplug(display, connection=CONNECTED) .
  2. À la réception de la notification, le framework supprime son état d'affichage et le recrée avec les nouvelles fonctionnalités de HAL à l'aide des méthodes getActiveConfig , getDisplayConfigs , getDisplayAttribute , getColorModes , getHdrCapabilities et getDisplayCapabilities .
  3. Une fois que le framework a recréé un nouvel état d'affichage, il envoie le rappel onDisplayChanged aux applications qui écoutent de tels événements.

Le framework réaffecte les framebuffers lors des événements onHotplug(display, connection=CONNECTED) suivants. Voir Gestion du framebuffer client pour plus d'informations sur la façon de gérer correctement la mémoire du framebuffer afin d'éviter les échecs lors de l'allocation de nouveaux framebuffers.

Gérer les scénarios de connexion courants

Cette section explique comment gérer correctement divers scénarios de connexion dans vos implémentations lorsque l'écran principal est connecté et déconnecté.

Ayant été conçu pour les appareils mobiles, le framework Android ne prend pas en charge un écran principal déconnecté. Au lieu de cela, le HAL doit remplacer l'affichage principal par un affichage fictif dans ses interactions avec le framework dans le cas où un affichage principal est physiquement déconnecté.

Les scénarios suivants peuvent se produire dans les décodeurs et les dongles TV dotés d'écrans connectés en externe qui peuvent être déconnectés. Pour implémenter la prise en charge de ces scénarios, utilisez les informations du tableau ci-dessous :

Scénario Manutention
Aucun écran connecté au démarrage
  • Envoyez un signal onHotplug(display, connection=CONNECTED) du Composer HAL au framework.
  • Remplacez l’état d’affichage physique à l’intérieur du Composer HAL par un état d’affichage fictif.
L'écran principal est physiquement connecté
L'écran principal est physiquement déconnecté
  • Envoyez un autre événement onHotplug(display, connection=CONNECTED) du Composer HAL au framework.
  • Remplacez l’état d’affichage physique à l’intérieur du Composer HAL par un état d’affichage fictif. L'affichage de l'espace réservé doit avoir un seul mode d'affichage, afin que le framework envoie le rappel onDisplayChanged aux applications (car l'ensemble des modes pris en charge a changé). Ce mode d'affichage unique doit correspondre au dernier mode actif de l'affichage physique avant la déconnexion, afin que les applications ne reçoivent pas d'événements de modification de configuration .

Utilisez des ID de configuration séquentiels pour éviter les conditions de concurrence

Des conditions de concurrence peuvent survenir si Composer HAL met à jour les configurations d'affichage prises en charge simultanément avec le framework appelant setActiveConfig ou setActiveConfigWithConstraints . La solution consiste à implémenter Composer HAL pour utiliser des ID séquentiels et éviter ce problème.

Cette section décrit comment les conditions de concurrence critique peuvent se produire, suivie de détails sur la façon d'implémenter Composer HAL afin qu'il utilise des ID séquentiels pour éviter de telles conditions.

Considérez la séquence d'événements suivante, lorsque de nouveaux ID séquentiels ne sont PAS attribués aux nouvelles configurations d'affichage, provoquant une condition de concurrence critique :

  1. Les ID de configuration d'affichage pris en charge sont :

    • identifiant=1 , 1080x1920 60 Hz
    • identifiant=2 , 1080x1920 50 Hz
  2. Le framework appelle setActiveConfig(display, config=1) .

  3. Parallèlement, Composer HAL traite un changement de configuration d'affichage et met à jour son état interne avec un nouvel ensemble de configurations d'affichage, illustré comme suit :

    • identifiant=1 , 2160x3840 60 Hz
    • identifiant=2 , 2160x3840 50 Hz
    • identifiant=3 , 1080x1920 60 Hz
    • identifiant=4 , 1080x1920 50 Hz
  4. Composer HAL envoie un événement onHotplug au framework, pour notifier que l'ensemble des modes pris en charge a changé.

  5. Le Composer HAL reçoit setActiveConfig(display, config=1) (à partir de l’étape 2).

  6. Le HAL interprète que le framework a demandé un changement de configuration à 2160x3840 60 Hz , alors qu'en réalité 1080x1920 60 Hz était souhaité.

Le processus utilisant des attributions d'ID non séquentielles se termine ici par une mauvaise interprétation du changement de configuration souhaité.

Configurer Composer HAL pour utiliser des ID séquentiels

Pour éviter de telles conditions de concurrence, l'OEM doit implémenter le Composer HAL comme suit :

  • Lorsque Composer HAL met à jour les configurations d’affichage prises en charge, il attribue de nouveaux ID séquentiels aux nouvelles configurations d’affichage.
  • Lorsque le framework appelle setActiveConfig ou setActiveConfigWithConstraints avec un ID de configuration non valide, Composer HAL ignore l'appel.

Ces étapes servent à éviter les conditions de concurrence, comme indiqué dans la discussion suivante.

Considérez la séquence d'événements suivante, lorsque de nouveaux ID séquentiels sont attribués aux nouvelles configurations d'affichage :

  1. Les ID de configuration d'affichage pris en charge sont :

    • identifiant=1 , 1080x1920 60 Hz
    • identifiant=2 , 1080x1920 50 Hz
  2. Le framework appelle setActiveConfig(display, config=1) .

  3. Lorsqu'un changement de configuration d'affichage est traité, l'ensemble suivant d'ID de configuration est attribué à partir du prochain entier inutilisé, affiché comme suit :

    • identifiant=3 , 2160x3840 60 Hz

    • identifiant=4 , 2160x3840 50 Hz

    • identifiant=5 , 1080x1920 60 Hz

    • identifiant=6 , 1080x1920 50 Hz

  4. Le Composer HAL envoie un événement onHotplug au framework, pour notifier que l'ensemble des modes pris en charge a changé.

  5. Le Composer HAL reçoit setActiveConfig(display, config=1) (à partir de l’étape 2).

  6. Le Composer HAL ignore l’appel car l’ID n’est plus valide.

  7. Le framework reçoit et traite l'événement onHotplug de l'étape 4. Il appelle le Composer HAL à l'aide des fonctions getDisplayConfigs et getDisplayAttribute . Avec ces fonctions, le framework identifie le nouvel ID (5) pour la résolution et le taux de rafraîchissement souhaités de 1080x1920 et 60 Hz.

  8. Le framework envoie un autre événement setActiveConfig avec un ID mis à jour de 5.

  9. Le Composer HAL reçoit setActiveConfig(display, config=5) à partir de l'étape 5.

  10. Le HAL interprète correctement que le framework a demandé un changement de configuration en 1080x1920 60 Hz.

Comme le montre l'exemple ci-dessus, le processus utilisant des attributions d'ID séquentielles garantit que la condition de concurrence critique est évitée et que le changement de configuration d'affichage correct est mis à jour.