Ab Android 13 wird die Hardware Composer (HWC) HAL in AIDL definiert. Die HIDL-Versionen von android.hardware.graphics.composer@2.1
bis android.hardware.graphics.composer@2.4
sind veraltet.
Auf dieser Seite werden die Unterschiede zwischen den AIDL- und HIDL-HALs für den HWC beschrieben. Außerdem wird erläutert, wie die AIDL-HAL implementiert und getestet wird.
Da AIDL Vorteile bietet, können Anbieter die AIDL-Composer-HAL ab Android 13 anstelle der HIDL-Version 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. Die API ähnelt der HIDL-HAL android.hardware.graphics.composer@2.4
, enthält aber die folgenden Änderungen:
Die Fast Message Queue (FMQ) wurde zugunsten von parcelable-Befehlen entfernt.
Die AIDL-HAL definiert die Befehlsschnittstelle basierend auf stark typisierten Parcelable-Typen anstelle der serialisierten Befehle über FMQ in HIDL. Dadurch wird eine stabile Schnittstelle für Befehle und eine besser lesbare Definition der Interpretation der Befehlspayload durch das System bereitgestellt.
Die Methode
executeCommands
5 ist inIComposerClient.aidl
definiert:CommandResultPayload[] executeCommands(in DisplayCommand[] commands);
Jeder Befehl ist 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 keine aktiven Clients diese Methode verwenden.Farben werden als Gleitkommazahlen anstelle von Byte dargestellt, um sie an den oberen Grafik-Stack in Android anzupassen, wie in
ASurfaceTransaction_setColor
definiert.Es wurden neue Felder zum Steuern von HDR-Inhalten hinzugefügt.
In der AIDL-HAL wird das nahtlose Dimmen von SDR-Layern unterstützt, wenn gleichzeitig ein HDR-Layer auf dem Bildschirm angezeigt wird.
Im Feld
brightness
inLayerCommand
kann SurfaceFlinger eine Helligkeit pro Ebene angeben. Dadurch kann der HWC den Inhalt der Ebene im linearen Lichtraum anstelle des Gammaspace dimmen.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 dimmt. So wirdColorModes
des Anbieters berücksichtigt, das möglicherweise lieber im Gammabereich gedimmt wird, um anbieterdefinierte Kontrasterweiterungen in den Farb-Pipelines zu ermöglichen.Hinzufügen eines Kompositionstyps,
DISPLAY_DECORATION
, inComposition.aidl
für Bildschirmdekorationen.Einige Geräte haben eine spezielle Hardware, um das Zeichnen der Alphamaske zu optimieren, die abgerundete Ecken und Ausschnitte auf Displays glättet. Auf Geräten mit dieser Hardware muss
IComposerClient.getDisplayDecorationSupport
implementiert und eineDisplayDecorationSupport
-Struktur wie inDisplayDecorationSupport.aidl
definiert zurückgegeben werden. Diese Struktur beschreibt die EnumsPixelFormat
undAlphaInterpretation
, die für das Gerät erforderlich sind. Nach dieser Implementierung kennzeichnet die System-UI die Alphamaskenebene alsDISPLAY_DECORATION
, einen 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 vorzeitig an die Implementierung, wodurch mehr Kompositionsarbeit in die Pipeline aufgenommen 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 Konfiguration des Bootdisplays unterstützt wird. Die MethodensetBootDisplayConfig
,clearBootDisplayConfig
undgetPreferredBootDisplayConfig
verwendenBOOT_DISPLAY_CONFIG
so:Mit
setBootDisplayConfig
informiert das Framework Anbieter über die Konfiguration der Anzeige während der Bootzeit. 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, muss der Anbieter seine bevorzugte Displaykonfiguration verwenden.Mit
clearBootDisplayConfig
werden die Anbieter vom Framework aufgefordert, die Boot-Displaykonfiguration zu löschen und beim nächsten Neustart mit ihrer bevorzugten Displaykonfiguration 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.Neue APIs zum Steuern des Inaktivitätstimers für das Display:
Mit
DISPLAY_IDLE_TIMER
können Anbieter angeben, dass für dieses Display 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.Mit dem
IComposerCallback.onVsyncIdle
-Callback wird der Plattform mitgeteilt, dass das Display im Leerlauf ist und sich dievsync
-Kadenz 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. Wir empfehlen Anbietern jedoch, die AIDL-Composer-HAL anstelle der HIDL-Version zu implementieren, um die Funktionen und APIs der AIDL-Composer-HAL zu nutzen.
Android-Emulatoren enthalten eine Referenzimplementierung für das AIDL-HWC-HAL.
Testen
Führen Sie VtsHalGraphicsComposer3_TargetTest
aus, um Ihre Implementierung zu testen.