Начиная с 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 предлагает преимущества , поставщики могут реализовать AIDL Composer HAL, начиная с Android 13, вместо версии HIDL. Подробнее см. в разделе «Реализация» .
Различия между HAL AIDL и HIDL
 Новый HAL-компонент AIDL, названный android.hardware.graphics.composer3 , определён в IComposer.aidl . API аналогичен HAL-компоненту HIDL android.hardware.graphics.composer@2.4 , но включает следующие изменения:
- Удаление быстрой очереди сообщений (FMQ) в пользу пакетируемых команд. - AIDL HAL определяет командный интерфейс на основе строго типизированных парцеллятивных типов вместо сериализованных команд через FMQ в HIDL. Это обеспечивает стабильный интерфейс для команд и более понятное описание того, как система интерпретирует полезную нагрузку команд. - Метод - executeCommands5 определен в- 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поля PresentTime в- 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 Composer HAL.
Эмуляторы Android включают в себя эталонную реализацию AIDL HWC HAL.
Тестирование
 Чтобы протестировать реализацию, запустите VtsHalGraphicsComposer3_TargetTest .
