AIDL dla HAL Hardware Composer

Począwszy od Androida 13 interfejs HAL Hardware Composer (HWC) jest zdefiniowany w AIDL i wersja HIDL od android.hardware.graphics.composer@2.1 dla Wycofano reguły android.hardware.graphics.composer@2.4.

Na tej stronie opisujemy różnice między AIDL a HAL HIDL dla HWC oraz wdrażanie i testowanie interfejsu AIDL HAL.

Z powodu zaletami oferowanymi przez AIDL, zachęcamy dostawców usług do wdrożenia Rozpoczęcie HAL kompozytora AIDL Android 13 zamiast HIDL. Zobacz Implementacja, w której znajdziesz więcej informacji.

Różnice między HAL AIDL i HIDL

Nowy HAL kompozytora AIDL o nazwie android.hardware.graphics.composer3 to zdefiniowane w dokumencie IComposer.aidl. Udostępnia interfejs API podobny do HIDL HAL android.hardware.graphics.composer@2.4 z tymi zmianami:

  • Usunięcie kolejki wiadomości (FMQ) w na cześć poleceń.

    Interfejs AIDL HAL definiuje interfejs poleceń na podstawie ściśle określonego typu parcelable, w przeciwieństwie do poleceń serializowanych przez FMQ w HIDL. Ten zapewnia stabilny interfejs poleceń i czytelną definicję sposobu, ładunek polecenia jest interpretowany.

    executeCommands metoda jest zdefiniowana w IComposerClient.aidl jako

    CommandResultPayload[] executeCommands(in DisplayCommand[] commands);
    

    gdzie każde polecenie jest ściśle wpisywanym typem parcelable zdefiniowanym w DisplayCommand.aidl Odpowiedzi polecenia to pakiety parcelable wyraźnie zdefiniowane w CommandResultPayload.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ć górny stos grafiki w Androidzie, jak określono w ASurfaceTransaction_setColor.

  • Dodaliśmy nowe pola do kontrolowania treści HDR.

    W panelu HAL AIDL mieszane stosy warstw SDR/HDR obsługują płynne przyciemnianie warstwy SDR, gdy na ekranie jest jednocześnie widoczna warstwa HDR.

    Pole brightness w tabeli LayerCommand pozwala SurfaceFlinger określić jasność poszczególnych warstw, dzięki czemu HWC przyciemnia w przestrzeni światła linearnego, a nie w przestrzeni gamma.

    Pole brightness w tabeli ClientTargetPropertyWithBrightness pozwala urządzeniu HWC określać jasność instrukcja RenderEngine czy przyciemnić warstwy SDR w komponencie klienta.

    dimmingStage pozwala HWC skonfigurować, kiedy zawartość elementu RenderEngine ma przyciemnić treść. Ten obsługuje zdefiniowane przez dostawcę ColorModes, które mogą preferować przyciemnienie w ekranie gamma aby umożliwić zdefiniowane przez dostawcę zwiększenie kontrastu w potokach kolorów.

  • Dodanie nowego typu kompozycji DISPLAY_DECORATION w Composition.aidl. do dekoracji ekranu.

    Niektóre urządzenia mają specjalny sprzęt, który optymalizuje dodawanie maski alfa, wygładza zaokrąglone rogi i wycięcia na wyświetlaczach. Urządzenia z takim sprzętem muszą zastosuj IComposerClient.getDisplayDecorationSupport do zwrócenia struktury DisplayDecorationSupport określonej w nowym DisplayDecorationSupport.aidl Ta struktura opisuje PixelFormat i AlphaInterpretation wyliczenia wymagane przez urządzenie. W ramach tej implementacji interfejs systemu oznacza parametr warstwa maski alfa jako DISPLAY_DECORATION, nowego typu kompozycji wykorzystującego dedykowany sprzęt.

  • Dodanie nowego elementu expectedPresentTime do DisplayCommand.aidl.

    Pole expectedPresentTime umożliwia usłudze SurfaceFlinger ustawienie oczekiwanego od chwili obecnej do momentu, gdy na ekranie muszą zostać wyświetlone bieżące treści. W związku z tym SurfaceFlinger wysyła obecne polecenie do implementacji przed co pozwala skupić się na większej ilości danych.

  • Dodanie nowych interfejsów API w celu kontrolowania konfiguracji wyświetlania podczas rozruchu.

    Korzystając z BOOT_DISPLAY_CONFIG, dostawcy mogą określić, że konfiguracja wyświetlacza rozruchowego jest obsługiwana. setBootDisplayConfig, clearBootDisplayConfig, i getPreferredBootDisplayConfig metod korzystania z BOOT_DISPLAY_CONFIG w następujący sposób:

    • Korzystając z setBootDisplayConfig, platforma informuje dostawców o konfiguracji wyświetlania czasu uruchamiania. Dostawcy musi zapisywać się w pamięci podręcznej w konfiguracji wyświetlacza podczas rozruchu i uruchamiać w tej konfiguracji przy następnym uruchomieniu i uruchomić ponownie. Jeśli urządzenia nie można uruchomić w tej konfiguracji, dostawca musi znaleźć która odpowiada rozdzielczości i częstotliwości odświeżania tej konfiguracji. Jeśli nie, , dostawca powinien użyć swojej preferowanej konfiguracji wyświetlacza.

    • Korzystając z clearBootDisplayConfig, informuje dostawców o konieczności wyczyszczenia konfiguracji wyświetlacza w trakcie rozruchu; podczas ponownego uruchamiania urządzenia z preferowaną konfiguracją wyświetlacza.

    • Korzystając z getPreferredBootDisplayConfig, platforma wysyła zapytanie do preferowanego trybu uruchamiania dostawcy.

    Jeśli konfiguracja wyświetlacza rozruchowego nie jest obsługiwana, te metody zwracają błąd UNSUPPORTED.

  • Dodanie nowych interfejsów API do sterowania licznikiem czasu bezczynności wyświetlacza.

    • Korzystając z DISPLAY_IDLE_TIMER, Dostawcy mogą określić, że licznik braku aktywności jest zaimplementowany na potrzeby tego wyświetlacza. W stanie bezczynności ta opcja zmienia częstotliwość odświeżania na niższą. w celu oszczędzania baterii. Platforma używa setIdleTimerEnabled by kontrolować czas oczekiwania, a w niektórych przypadkach go wyłączyć w celu w celu uniknięcia niepożądanej częstotliwości odświeżania podczas bezczynności.

    • Korzystanie z narzędzia IComposerCallback.onVsyncIdle Wywołanie zwrotne wskazuje platformie, że wyświetlacz jest nieaktywny, a funkcja vsync a jego częstotliwość się zmieniła. Platforma odpowiada na to wywołanie zwrotne, resetując swoje Model: vsync. Wymusza ponowną synchronizację elementu vsync przy następnej klatce i uczy się nowej Rytm vsync.

Implementacja

Dostawcy nie są zobowiązani do wdrażania interfejsu AIDL HAL w Androidzie 13. Pamiętaj jednak: zachęca ich do wdrożenia AIDL HAL kompozytora zamiast wersji HIDL, aby korzystać z nowych funkcji i interfejsów API.

implementacji referencyjnej. dla interfejsu AIDL HAL HAL jest zaimplementowany w emulatorach Androida.

Testowanie

Aby przetestować implementację, uruchom narzędzie VtsHalGraphicsComposer3_TargetTest.