Ab Android 13 wird die Hardware Composer (HWC) HAL in AIDL definiert und die HIDL-Versionen von android.hardware.graphics.composer@2.1
bis android.hardware.graphics.composer@2.4
sind eingestellt.
Auf dieser Seite werden die Unterschiede zwischen dem AIDL- und dem HIDL-HAL für den HWC sowie die Implementierung und das Testen des AIDL-HAL beschrieben.
Aufgrund der Vorteile von AIDL wird Anbietern empfohlen, die AIDL-Composer-HAL ab Android 13 anstelle der HIDL-Version zu implementieren. Weitere Informationen finden Sie im Abschnitt Implementierung.
Unterschiede zwischen AIDL- und HIDL-HALs
Die neue AIDL-Composer-HAL mit dem Namen android.hardware.graphics.composer3
ist in IComposer.aidl
definiert.
Es wird eine API ähnlich dem HIDL-HAL android.hardware.graphics.composer@2.4
mit den folgenden Änderungen bereitgestellt:
Entfernung der Fast Message Queue (FMQ) zugunsten von parcelable-Befehlen.
Die AIDL-HAL definiert die Befehlsschnittstelle basierend auf stark typisierten Parcelable-Typen im Gegensatz zu den serialisierten Befehlen über FMQ in HIDL. Dadurch wird eine stabile Schnittstelle für Befehle und eine besser lesbare Definition der Interpretation der Befehlspayload bereitgestellt.
Die Methode
executeCommands
wird inIComposerClient.aidl
so definiert:CommandResultPayload[] executeCommands(in DisplayCommand[] commands);
Dabei ist jeder Befehl ein stark typisierter Parcelable-Typ, der in
DisplayCommand.aidl
definiert ist. Befehlsantworten sind stark typisierte Parcelables, die inCommandResultPayload.aidl
definiert sind.Entfernung von
IComposerClient.getClientTargetSupport
, da es keine aktiven Clients für diese Methode gibt.Darstellung von Farben als Gleitkommazahlen anstelle von Byte, um besser mit dem oberen Grafik-Stack in Android übereinzustimmen, wie in
ASurfaceTransaction_setColor
definiert.Es wurden neue Felder zum Steuern von HDR-Inhalten hinzugefügt.
In der AIDL-HAL unterstützen gemischte SDR/HDR-Layer-Stacks das nahtlose Dimmen von SDR-Layern, wenn gleichzeitig ein HDR-Layer auf dem Bildschirm angezeigt wird.
Mit dem Feld
brightness
inLayerCommand
kann SurfaceFlinger eine Helligkeit pro Ebene angeben, sodass der HWC den Inhalt der Ebene im linearen Lichtraum und nicht im Gammarum dimmt.Mit dem Feld
brightness
inClientTargetPropertyWithBrightness
kann der HWC den Helligkeitsbereich für die Client-Komposition angeben undRenderEngine
anweisen, ob SDR-Ebenen in der Client-Komposition gedimmt werden sollen.Mit dem Feld
dimmingStage
kann der HWC konfigurieren, wannRenderEngine
Inhalte dimmen soll. So können anbieterspezifischeColorModes
, die möglicherweise lieber im Gammabereich gedimmt werden, anbieterspezifische Kontrastverbesserungen in ihren Farb-Pipelines zulassen.Hinzufügen eines neuen Kompositionstyps
DISPLAY_DECORATION
inComposition.aidl
für Bildschirmdekorationen.Einige Geräte haben eine spezielle Hardware, um das Zeichnen der Alphamaskierung zu optimieren, die abgerundete Ecken und Ausschnitte auf Displays glättet. Geräte mit dieser Hardware müssen
IComposerClient.getDisplayDecorationSupport
implementieren, um eineDisplayDecorationSupport
-Struktur wie in der neuenDisplayDecorationSupport.aidl
definiert zurückzugeben. Diese Struktur beschreibt die vom Gerät benötigten EnumsPixelFormat
undAlphaInterpretation
. Nach dieser Implementierung kennzeichnet die System-UI die Alphamaskenebene alsDISPLAY_DECORATION
, einen neuen Kompositionstyp, der die dedizierte Hardware nutzt.Das Feld
expectedPresentTime
wurdeDisplayCommand.aidl
hinzugefügt.Über das Feld
expectedPresentTime
kann SurfaceFlinger die erwartete Präsentationszeit festlegen, zu der die aktuellen Inhalte auf dem Bildschirm angezeigt werden müssen. Mit dieser Funktion sendet SurfaceFlinger einen Present-Befehl vorab an die Implementierung, sodass mehr Kompositionsarbeit in einer Pipeline ausgeführt werden kann.Es wurden neue APIs hinzugefügt, mit denen die Konfiguration der Boot-Anzeige gesteuert werden kann.
Mit
BOOT_DISPLAY_CONFIG
können Anbieter angeben, dass die Boot-Displaykonfiguration unterstützt wird. Die MethodensetBootDisplayConfig
,clearBootDisplayConfig
undgetPreferredBootDisplayConfig
verwendenBOOT_DISPLAY_CONFIG
so:Mit
setBootDisplayConfig
informiert das Framework Anbieter über die Konfiguration der Bootzeitanzeige. Anbieter müssen die Boot-Display-Konfiguration im Cache speichern und beim nächsten Neustart in dieser Konfiguration booten. Wenn das Gerät in dieser Konfiguration nicht gestartet werden kann, muss der Anbieter eine Konfiguration finden, die der Auflösung und Bildwiederholrate dieser Konfiguration entspricht. Wenn keine solche Konfiguration vorhanden ist, sollte der Anbieter seine bevorzugte Displaykonfiguration verwenden.Mit
clearBootDisplayConfig
informiert das Framework die Anbieter, die Boot-Display-Konfiguration zu löschen und beim nächsten Neustart in ihrer bevorzugten Display-Konfiguration zu booten.Mit
getPreferredBootDisplayConfig
fragt das Framework den bevorzugten Bootmodus des Anbieters ab.
Wenn die Konfiguration des Startdisplays nicht unterstützt wird, geben diese Methoden den Wert
UNSUPPORTED
zurück.Es wurden neue APIs hinzugefügt, mit denen der Inaktivitätstimer für das Display gesteuert werden kann.
Mit
DISPLAY_IDLE_TIMER
können Anbieter angeben, dass für diese Anzeige ein Inaktivitätstimer implementiert wird. Im Leerlauf wird die Aktualisierungsrate auf einen niedrigeren Wert geändert, um Strom zu sparen. Die Plattform verwendetsetIdleTimerEnabled
, um das Zeitlimit des Timers zu steuern und ihn in einigen Fällen zu deaktivieren, um unerwünschte Änderungen der Aktualisierungsrate im Leerlauf zu verhindern.Durch die Verwendung des
IComposerCallback.onVsyncIdle
-Callbacks wird der Plattform mitgeteilt, dass das Display im Leerlauf ist und sich dievsync
-Cadence geändert hat. Die Plattform reagiert auf diesen Callback, indem sie ihrvsync
-Modell zurücksetzt. Dadurch wird im nächsten Frame einevsync
-Resynchronisierung erzwungen und die neuevsync
-Kadenz wird gelernt.
Implementierung
Anbieter müssen die AIDL-HAL für Android 13 nicht implementieren. Es wird jedoch empfohlen, das AIDL-Composer-HAL anstelle der HIDL-Version zu implementieren, um die neuen Funktionen und APIs zu nutzen.
Eine Referenzimplementierung für das AIDL-HWC-HAL ist in Android-Emulatoren implementiert.
Testen
Führen Sie VtsHalGraphicsComposer3_TargetTest
aus, um Ihre Implementierung zu testen.