GUI:egl

《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存在的情况下解析该文件

如果该文件存在,首先解析这个文件

#
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

你可能感兴趣的:(GUI:egl)