从 Android 13 起,我们开始使用 AIDL 定义硬件混合渲染器 (HWC) HAL,还废弃了 HIDL 版本 android.hardware.graphics.composer@2.1
至 android.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
结构。此结构描述了设备所需的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
。