针对硬件合成器 HAL 的 AIDL

从 Android 13 开始,硬件合成器 (HWC) HAL 在 AIDL 中定义,并且从 android.hardware.graphics.composer@2.1android.hardware.graphics.composer@2.4 的 HIDL 版本已弃用。

本页介绍了 HWC 的 AIDL HAL 和 HIDL HAL 之间的差异,以及 AIDL HAL 的实现和测试。

由于 AIDL 提供的优势,我们鼓励供应商从 Android 13 开始实现 AIDL 合成器 HAL,而不是 HIDL 版本。有关详情,请参阅实现部分。

AIDL HAL 和 HIDL HAL 之间的差异

新的 AIDL 合成器 HAL,名为 android.hardware.graphics.composer3,在 IComposer.aidl 中定义。它公开了一个类似于 HIDL HAL android.hardware.graphics.composer@2.4 的 API,但有以下更改:

  • 移除 快速消息队列 (FMQ),改为使用可打包命令。

    AIDL HAL 基于强类型可打包类型定义命令接口,而不是 HIDL 中通过 FMQ 序列化的命令。这为命令提供了稳定的接口,并提供了更易读的命令负载解释方式定义。

    executeCommands 方法在 IComposerClient.aidl 中定义为:

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

    其中每个命令都是在 DisplayCommand.aidl 中定义的强类型可打包类型。命令响应是在 CommandResultPayload.aidl 中定义的强类型可打包类型。

  • 移除 IComposerClient.getClientTargetSupport,因为此方法没有活跃的客户端。

  • 将颜色表示为浮点数而不是字节,以便更好地与 Android 中较高的图形堆栈对齐,如 ASurfaceTransaction_setColor 中定义的那样。

  • 添加了用于控制 HDR 内容的新字段。

    在 AIDL HAL 中,混合 SDR/HDR 图层堆栈支持在 HDR 图层同时在屏幕上时无缝调暗 SDR 图层。

    LayerCommand 中的 brightness 字段允许 SurfaceFlinger 指定每个图层的亮度,以便 HWC 在线性光空间(而不是伽玛空间)中调暗图层的内容。

    ClientTargetPropertyWithBrightness 中的 brightness 字段允许 HWC 指定客户端合成的亮度空间,并指示 RenderEngine 是否在客户端合成中调暗 SDR 图层。

    dimmingStage 字段允许 HWC 配置 RenderEngine 应何时调暗内容。这可以适应供应商定义的 ColorModes,这些模式可能更倾向于在伽玛空间中调暗,以便在其颜色管道中允许供应商定义的对比度增强功能。

  • Composition.aidl 中添加了新的合成类型 DISPLAY_DECORATION,用于屏幕装饰。

    某些设备具有专用硬件来优化绘制 alpha 蒙版,该蒙版可以平滑显示屏上的圆角和凹口。具有此类硬件的设备必须实现 IComposerClient.getDisplayDecorationSupport 以返回 DisplayDecorationSupport.aidl 中定义的 DisplayDecorationSupport 结构。此结构描述了设备所需的 PixelFormatAlphaInterpretation 枚举。在此实现基础上,系统界面将 alpha 蒙版图层标记为 DISPLAY_DECORATION,这是一种利用专用硬件的新合成类型。

  • DisplayCommand.aidl 中添加了新的 expectedPresentTime 字段。

    expectedPresentTime 字段允许 SurfaceFlinger 设置预期显示时间,即当前内容必须在屏幕上显示的时间。借助此功能,SurfaceFlinger 可以提前向实现发送显示命令,从而使其能够流水线化更多合成工作。

  • 添加了用于控制启动显示配置的新 API。

    使用 BOOT_DISPLAY_CONFIG,供应商可以指定支持启动显示配置。setBootDisplayConfigclearBootDisplayConfiggetPreferredBootDisplayConfig 方法使用 BOOT_DISPLAY_CONFIG,如下所示:

    • 使用 setBootDisplayConfig,框架会通知供应商启动时显示配置。供应商必须在启动显示配置中缓存,并在下次重启时在此配置中启动。如果设备无法在此配置中启动,则供应商必须找到与此配置的分辨率和刷新率匹配的配置。如果不存在此类配置,则供应商应使用其首选显示配置。

    • 使用 clearBootDisplayConfig,框架会通知供应商清除启动显示配置,并在下次重启期间在其首选显示配置中启动。

    • 使用 getPreferredBootDisplayConfig,框架会查询供应商的首选启动模式。

    当不支持启动显示配置时,这些方法会返回值 UNSUPPORTED

  • 添加了用于控制显示屏空闲计时器的新 API。

    • 使用 DISPLAY_IDLE_TIMER,供应商可以指定供应商为此显示屏实现了非活动计时器。空闲时,此功能会将刷新率更改为较低的设置以节省电量。平台使用 setIdleTimerEnabled 来控制计时器的超时,并在某些情况下禁用计时器,以防止空闲时出现不必要的刷新率切换。

    • 使用 IComposerCallback.onVsyncIdle 回调向平台指示显示屏处于空闲状态,并且 vsync 节奏已更改。平台通过重置其 vsync 模型来响应此回调。它会在下一帧强制 vsync 重新同步,并学习新的 vsync 节奏。

实现

供应商无需为 Android 13 实现 AIDL HAL。但是,我们鼓励他们实现 AIDL 合成器 HAL 而不是 HIDL 版本,以使用新的功能和 API。

Android 模拟器中实现了 AIDL HWC HAL 的参考实现

测试

要测试您的实现,请运行 VtsHalGraphicsComposer3_TargetTest