硬件合成器-HwComposer
使用3D合成,需要大面积的像素混合计算和大量的内存传输(GPU读写GraphicBuffer所需),对GPU和DDR来说是一个巨大的负担。在GPU/DDR重度使用的场景(比如玩游戏),会造成发热、卡顿等。
为了提升性能,减少功耗,可以将合成这个过程交由另一个芯片完成,减轻GPU负担。进一步,直接让这个芯片连LCD,在LCD需要显示某一行时在线合成。
HwComposer便是这一个/多个专用合成芯片的驱动HAL层。
驱动由集成芯片系统的厂商自行设计,但需要遵循一定的标准,这个标准就是Android规定的HwComposer接口。
接口定义
hwcomposer的接口定义位于此文件:
hardware/libhardware/include/hardware/hwcomposer.h
其中部分宏定义在:
hardware/libhardware/include/hardware/hwcomposer_defs.h
Layer
在SurfaceFlinger中,Layer对应于window表示一个Buffer循环体系,对HwComposer而言,Layer仅指代当前Buffer,也即SurfaceFlinger中的Layer的当前帧。
typedef struct hwc_layer_1 {
int32_t compositionType;//合成类型,SurfaceFlinger将合成目标Framebuffer的合成类型设为HWC_FRAMEBUFFER_TARGET,其他hwcomposer在prepare时根据实际情况修改
/*
* HWC_FRAMEBUFFER_TARGET:该Layer是3D合成的目标Layer
* HWC_FRAMEBUFFER:hwcomposer无法处理此Layer,该Layer需要走3D合成流程,用OpenGL绘制
* HWC_OVERLAY:该Layer为硬件合成器所处理,不需要OpenGLES去渲染
* HWC_SIDEBAND:该Layer为视频的边频带,需要硬件合成器作特殊处理,若不支持,OpenGL方式只能以一个色块替代,这个标志是外界(应用/驱动)调用窗口系统的perform方法配置的
* HWC_CURSOR_OVERLAY:该Layer可通过setCursorPositionAsync 方法改变坐标
*/
uint32_t hints;//hwcomposer设置,通知SurfaceFlinger需要修改的配置
/*
HWC_HINT_TRIPLE_BUFFER = 0x00000001:表示需要SurfaceFlinger将此Layer改成3Buffer循环
HWC_HINT_CLEAR_FB = 0x00000002:要求SurfaceFlinger清空该Layer位置的FrameBuffer数据(即置0)
*/
uint32_t flags;//SurfaceFlinger设置,hwcomposer作处理
/*
HWC_SKIP_LAYER = 0x00000001:此Layer不参与合成,应当忽略
HWC_IS_CURSOR_LAYER = 0x00000002:此Layer建议设定为一个CURSOR_LAYER,hwcomposer能处理的话将其合成类型改为HWC_CURSOR_OVERLAY
*/
/*该Layer的颜色/Buffer信息*/
union {
hwc_color_t backgroundColor;//背景颜色,适用于纯色Layer,hwc_color_t 为一个 argb 结构体
struct {