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

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

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

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

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

Новый HAL композитора AIDL с именем 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);
    

    где каждая команда представляет собой строго типизированный тип, определенный в DisplayCommand.aidl . Ответы на команды представляют собой строго типизированные объекты, определенные в 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 , необходимые устройству. В этой реализации системный пользовательский интерфейс помечает слой альфа-маски как DISPLAY_DECORATION — новый тип композиции, который использует преимущества выделенного оборудования.

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

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

  • Добавление новых 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 .