适用于硬件混合渲染器 HAL 的 AIDL

从 Android 13 起,我们开始使用 AIDL 定义硬件混合渲染器 (HWC) HAL,还废弃了 HIDL 版本 android.hardware.graphics.composer@2.1android.hardware.graphics.composer@2.4

本页将介绍适用于 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),改为使用 Parcelable 命令。

    AIDL HAL 会根据强类型的 Parcelable 类型来定义命令接口,而非使用 HIDL 编写的 FMQ 序列化命令。这为命令提供了稳定的接口,还为命令载荷解释方法提供了更易读的定义。

    executeCommands 方法在 IComposerClient.aidl 中定义为

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

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

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

  • 用浮点数(而非字节)表示颜色,以便更好地与 Android 中的上层图形堆栈(如 ASurfaceTransaction_setColor 中所定义)保持一致。

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

    在 AIDL HAL 中,当 HDR 层也在屏幕上时,混合 SDR/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