《android内核设计框架》读书笔记
1.EGL 和 OpenGL ES
EGL是图形渲染API(如OpenGL ES)和本地窗口系统之间的一层接口,提供以下功能
- 创建rendering surfaces,surface通俗地讲就是承载图形的介质,只有申请到surface,应用程序才能真正作图到屏幕上
- 创建图形环境(graphics context),openGL ES其实就是一个管道,因而它需要状态管理,这就是context的工作
- 同步应用程序和本地平台渲染api
- 提供对显示设备的访问
- 提供对渲染配置的管理
2.egl.cfg
图形渲染是采用硬件还是软件的方式是在系统启动后由egl.cfg文件确定的,如果是硬件加速的情况下,就加载libhgl库,否则就加载libagl库由cpu进行图形处理,流程是
2.1 egl.cfg是否存在
该文件通常在源码的/device/[Manufacture]目录下,然后经过编译被烧写到设备的如下位置/system/lib/egl/egl.cfg,如果文件不存在,说明硬件不支持图形渲染加速,因而只能通过加载软件库libagl来完成图形处理工作
2.2 egl.cfg存在的情况下解析该文件
如果该文件存在,首先解析这个文件
#<DisplayName><HW/SW><LIB_NAME>
0 1 mali
- 第一个数字表示显示屏编号
- 第二个数字表示硬件库(1)还是软件库(0)
- 第三个参数是库的名称
2.3 OpenGL函数的执行
解析egl.cfg之后,系统已经能确认出是采用硬件还是软件来做图形渲染了,并同步加载正确的库,这样OpenGL函数在后续的执行过程就知道应该跳到libagl还是libhgl了。
3.EGL接口解析
只有成功调用并执行这些接口,才能保证OpenGLES的正常运行
3.1 eglGetDisplay获取设备的Display
EGLAPI EGLDisplay EGLAPIENTRY eglGetDisplay(EGLNativeDisplayType display_id);
OpenGLES是与系统无关的,所以在某一特定平台使用的时候,就涉及到对它进行本地化处理的问题,EGL为OpenGLES和本地窗口提供了一个中介,EGL面对的是各种各样的平台,所以EGL需要一个机制来统一这些差异,接口eglGetDisplay得到的EGLDisplay就是一个与具体平台无关的对象,对于任何使用EGL的应用来说,首先要做的就是通过eglGetDisplay来取得设备的Display,一般情况下,参数是EGL_DEFAULT_DISPLAY,即默认的显示屏。
EGLDisplay display;
display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
if(display == EGL_NO_DISPLAY || eglGetError()!=EGL_SUCCESS){
//错误处理
}
3.2 eglGetError
大部分egl函数都只会返回EGL_TRUE和EGL_FALSE表示成功或失败,所以需要调用eglGetError来获取具体的失败原因
3.3 eglInitialize
EGLAPI EGLBoolean EGLAPIENTRY eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor);
eglGetDisplay之后,还需要对EGL进行初始化,这个函数对EGL内部的数据进行初始值设定,并返回当前的版本号。
3.4 eglGetConfigs
EGLAPI EGLBoolean EGLAPIENTRY eglGetConfigs(EGLDisplay dpy, EGLConfig *configs, EGLint config_size, EGLint *num_config);
该函数使用分为两种
第一种:如果configs为null,则能得到当前系统中所有Surface配置的数量num_config
第二种:否则,需要指定maxReturnConfigs,然后EGL会把结果填充到configs中
3.5 eglGetConfigAttribute
EGLAPI EGLBoolean EGLAPIENTRY eglGetConfigAttrib(EGLDisplay dpy, EGLConfig config,EGLint attribute, EGLint *value);
EGLConfig包含了一个有效Surface的所有详细信息,如颜色数量,额外的缓冲区,Surface类型等,可以通过eglGetConfigAttrib来指定需要查看的具体属性
3.6 eglChooseConfig
EGLAPI EGLBoolean EGLAPIENTRY eglChooseConfig(EGLDisplay dpy, const EGLint *attrib_list,
EGLConfig *configs, EGLint config_size,
EGLint *num_config);
选择一个最佳配置,需要提供配置清单
3.7eglCreateWindowSurface
EGLAPI EGLSurface EGLAPIENTRY eglCreateWindowSurface(EGLDisplay dpy, EGLConfig config,
EGLNativeWindowType win,
const EGLint *attrib_list);
选好了config之后就可以创建windowsurface了
3.8 eglCreatePbufferSurface
EGLAPI EGLSurface EGLAPIENTRY eglCreatePbufferSurface(EGLDisplay dpy, EGLConfig config,
const EGLint *attrib_list);
之前声称的windowsurface可用于在终端屏幕上显示,而eglCreatePbufferSurface生成的结果则是离屏的渲染区
3.9 eglCreateContext
EGLAPI EGLContext EGLAPIENTRY eglCreateContext(EGLDisplay dpy, EGLConfig config,
EGLContext share_context,
const EGLint *attrib_list);
OpenGL是一个状态机,需要对许多状态进行管理,EGLContext就是基于这个需求提出的,它为OpenGL的运行提供了统一的环境,并让我们可以依托这个环境对OpenGL进行更好的控制
3.10 eglMakeCurrent
EGLAPI EGLBoolean EGLAPIENTRY eglMakeCurrent(EGLDisplay dpy, EGLSurface draw,
EGLSurface read, EGLContext ctx);
一个进程可以有多个Context,所以我们必须选择其中一个作为当前的处理对象
http://imgtec.eetrend.com/blog/6839
http://www.cnblogs.com/kiffa/archive/2013/02/21/2921123.html
http://www.th7.cn/Program/Android/201507/500787.shtml
http://255135.blog.51cto.com/245135/814818
http://www.jdzhao.com/game/show_322_190.html
http://www.opengpu.org/forum.php?mod=viewthread&tid=16882
http://blog.sina.com.cn/s/blog_6dd0be790101mwbj.html
http://blog.csdn.net/jackie03/article/details/7298682
网友评论