GUI:egl

作者: 81bad73e9053 | 来源:发表于2016-11-15 21:29 被阅读199次

    《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

    相关文章

      网友评论

          本文标题:GUI:egl

          本文链接:https://www.haomeiwen.com/subject/zbylpttx.html