Ab Android 13 ist die Hardware Composer (HWC) HAL
in AIDLdefiniert. 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 die HWC beschrieben und es wird erläutert, wie die AIDL-HAL implementiert und getestet wird.
Da AIDL Vorteile bietet, können Anbieter ab Android 13 die AIDL Composer-HAL 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:
Entfernung der Fast Message Queue (FMQ) zugunsten von parcelable-Befehlen.
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 Befehlslast durch das System bereitgestellt.
Die
executeCommands5 Methode ist inIComposerClient.aidldefiniert:CommandResultPayload[] executeCommands(in DisplayCommand[] commands);Jeder Befehl ist ein stark typisierter parcelable-Typ, der in
DisplayCommand.aidldefiniert ist. Befehlsantworten sind stark typisierte parcelables, die inCommandResultPayload.aidldefiniert sind.Entfernung von
IComposerClient.getClientTargetSupport, da diese Methode von keinen aktiven Clients verwendet wird.Darstellung von Farben als Gleitkommazahlen anstelle von Byte, um sie an den oberen Grafikstack in Android anzugleichen, wie in
ASurfaceTransaction_setColordefiniert.Hinzufügen neuer Felder zur Steuerung von HDR-Inhalten.
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
brightnessFeld inLayerCommandkann SurfaceFlinger eine Helligkeit pro Layer angeben. Dadurch kann die HWC den Inhalt des Layers im linearen Lichtraum anstelle des Gamma-Raums dimmen.Mit dem
brightnessFeld inClientTargetPropertyWithBrightnesskann die HWC den Helligkeitsraum für die Client-Komposition angeben undRenderEngineanweisen, ob SDR-Layer in der Client-Komposition gedimmt werden sollen.Das
dimmingStageFeld lässt die HWC konfigurieren, wannRenderEngineInhalte dimmt. Dies berücksichtigt anbieterspezifischeColorModes, bei denen das Dimmen im Gamma-Raum bevorzugt wird, um anbieterspezifische Kontrasterweiterungen in ihren Farbpipelines zu ermöglichen.Hinzufügen eines Kompositionstyps,
DISPLAY_DECORATION, inComposition.aidlfür Bildschirmdekorationen.Einige Geräte haben spezielle Hardware, um das Zeichnen der Alpha-Maske zu optimieren, die abgerundete Ecken und Ausschnitte auf Displays glättet. Geräte mit dieser Hardware müssen
IComposerClient.getDisplayDecorationSupportimplementieren und eineDisplayDecorationSupportStruktur zurückgeben, wie inDisplayDecorationSupport.aidldefiniert. Diese Struktur beschreibt diePixelFormat- undAlphaInterpretation-Enums, die vom Gerät benötigt werden. Nach dieser Implementierung markiert die System-UI den Alpha-Masken-Layer alsDISPLAY_DECORATION, einen Komposition styp, der die spezielle Hardware nutzt.Hinzufügen eines
expectedPresentTimeFelds zuDisplayCommand.aidl.Mit dem Feld
expectedPresentTimekann SurfaceFlinger die erwartete Präsentationszeit festlegen, zu der der aktuelle Inhalt auf dem Bildschirm angezeigt werden muss. Mit dieser Funktion sendet SurfaceFlinger einen Präsentationsbefehl vorzeitig an die Implementierung, wodurch mehr Kompositionsarbeit in die Pipeline aufgenommen werden kann.Hinzufügen neuer APIs zur Steuerung der Boot-Display-Konfiguration.
Mit
BOOT_DISPLAY_CONFIGkönnen Anbieter angeben, dass die Boot-Display Konfiguration unterstützt wird. DiesetBootDisplayConfig,clearBootDisplayConfigundgetPreferredBootDisplayConfigMethoden verwendenBOOT_DISPLAY_CONFIGwie folgt:Mit
setBootDisplayConfiginformiert das Framework Anbieter über die Display-Konfiguration zur 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 booten kann, muss der Anbieter eine Konfiguration finden, die der Auflösung und Aktualisierungsrate dieser Konfiguration entspricht. Wenn keine solche Konfiguration vorhanden ist, muss der Anbieter seine bevorzugte Display-Konfiguration verwenden.Mit
clearBootDisplayConfigweist das Framework die Anbieter an , die Boot-Display-Konfiguration zu löschen und beim nächsten Neustart in ihrer bevorzugten Display-Konfiguration zu booten.Mit
getPreferredBootDisplayConfigfragt das Framework den bevorzugten Bootmodus des Anbieters ab.
Wenn die Boot-Display-Konfiguration nicht unterstützt wird, geben diese Methoden den Wert
UNSUPPORTEDzurück.Hinzufügen neuer APIs zur Steuerung des Timers für die Inaktivität des Displays:
Mit
DISPLAY_IDLE_TIMERkönnen Anbieter angeben, dass ein Inaktivitätstimer für dieses Display vom Anbieter implementiert wird. Im Leerlauf ändert diese Funktion die Aktualisierungsrate auf eine niedrigere Einstellung, um Energie 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.onVsyncIdleCallback wird der Plattform mitgeteilt, dass sich das Display im Leerlauf befindet und sich dievsyncKadenz geändert hat. Die Plattform reagiert auf diesen Callback, indem sie ihrvsync-Modell zurücksetzt. Sie erzwingt einevsync-Neusynchronisierung für den nächsten Frame und lernt die neuevsync-Kadenz.
Implementierung
Anbieter müssen die AIDL-HAL für Android 13 nicht implementieren. Anbieter sollten jedoch die AIDL Composer-HAL anstelle der HIDL-Version implementieren, um die Funktionen und APIs der AIDL Composer-HAL zu nutzen.
Android-Emulatoren enthalten eine Referenzimplementierung für die AIDL-HWC-HAL.
Test
Führen Sie VtsHalGraphicsComposer3_TargetTest aus, um Ihre Implementierung zu testen.