天天看点

Android图形显示系统——下层显示4:图层合成下(硬件合成器)硬件合成器-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

在surfaceflinger中,layer对应于window表示一个buffer循环体系,对hwcomposer而言,layer仅指代当前buffer,也即surfaceflinger中的layer的当前帧。

这里面最难理解和最易出错的是 sourcecrop、displayframe和visibleregion,在处理soc上的显示问题时,这往往是首先考虑的因素:

Android图形显示系统——下层显示4:图层合成下(硬件合成器)硬件合成器-HwComposer

如图所示,该layer的显示区域部分被l2完全挡住,source crop 为该layer参与合成的范围,display frame 为该layer合成的目标区域,visibleregion为该layer被挡住后,剩余的可见区域集。

看完了这个结构体,上一篇

<a href="http://blog.csdn.net/jxt1234and2010/article/details/46057267">http://blog.csdn.net/jxt1234and2010/article/details/46057267</a>

所提到的adb shell dumpsys surfaceflinger 所得到的表格,各参数表示什么意思自然一下就清楚了。

物理显示屏表示连接实际的显示仪器如lcd,目的是产生显示效果,可以使用在线合成。

虚拟显示屏表示目的是合成一个buffer,不需要理会这个buffer后续如何产生显示效果,这时需要把所有图层合成到指定的buffer上。这种情况下必须离线合成。典型场景是手机连wfd/hdmi,手机合成好的buffer通过wifi/hdmi传输到电视上显示。

最后是device的函数指针定义

继续阅读