Od Androida 13 interfejs HAL kompozytora sprzętowego (HWC) jest zdefiniowany w AIDL. Wersje HIDL od android.hardware.graphics.composer@2.1 do android.hardware.graphics.composer@2.4 są wycofane.
Na tej stronie opisujemy różnice między interfejsami HAL AIDL i HIDL dla HWC oraz sposób implementacji i testowania interfejsu HAL AIDL.
Ze względu na zalety AIDL dostawcy mogą implementować AIDL HAL kompozytora od Androida 13 zamiast wersji HIDL. Więcej informacji znajdziesz w sekcji Implementacja.
Różnice między interfejsami HAL AIDL i HIDL
Nowy interfejs HAL kompozytora AIDL o nazwie android.hardware.graphics.composer3 jest zdefiniowany w pliku IComposer.aidl. Interfejs API jest podobny do HIDL HAL
android.hardware.graphics.composer@2.4, ale zawiera następujące zmiany:
Usunięcie szybkiej kolejki wiadomości (FMQ) na rzecz poleceń z możliwością przekazywania.
AIDL HAL definiuje interfejs poleceń na podstawie silnie typizowanych typów możliwych do przekazania, a nie serializowanych poleceń w FMQ w HIDL. Zapewnia to stabilny interfejs poleceń i bardziej czytelną definicję sposobu, w jaki system interpretuje ładunek polecenia.
Metoda
executeCommands5 jest zdefiniowana wIComposerClient.aidl:CommandResultPayload[] executeCommands(in DisplayCommand[] commands);Każde polecenie jest silnie typizowanym typem możliwym do przekazania w pakiecie, zdefiniowanym w pliku
DisplayCommand.aidl. Odpowiedzi na polecenia są silnie typizowanymi obiektami Parcelable zdefiniowanymi wCommandResultPayload.aidl.Usunięcie
IComposerClient.getClientTargetSupport, ponieważ żaden aktywny klient nie używa tej metody.Reprezentacja kolorów jako liczb zmiennoprzecinkowych zamiast bajtów, aby dopasować je do górnej warstwy graficznej w Androidzie, zgodnie z definicją w
ASurfaceTransaction_setColor.Dodanie nowych pól do sterowania treściami HDR.
W AIDL HAL mieszane stosy warstw SDR/HDR obsługują płynne przyciemnianie warstw SDR, gdy na ekranie znajduje się jednocześnie warstwa HDR.
Pole
brightnesswLayerCommandumożliwia SurfaceFlingerowi określenie jasności poszczególnych warstw. Umożliwia to HWC przyciemnianie zawartości warstwy w przestrzeni światła liniowego zamiast w przestrzeni gamma.Pole
brightnesswClientTargetPropertyWithBrightnessumożliwia HWC określenie przestrzeni jasności dla kompozycji klienta i informujeRenderEngine, czy przyciemniać warstwy SDR w kompozycji klienta.Pole
dimmingStageumożliwia HWC skonfigurowanie, kiedyRenderEngineprzyciemnia treści. Umożliwia to dostosowanie do zdefiniowanych przez dostawcęColorModesustawień, które mogą preferować przyciemnianie w przestrzeni gamma, aby włączyć zdefiniowane przez dostawcę ulepszenia kontrastu w swoich potokach kolorów.Dodanie typu kompozycji
DISPLAY_DECORATIONwComposition.aidldo dekoracji ekranu.Niektóre urządzenia mają specjalne komponenty, które optymalizują rysowanie maski alfa, wygładzając zaokrąglone rogi i wycięcia na wyświetlaczach. Urządzenia z takim sprzętem muszą implementować
IComposerClient.getDisplayDecorationSupporti zwracać strukturęDisplayDecorationSupportzdefiniowaną wDisplayDecorationSupport.aidl. Ta struktura opisuje wyliczeniaPixelFormatiAlphaInterpretationwymagane przez urządzenie. Po tej implementacji interfejs systemu oznaczy warstwę maski alfa jakoDISPLAY_DECORATION, czyli typ kompozycji, który wykorzystuje dedykowany sprzęt.Dodanie pola
expectedPresentTimedoDisplayCommand.aidl.Pole
expectedPresentTimeumożliwia usłudze SurfaceFlinger ustawienie oczekiwanego czasu wyświetlania, w którym bieżąca treść musi być wyświetlana na ekranie. Dzięki tej funkcji SurfaceFlinger wysyła polecenie prezentacji do implementacji z wyprzedzeniem, co pozwala na bardziej efektywne przetwarzanie kompozycji.Dodanie nowych interfejsów API do kontrolowania konfiguracji wyświetlania podczas uruchamiania.
Za pomocą parametru
BOOT_DISPLAY_CONFIGdostawcy mogą określić, że konfiguracja wyświetlacza rozruchowego jest obsługiwana. MetodysetBootDisplayConfig,clearBootDisplayConfigigetPreferredBootDisplayConfigużywają parametruBOOT_DISPLAY_CONFIGw ten sposób:Za pomocą
setBootDisplayConfigplatforma informuje dostawców o konfiguracji wyświetlania czasu uruchomienia. Dostawcy muszą zapisywać w pamięci podręcznej konfigurację wyświetlacza rozruchowego i przy następnym ponownym uruchomieniu używać tej konfiguracji. Jeśli urządzenie nie może się uruchomić w tej konfiguracji, dostawca musi znaleźć konfigurację, która odpowiada rozdzielczości i częstotliwości odświeżania tej konfiguracji. Jeśli taka konfiguracja nie istnieje, dostawca musi użyć preferowanej konfiguracji wyświetlania.Za pomocą
clearBootDisplayConfigplatforma informuje dostawców, aby wyczyścili konfigurację wyświetlania podczas uruchamiania i przy następnym ponownym uruchomieniu włączyli preferowaną konfigurację wyświetlania.Korzystając z
getPreferredBootDisplayConfig, platforma wysyła zapytanie o preferowany tryb rozruchu dostawcy.
Jeśli konfiguracja wyświetlacza rozruchowego nie jest obsługiwana, te metody zwracają wartość
UNSUPPORTED.Dodanie nowych interfejsów API do sterowania licznikiem czasu bezczynności wyświetlacza:
Za pomocą wartości
DISPLAY_IDLE_TIMERdostawcy mogą określić, że w przypadku tego wyświetlacza dostawca wdrożył licznik czasu bezczynności. Gdy urządzenie jest nieaktywne, ta funkcja zmniejsza częstotliwość odświeżania, aby oszczędzać energię. Platforma używasetIdleTimerEnableddo kontrolowania limitu czasu timera, a w niektórych przypadkach do jego wyłączania, aby zapobiec niepożądanym zmianom częstotliwości odświeżania w trybie bezczynności.Użycie wywołania zwrotnego
IComposerCallback.onVsyncIdleinformuje platformę, że wyświetlacz jest nieaktywny, a częstotliwośćvsynculegła zmianie. Platforma odpowiada na to wywołanie zwrotne, resetując swójvsyncmodel. Wymuszavsyncponowną synchronizację w następnej klatce i uczy się nowejvsynckadencji.
Implementacja
Dostawcy nie muszą implementować interfejsu AIDL HAL w Androidzie 13. Zachęcamy jednak dostawców do wdrażania kompozytora AIDL HAL zamiast wersji HIDL, aby korzystać z funkcji i interfejsów API kompozytora AIDL HAL.
Emulatory Androida zawierają implementację referencyjną interfejsu AIDL HWC HAL.
Testowanie
Aby przetestować implementację, uruchom VtsHalGraphicsComposer3_TargetTest.