Начиная с Android 13, HAL Hardware Composer (HWC) определяется в AIDL. Версии HIDL от android.hardware.graphics.composer@2.1 до android.hardware.graphics.composer@2.4 больше не поддерживаются.
На этой странице описаны различия между HAL-уровнями AIDL и HIDL для HWC, а также рассказывается, как реализовать и протестировать HAL-уровень AIDL.
Поскольку AIDL имеет преимущества, поставщики могут реализовать HAL композитора AIDL, начиная с Android 13, вместо версии HIDL. Подробнее о реализации…
Различия между HAL AIDL и HIDL
Новый HAL-модуль Composer на основе AIDL, который называется android.hardware.graphics.composer3, определен в IComposer.aidl. Этот API похож на HIDL HAL android.hardware.graphics.composer@2.4, но имеет следующие отличия:
Удаление очереди быстрых сообщений (FMQ) в пользу команд, которые можно передавать с помощью Parcelable.
AIDL HAL определяет интерфейс команд на основе строго типизированных типов parcelable вместо сериализованных команд через FMQ в HIDL. Это обеспечивает стабильный интерфейс для команд и более понятное определение того, как система интерпретирует полезную нагрузку команды.
Метод
executeCommands5 определен в файлеIComposerClient.aidl:CommandResultPayload[] executeCommands(in DisplayCommand[] commands);Каждая команда представляет собой строго типизированный объект Parcelable, определенный в файле
DisplayCommand.aidl. Ответы на команды – это строго типизированные объекты Parcelable, определенные в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 отправляет команду 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. Однако поставщикам рекомендуется реализовать HAL композитора AIDL вместо версии HIDL, чтобы использовать функции и API HAL композитора AIDL.
Эмуляторы Android включают референсную реализацию для AIDL HWC HAL.
Тестирование
Чтобы проверить реализацию, запустите команду VtsHalGraphicsComposer3_TargetTest.