AIDL для аппаратного компоновщика HAL

Начиная с Android 13, Hardware Composer (HWC) HAL определен в AIDL , а версии HIDL от android.hardware.graphics.composer@2.1 до android.hardware.graphics.composer@2.4 устарели.

На этой странице описываются различия между AIDL и HIDL HAL для HWC, а также реализация и тестирование AIDL HAL.

Из-за преимуществ, предлагаемых AIDL, поставщикам рекомендуется внедрять AIDL composer HAL, начиная с Android 13, вместо версии HIDL. Более подробную информацию см. в разделе «Внедрение» .

Различия между HAL AIDL и HIDL

Новый AIDL composer HAL, названный android.hardware.graphics.composer3 , определен в IComposer.aidl . Он предоставляет API, похожий на HIDL HAL android.hardware.graphics.composer@2.4 со следующими изменениями:

  • Удаление быстрой очереди сообщений (FMQ) в пользу пакетируемых команд.

    AIDL HAL определяет интерфейс команд на основе строго типизированных парцеллируемых типов в отличие от сериализованных команд через FMQ в HIDL. Это обеспечивает стабильный интерфейс для команд и более читаемое определение того, как интерпретируется полезная нагрузка команды.

    Метод executeCommands определен в IComposerClient.aidl как

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

    где каждая команда — это строго типизированный parcelable тип, определенный в DisplayCommand.aidl . Ответы команд — это строго типизированные parcelables, определенные в CommandResultPayload.aidl .

  • Удаление IComposerClient.getClientTargetSupport , поскольку для этого метода нет активных клиентов.

  • Представление цветов в виде чисел с плавающей точкой, а не байтов, для лучшего соответствия верхнему графическому стеку Android, как определено в ASurfaceTransaction_setColor .

  • Добавление новых полей для управления HDR-контентом.

    В AIDL HAL смешанные стеки слоев SDR/HDR поддерживают плавное затемнение слоев SDR, когда на экране одновременно отображается слой HDR.

    Поле brightness в LayerCommand позволяет SurfaceFlinger указывать яркость для каждого слоя, чтобы HWC затемнял содержимое слоя в линейном световом пространстве, а не в гамма-пространстве.

    Поле brightness в ClientTargetPropertyWithBrightness позволяет HWC указывать пространство яркости для клиентской композиции и указывать RenderEngine , следует ли затемнять слои SDR в клиентской композиции.

    Поле dimmingStage позволяет HWC настраивать, когда RenderEngine должен затемнять контент. Это учитывает определенные поставщиком ColorModes , которые могут предпочесть затемнение в гамма-пространстве, чтобы разрешить определенные поставщиком улучшения контрастности в их цветовых конвейерах.

  • Добавление нового типа композиции DISPLAY_DECORATION в Composition.aidl для оформления экрана.

    Некоторые устройства имеют выделенное оборудование для оптимизации отрисовки альфа-маски, которая сглаживает закругленные углы и вырезы на дисплеях. Устройства с таким оборудованием должны реализовать IComposerClient.getDisplayDecorationSupport для возврата структуры DisplayDecorationSupport , как определено в новом DisplayDecorationSupport.aidl . Эта структура описывает перечисления PixelFormat и AlphaInterpretation , требуемые устройством. После этой реализации System UI помечает слой альфа-маски как DISPLAY_DECORATION , новый тип композиции, который использует преимущества выделенного оборудования.

  • Добавление нового поля expectedPresentTime в DisplayCommand.aidl .

    Поле expectedPresentTime позволяет SurfaceFlinger устанавливать ожидаемое настоящее время, когда текущий контент должен быть отображен на экране. С помощью этой функции SurfaceFlinger отправляет команду present реализации заранее, что позволяет ей выполнять большую часть работы по композиции.

  • Добавление новых API для управления конфигурацией загрузочного дисплея.

    Используя BOOT_DISPLAY_CONFIG , поставщики могут указать, что поддерживается конфигурация отображения загрузки. Методы setBootDisplayConfig , clearBootDisplayConfig и getPreferredBootDisplayConfig используют BOOT_DISPLAY_CONFIG следующим образом:

    • Используя setBootDisplayConfig , фреймворк информирует поставщиков о конфигурации отображения времени загрузки. Поставщики должны кэшировать конфигурацию отображения загрузки и загружаться в этой конфигурации при следующей перезагрузке. Если устройство не может загрузиться в этой конфигурации, поставщик должен найти конфигурацию, которая соответствует разрешению и частоте обновления этой конфигурации. Если такой конфигурации не существует, поставщик должен использовать предпочтительную конфигурацию отображения.

    • Используя clearBootDisplayConfig , фреймворк информирует поставщиков о необходимости очистить конфигурацию загрузочного дисплея и выполнить загрузку с предпочитаемой конфигурацией дисплея во время следующей перезагрузки.

    • Используя getPreferredBootDisplayConfig , фреймворк запрашивает предпочтительный режим загрузки поставщика.

    Если конфигурация загрузочного дисплея не поддерживается, эти методы возвращают значение UNSUPPORTED .

  • Добавлены новые API для управления таймером простоя дисплея.

    • Используя DISPLAY_IDLE_TIMER , поставщики могут указать, что поставщик реализует таймер бездействия для этого дисплея. В режиме ожидания эта возможность изменяет частоту обновления на более низкую настройку для экономии энергии. Платформа использует setIdleTimerEnabled для управления тайм-аутом таймера и, в некоторых случаях, для его отключения с целью предотвращения нежелательных переключений частоты обновления в режиме ожидания.

    • Использование обратного вызова IComposerCallback.onVsyncIdle указывает платформе, что дисплей находится в режиме ожидания и каденция vsync изменилась. Платформа отвечает на этот обратный вызов, сбрасывая свою модель vsync . Она принудительно выполняет повторную синхронизацию vsync на следующем кадре и изучает новую каденция vsync .

Выполнение

Поставщикам не обязательно реализовывать AIDL HAL для Android 13. Однако им рекомендуется реализовать AIDL Composer HAL вместо версии HIDL, чтобы использовать новые функции и API.

Эталонная реализация AIDL HWC HAL реализована в эмуляторах Android.

Тестирование

Чтобы протестировать реализацию, запустите VtsHalGraphicsComposer3_TargetTest .