名词解释
OpenGL
OpenGL(全写Open Graphics Library)是个定义了一个跨编程语言、跨平台的编程接口的规格,它用于三维图象(二维的亦可)。OpenGL是个专业的图形程序接口,是一个功能强大,调用方便的底层图形库。
OpenGL ES
Embedded 是 把…牢牢地嵌入 的意思。
OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL 三维图形 API 的子集,针对手机、PDA和游戏主机等嵌入式设备而设计。
EGL
EGL 是渲染 API(如 OpenGL ES)和原生窗口系统之间的接口,作为 OpenGL 和原生窗口系统之间的桥梁。
EGL 提供如下机制:
- 与设备原生窗口通信
- 查询绘制 surface 的可用类型和配置
- 创建绘制 surface
- 在 OpenGL ES 3.0 或其他渲染 API 之间同步渲染
- 管理纹理贴图等渲染资源
Linux 的内核提供了统一的framebuffer 显示驱动,设备节点/dev/graphics/fb或者/dev/fb,其中fb0就表示第一个Monitor。
Android 的HAL层提供了Gralloc,包括fb 和 gralloc 两个设备,fb负责打开内核中的framebuffer,初始化配置,病提供了post,setSwapInterval等操作接口;gralloc负责管理帧缓冲区的分配和释放。这就意味着上层元素只能通过Gralloc 来间接访问帧缓冲区,从而保证了系统对framebuffer 的有序使用和统一管理。
HAL层的另一个重要模块是“Composer”,Composer 是创作者的意思,它为厂商自定制“UI合成”提供了接口。Composer 的直接使用者是 SurfaceFlinger 中的HWComposer(有两个HWComposer)。HWComposer除了管理Composer的HAL模块之外,还负责VSync信号的产生和控制。 Vsync是一种同步机制,既可以由硬件产生,也可以由软件模拟,( VsyncThread)由于OpenGL ES是一个通用的函数库,在不同的平台系统上需要被“本地化”——把它和具体平台中的窗口系统建立起关联,这样才能正常工作。从 FramebufferNativeWindow 这个名称就能判断出来,它就是负责OpenGL ES在 Android 平台上本地化的中介之一。后面我们害会看到Android应用程序中所使用的另一个“本地窗口”。
为OpenGL ES配置本地窗口的是EGL。OpenGL 或者 OpenGL ES 更多的只是一个接口协议,具体实现既可以采用软件,也可以依托于硬件。EGL会读取 egl.cfg这个配置文件,然后根据用户的设置来动态加载libagl(软件实现)或者是libhgl(硬件实现)
SurfaceFlinger中持有一个成员数组 mDisplays来描述系统中支持的各种“显示设备”——具体有哪些Display是由SurfaceFlinger在readyToRun中判断并赋值的;并且DisplayDevice在初始化时害将调用eglGetDisplay,eglCreateWindowSurface 等接口,并利用EGL来完成对OpenGL ES环境的搭建。
很多模块都可以调用OpenGL ES提供的API,这些接口以gl为前缀。
与OpenGL ES相关的模块可以分为如下几类。
配置类
即帮助OpenGL ES完成配置的,包括EGL,DisplayHardware都可以归为这一类。
依赖类
也就是 OpenGL ES 要正常运行起来所依赖的“本地化”的东西,如FrambufferNativeWindow。
使用类
使用者也可能是配置者,如DisplayDevice既扮演了构建OpenGL ES环境的角色,同时也是它的用户。
GUI HAL 需要解决如下问题点
- 硬件接口抽象
HAL 专门针对某个特定的硬件设别来设计的,因此如何从众多类型的设备中提取出它们的共同属性并付诸软件实现是一个关键。 - 接口的稳定性
HAL层的接口是不允许频繁变动的。 - 灵活的使用方法。
硬件接口抽象
每一个硬件模块都必须有一个名称为 HAL_MODULE_INFO_SYM 的变量。其次,此变量的数据结构要以 hw_module_t 开头,这样就能实现继承关系。
对于某一类硬件设备来说,它所提供的的HAL接口必须是稳定不变的,Android系统已经预先定义好了这些接口,硬件设备上只需要按照要求填空即可,HAL各硬件接口的定义同意放置在工程源码中。
/hardware/libhardware/include/hardware
xref: /hardware/libhardware/include/hardware/gralloc.h
Gralloc 与 Framebuffer
Framebuffer 是内核系统提供的图形硬件的抽象描述。
Android的各个子系统通常不会直接使用内核驱动,而是由HAL层来间接引用底层架构。显示系统中也是如此——它借助于HAL层来操作帧缓存区,而完成这一中介任务的就是Gralloc。
- Gralloc 模块的加载
Gralloc对应的模块是由 FramebufferNativeWindow(OpenGL ES的本地窗口之一)在构造函数中加载的。
En hw_get_module 是上层使用者加载HAL库的入口——这意味着不论是哪个硬件厂商提供的HAL库,我们都只需要通过这个函数来加载它们。
- Gralloc 提供的接口
Gralloc 是 hw_module_t 的“子类”