1.Android系统显示框架参考文档
https://community.nxp.com/docs/DOC-93612
2. 涉及的概念:GPU DC HWC FB OverLay
GPU: (Graphic Process Unit)进行图像的混合渲染
FB : (Frame Buffer)帧缓冲,LCD显示的内容就对应一个帧缓冲。不但显示使用FB,Camera视频输入也使用了FB。
DC : (Display Controller)用于将FB中的数据搬移到LCD屏中
OverLay: 每个硬件图层称为一个Overlay图层。
HWC: (HardWare Composer)用于将OverlayLay图层混合后放到FB中。
3. FB表示的是帧缓冲,不但视频显示使用到,Camera视频输入也使用到,也就是说FB不是显示上特有的概念。
4. 不同的Soc上显示framebuffer的原理是一样的。
5. 每个FB使用一个fbX设备文件表示,tiny4412上的如下:
根据手册的1796页,fb0--fb3对应4个显示通道,其它的fb设备文件用于Camera输入接口、HDMI接口、视频编解码器等。
shell@tiny4412:/ # ls /dev/graphics/ fb0 fb1 fb10 fb11 fb2 fb3 fb4 fb5 fb6 fb7 fb8 fb9
6. 多任务系统的显示,必须有一个显示管理者,这个管理者就是SurfaceFlinger,它的作用:
(1) 给App提供buffer:通过gralloc向ashmem(匿名内存)申请内存,得到一个fd,通过binder将fd传给某个App,App得到fd‘后进行mmap(fd‘)。
(2) App1 App2 App3 把各自的界面发给SF,它根据Zorder,大小进行合成显示,显示。做两个事情:
① 根据各个界面的Zorder值(由WMS决定)决定前后顺序。
② 把这些排序后的buffer传给HardWare Controller.
(3) 当HWC不能处理(没有HWC或支持的层数不够)时,使用GL(Graphic Library)处理。
7.显示框架概图
上图中的EGL就是libEGL.so,它的作用是加载硬件GL库或软件GL库。
Anroid上考虑所有硬件资源的情况:有的硬件上没有HWC,有些层数超过了HWC支持的层数,这时软件GL来实现。此时又区分是否有GPU,若有就通过GL来操作GPU,若连GPU也没有,那么只能使用纯软件来实现了。
8. SurfaceFlinger可以使用EGL接口,App也可以使用EGL接口,App使用EGL接口来话一些图形将非常的高效。