Począwszy od Androida 13 interfejs HAL Hardware Composer (HWC) jest zdefiniowany w AIDL, a wersje HIDL od android.hardware.graphics.composer@2.1
do android.hardware.graphics.composer@2.4
zostały wycofane.
Na tej stronie opisano różnice między interfejsem AIDL i HIDL HAL w przypadku HWC oraz implementację i testowanie interfejsu AIDL HAL.
Ze względu na zalety oferowane przez AIDL dostawcy powinni implementować kompozytora HAL AIDL od wersji Android 13 zamiast wersji HIDL. Więcej informacji znajdziesz w sekcji Wdrażanie.
Różnice między HAL AIDL i HIDL
Nowy interfejs HAL do tworzenia kompozyturu AIDL o nazwie android.hardware.graphics.composer3
jest zdefiniowany w pliku IComposer.aidl
.
Udostępnia on interfejs API podobny do interfejsu HIDL HALandroid.hardware.graphics.composer@2.4
z tymi różnicami:
Usunięcie kolejki szybkich wiadomości (FMQ) na rzecz poleceń z możliwością dzielenia na części.
Interfejs AIDL HAL definiuje interfejs poleceń na podstawie silnie wpisywanych typów papierowych w przeciwieństwie do poleceń serializowanych nad FMQ w HIDL. Zapewnia to stabilny interfejs poleceń i bardziej czytelną definicję sposobu interpretacji ładunku poleceń.
Metoda
executeCommands
jest zdefiniowana wIComposerClient.aidl
jakoCommandResultPayload[] executeCommands(in DisplayCommand[] commands);
gdzie każda komenda jest silnie typowanym typem pakietowym zdefiniowanym w
DisplayCommand.aidl
. Odpowiedzi poleceń to polecenia Parcelable o silnym typie zdefiniowane w narzędziuCommandResultPayload.aidl
.Usunięto metodę
IComposerClient.getClientTargetSupport
, ponieważ nie ma aktywnych klientów dla tej metody.Przedstawienie kolorów w postaci liczby zmiennoprzecinkowej, a nie bajtów, aby lepiej dopasować je do górnego stosu graficznego na Androidzie, zgodnie z definicją podaną w zasadzie
ASurfaceTransaction_setColor
.Dodano nowe pola do zarządzania treściami HDR.
W AIDL HAL mieszane stosy warstw SDR/HDR obsługują płynne przyciemnianie warstw SDR, gdy na ekranie jest jednocześnie warstwa HDR.
Pole
brightness
wLayerCommand
pozwala aplikacji SurfaceFlinger określić jasność dla poszczególnych warstw, dzięki czemu HWC przyciemnia zawartość warstwy w przestrzeni światła liniowego, a nie w przestrzeni światła gamma.Pole
brightness
wClientTargetPropertyWithBrightness
pozwala HWC określić przestrzeń jasności dla kompozycji klienta i zlecićRenderEngine
, czy zaciemnić warstwy SDR w kompozycji klienta.Pole
dimmingStage
pozwala HWC skonfigurować, kiedyRenderEngine
ma przyciemnić treści. Umożliwia to korzystanie z zdefiniowanych przez dostawcę metodColorModes
, które mogą preferować przyciemnienie w przestrzeni gamma, aby umożliwić określone przez dostawcę ulepszenia kontrastu w strumieniach kolorów.Dodaliśmy nowy typ kompozycji
DISPLAY_DECORATION
wComposition.aidl
na potrzeby dekoracji ekranu.Niektóre urządzenia mają specjalny sprzęt, który optymalizuje rysowanie maski alfa, która wygładza zaokrąglone rogi i wycięcia na wyświetlaczu. Urządzenia z takim sprzętem muszą implementować
IComposerClient.getDisplayDecorationSupport
, aby zwracać strukturęDisplayDecorationSupport
zgodnie z definicją w nowejDisplayDecorationSupport.aidl
. Ta struktura opisuje enumyPixelFormat
iAlphaInterpretation
wymagane przez urządzenie. W ramach tej implementacji interfejs systemu oznacza warstwę maski alfa jakoDISPLAY_DECORATION
, czyli nowy typ kompozycji, który korzysta ze specjalnego sprzętu.Dodano nowe pole
expectedPresentTime
doDisplayCommand.aidl
.Pole
expectedPresentTime
pozwala narzędziu SurfaceFlinger określić oczekiwany czas wyświetlania treści na ekranie. Dzięki tej funkcji SurfaceFlinger wysyła obecne polecenie do implementacji z wyprzedzeniem, co pozwala na potokowanie większej ilości treści.Dodano nowe interfejsy API do sterowania konfiguracją wyświetlania ekranu uruchamiania.
Korzystając z parametru
BOOT_DISPLAY_CONFIG
, dostawcy mogą określić, że obsługują konfigurację wyświetlacza rozruchu. MetodysetBootDisplayConfig
,clearBootDisplayConfig
igetPreferredBootDisplayConfig
używająBOOT_DISPLAY_CONFIG
w następujący sposób:Dzięki
setBootDisplayConfig
platforma informuje dostawców o konfiguracji wyświetlania czasu uruchamiania. Dostawcy muszą przechowywać w pamięci podręcznej konfigurację ekranu uruchamiania i uruchamiać się z tą konfiguracją przy następnym ponownym uruchomieniu. Jeśli urządzenie nie może się uruchomić w tej konfiguracji, sprzedawca musi znaleźć konfigurację z odpowiednią rozdzielczością i częstotliwością odświeżania. Jeśli nie ma takiej konfiguracji, dostawca powinien użyć preferowanej konfiguracji wyświetlania.Dzięki
clearBootDisplayConfig
platforma informuje dostawców, że powinni wyczyścić konfigurację wyświetlacza rozruchowego i uruchomić urządzenie w preferowanej przez siebie konfiguracji ekranu podczas następnego ponownego uruchamiania.Korzystając z
getPreferredBootDisplayConfig
, framework wysyła zapytanie o preferowany tryb uruchamiania dostawcy.
Jeśli konfiguracja wyświetlania przy rozruchu nie jest obsługiwana, te metody zwracają wartość
UNSUPPORTED
.Dodanie nowych interfejsów API do sterowania licznikiem czasu bezczynności wyświetlacza.
Za pomocą
DISPLAY_IDLE_TIMER
dostawcy mogą wskazać, że licznik braku aktywności dla tego wyświetlacza ma być zaimplementowany przez niego. Gdy urządzenie jest nieaktywne, ta funkcja zmienia częstotliwość odświeżania na niższą, aby oszczędzać energię. Platforma używasetIdleTimerEnabled
do kontrolowania czasu oczekiwania licznika, a w niektórych przypadkach do jego wyłączenia, aby zapobiec niepożądanym zmianom częstotliwości odświeżania podczas bezczynności.Użycie wywołania zwrotnego
IComposerCallback.onVsyncIdle
wskazuje platformie, że wyświetlacz jest nieaktywny i że zmieniła się częstotliwośćvsync
. Platforma reaguje na ten wywołanie zwrotne przez zresetowanie modeluvsync
. Wymusza onavsync
ponowne zsynchronizowanie na następnej klatce i uczy się nowejvsync
kadencji.
Implementacja
Dostawcy nie są zobowiązani do wdrażania interfejsu AIDL HAL w Androidzie 13. Zachęcamy jednak do wdrożenia kodu HAL kompozytora AIDL zamiast wersji HIDL. Pozwoli to korzystać z nowych funkcji i interfejsów API.
Implementacja referencyjna kodu HAL AIDL HWC jest zaimplementowana w emulatorach Androida.
Testowanie
Aby przetestować implementację, uruchom narzędzie VtsHalGraphicsComposer3_TargetTest
.