从 Android 13 开始,硬件合成器 (HWC) HAL 在 AIDL 中定义,并且从 android.hardware.graphics.composer@2.1 到 android.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结构。此结构描述了设备所需的PixelFormat和AlphaInterpretation枚举。在此实现基础上,系统界面将 alpha 蒙版图层标记为DISPLAY_DECORATION,这是一种利用专用硬件的新合成类型。在
DisplayCommand.aidl中添加了新的expectedPresentTime字段。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节奏。
实现
供应商无需为 Android 13 实现 AIDL HAL。但是,我们鼓励他们实现 AIDL 合成器 HAL 而不是 HIDL 版本,以使用新的功能和 API。
Android 模拟器中实现了 AIDL HWC HAL 的参考实现。
测试
要测试您的实现,请运行 VtsHalGraphicsComposer3_TargetTest。