À partir d'Android 13, le HAL Hardware Composer (HWC) est défini dans AIDL. Les versions HIDL allant de android.hardware.graphics.composer@2.1
à android.hardware.graphics.composer@2.4
sont obsolètes.
Cette page décrit les différences entre les HAL AIDL et HIDL pour le HWC, et explique comment implémenter et tester le HAL AIDL.
Étant donné qu'AIDL offre des avantages, les fournisseurs peuvent implémenter le HAL du compositeur AIDL à partir d'Android 13 au lieu de la version HIDL. Pour en savoir plus, consultez la section Implémentation.
Différences entre les HAL AIDL et HIDL
Le nouveau HAL de compositeur AIDL, nommé android.hardware.graphics.composer3
, est défini dans IComposer.aidl
. L'API est semblable à la HAL HIDL android.hardware.graphics.composer@2.4
, mais inclut les modifications suivantes :
Suppression de la Fast Message Queue (FMQ) au profit des commandes Parcelable.
Le HAL AIDL définit l'interface de commande basée sur des types de données Parcelable fortement typés au lieu des commandes sérialisées sur FMQ dans HIDL. Cela fournit une interface stable pour les commandes et une définition plus lisible de la façon dont le système interprète la charge utile de la commande.
La méthode
executeCommands
5 est définie dansIComposerClient.aidl
:CommandResultPayload[] executeCommands(in DisplayCommand[] commands);
Chaque commande est un type Parcelable fortement typé défini dans
DisplayCommand.aidl
. Les réponses aux commandes sont des objets Parcelable fortement typés définis dansCommandResultPayload.aidl
.Suppression de
IComposerClient.getClientTargetSupport
, car aucun client actif n'utilise cette méthode.Représentation des couleurs sous forme de valeurs flottantes au lieu d'octets pour s'aligner sur la pile graphique supérieure d'Android, telle que définie par
ASurfaceTransaction_setColor
.Ajout de nouveaux champs pour contrôler le contenu HDR.
Dans l'AIDL HAL, les piles de calques SDR/HDR mixtes permettent d'atténuer facilement les calques SDR lorsqu'un calque HDR est affiché à l'écran en même temps.
Le champ
brightness
deLayerCommand
permet à SurfaceFlinger de spécifier une luminosité par calque. Cela permet au HWC d'assombrir le contenu du calque dans l'espace de luminosité linéaire au lieu de l'espace gamma.Le champ
brightness
deClientTargetPropertyWithBrightness
permet au HWC de spécifier l'espace de luminosité pour la composition du client et indique àRenderEngine
s'il faut atténuer les calques SDR dans la composition du client.Le champ
dimmingStage
permet au HWC de configurer le moment oùRenderEngine
atténue le contenu. Cela permet d'adapter lesColorModes
définis par le fournisseur qui préfèrent peut-être atténuer la luminosité dans l'espace gamma pour activer les améliorations de contraste définies par le fournisseur dans leurs pipelines de couleurs.Ajout d'un type de composition,
DISPLAY_DECORATION
, dansComposition.aidl
pour les décorations d'écran.Certains appareils disposent d'un matériel dédié pour optimiser le dessin du masque alpha qui adoucit les angles arrondis et les encoches sur les écrans. Les appareils dotés de ce matériel doivent implémenter
IComposerClient.getDisplayDecorationSupport
et renvoyer une structureDisplayDecorationSupport
telle que définie dansDisplayDecorationSupport.aidl
. Cette structure décrit les énumérationsPixelFormat
etAlphaInterpretation
requises par l'appareil. Après cette implémentation, l'UI système marque le calque de masque alpha commeDISPLAY_DECORATION
, un type de composition qui tire parti du matériel dédié.Ajout d'un champ
expectedPresentTime
àDisplayCommand.aidl
.Le champ
expectedPresentTime
permet à SurfaceFlinger de définir l'heure de présentation attendue pour l'affichage du contenu actuel à l'écran. Avec cette fonctionnalité, SurfaceFlinger envoie une commande de présentation à l'implémentation à l'avance, ce qui lui permet de mettre en pipeline une plus grande partie du travail de composition.Ajout de nouvelles API pour contrôler la configuration de l'affichage au démarrage.
À l'aide de
BOOT_DISPLAY_CONFIG
, les fournisseurs peuvent spécifier que la configuration de l'écran de démarrage est prise en charge. Les méthodessetBootDisplayConfig
,clearBootDisplayConfig
etgetPreferredBootDisplayConfig
utilisentBOOT_DISPLAY_CONFIG
comme suit :À l'aide de
setBootDisplayConfig
, le framework informe les fournisseurs de la configuration d'affichage du temps de démarrage. Les fournisseurs doivent mettre en cache la configuration de l'écran de démarrage et démarrer dans cette configuration au prochain redémarrage. Si l'appareil ne parvient pas à démarrer avec cette configuration, le fournisseur doit trouver une configuration qui correspond à la résolution et à la fréquence d'actualisation de cette configuration. Si aucune configuration de ce type n'existe, le fournisseur doit utiliser la configuration d'affichage de son choix.À l'aide de
clearBootDisplayConfig
, le framework informe les fournisseurs qu'ils doivent effacer la configuration de l'écran de démarrage et démarrer avec leur configuration d'écran préférée lors du prochain redémarrage.À l'aide de
getPreferredBootDisplayConfig
, le framework interroge le mode de démarrage préféré du fournisseur.
Lorsque la configuration de l'écran de démarrage n'est pas prise en charge, ces méthodes renvoient une valeur de
UNSUPPORTED
.Ajout de nouvelles API pour contrôler le minuteur d'inactivité de l'écran :
À l'aide de
DISPLAY_IDLE_TIMER
, les fournisseurs peuvent spécifier qu'un minuteur d'inactivité est implémenté par le fournisseur pour cet écran. Lorsqu'il est inactif, cette fonctionnalité réduit la fréquence d'actualisation pour économiser de l'énergie. La plate-forme utilisesetIdleTimerEnabled
pour contrôler le délai avant expiration du minuteur et, dans certains cas, pour le désactiver afin d'éviter les changements de fréquence d'actualisation indésirables en cas d'inactivité.L'utilisation du rappel
IComposerCallback.onVsyncIdle
indique à la plate-forme que l'écran est inactif et que la cadencevsync
a changé. La plate-forme répond à ce rappel en réinitialisant son modèlevsync
. Il force une resynchronisationvsync
sur la prochaine image et apprend la nouvelle cadencevsync
.
Implémentation
Les fournisseurs ne sont pas tenus d'implémenter le HAL AIDL pour Android 13. Toutefois, les fournisseurs sont encouragés à implémenter le HAL de compositeur AIDL au lieu de la version HIDL pour utiliser les fonctionnalités et les API du HAL de compositeur AIDL.
Les émulateurs Android incluent une implémentation de référence pour le HAL HWC AIDL.
Tests
Pour tester votre implémentation, exécutez VtsHalGraphicsComposer3_TargetTest
.