EGL介绍

参考kronone官网和https://blog.csdn.net/ieearth/article/details/71180457

介绍:

EGL是Khronos指定的一种接口,做渲染API的种窗口系统包装的层,一般提供给OpenGL ES和OpenVG使用。主要包括:图形上下文管理、surface/buffer绑定、渲染同步和高性能加速及2/3D混合渲染使能。同时也提供不同API之间的数据传输。比如跑在视频子系统上的OpenMAX AL和跑在GPU上的OpenGL ES之间的数据传输。
可以支持Linux和Windows操作系统,支持底层渲染API的选择Xlib或GDI。
EGL支持三种类型的surface渲染,分别是window、pixmap和pixel buffer。其中,window和pixmap类型的surface与本地窗口系统对应的资源息息相关;而pixel buffer则是EGL资源独享的,不可通过本地窗口系统进行渲染。

Advanced API Interop

EGLStreams扩展提供一个功能强大,且方面编程的API,用来控制一组Kronos API的图像流开启全硬件加速实现高级应用,如 增强现实Augmented Reality。

image.png

Khronos维护的egl仓库和bug更新在:
https://github.com/KhronosGroup/?

包含的API:

一共包含45条API:

Image相关

eglCreateImage创建一个EGLImage对象
eglBindTexImage定义一个二维纹理图像,纹理图像数据用buffer指定,不需要数据拷贝。纹理的格式和surface保持一致,surface必须是支持EGL_BIND_TO_TEXTURE_RGB或EGL_BIND_TO_TEXTURE_RGBA属性的pbuffer。如果surface和display是线程当前的上下文状态,这个命令相当于glFlush,如果不是要等其他GL draw命令执行完。执行过这个命令之后,指定的surface就不能在读写了。这个函数调用之后eglSwapBuffers会失效。
eglDestroyImage

Context相关

eglCreateContext:创建一个EGL rendering context
eglDestroyContext
eglQueryContext
返回EG渲染上下文信息
eglBindAPI:设置当前要绑定的API,可取参数为EGL_OPENGL_API, EGL_OPENGL_ES_API和EGL_OPENVG_API。1.2及以上的版本支持O喷VG和OpenGLES,1.4及以上版本才支持OpenGL。默认值是ES,可以通过eglQueryAPI来查询。
eglQueryAPI:查询当前的渲染API,返回调用线程中EGL使用的当前渲染API的值. 这个值通过eglBindAPI设置.
eglMakeCurrent将上下文绑定到当前渲染线程上,同时绑定到读写surface上.

配置相关

eglChooseConfig
返回符合指定属性的EGL帧缓冲的配置list,可设置的参数很多。

Buffer相关

eglCopyBuffers将surface的color buffer拷贝到native_pixmap. 相当以一个glFlush。
eglCreatePbufferFromClientBuffer创建一个EGL pixel buffer surface并绑定到一个OpenVG image

Surface相关

eglCreatePbufferSurface
创建一个离屏pixel buffer surface返回它的句柄
eglCreatePixmapSurface
创建一个离屏EGL pixmap surface返回它的句柄. 比eglCreatePixmapSurface多一个平台参数,用来指定属于的平台。
eglCreatePlatformPixmapSurface
创建一个离屏EGL pixmap surface并返回其句柄。
eglCreatePlatformWindowSurface
创建一个离屏EGL窗口surface并返回其句柄。
eglCreateWindowSurface
创建一个离屏EGL window surface并返回其句柄。比eglCreateWindowSurface多个platforms,用来指定属于的平台。
eglQuerySurface查询surface相关信息
eglDestroySurface
eglGetConfigAttrib
返回EGL frame buffer的配置信息。
eglGetConfigs
返回一个list,包含指定display可用的所有EGL frame buffer配置。
eglGetCurrentContext
返回当前EGL渲染上下文,当前EGL渲染上下文通过eglMakeCurrent指定.
eglGetCurrentDisplay
返回当前EGL渲染上下文的display connection。
eglGetCurrentSurface
返回当前EGL渲染上下文的read或draw surface
eglGetDisplay
返回一个EGL display connection
eglGetError
eglGetPlatformDisplay
返回一个EGL display connection
eglGetProcAddress
返回一个GL或EGL扩展函数
eglInitialize
初始化一个EGL display connection
eglIntro
introduction to通过EGL API管理client API渲染。
eglQueryString
返回一个字符串,描述了EGL client或EGL display connection相关的属性,可以查询的参数包括:EGL_EXTENSIONS、EGL_VERSION、EGL_VENDOR和EGL_CLIENT_APIS
eglReleaseTexImage
释放作一个color buffer,这个buffer是用来做一幅纹理的, 指定的color buffer释放给了surface。
eglReleaseThread
释放EGL per-thread state. 将EGL的状态复位到初始化的情况,释放的值包括error status, currently bound rendering API以及每一个client API支持的当前上下文。The overhead of maintaining this state may be objectionable in applications which create and destroy many threads, but only call EGL or client APIs in a few of those threads at any given time.
eglSurfaceAttrib
设置EGL surface的属性
eglTerminate
中止一个EGL display连接,释放相关资源。如果当前的线程中display关联的contexts或surfaces, 得不关联或切换之后才能释放。中止之后可以通过eglInitialize再次激活。

同步相关:

在native rendering调用之前完成GL的执行,
eglWaitClient对应calls for the currently bound context, for the current rendering API.
eglWaitGL对应OpenGL ES rendering calls for the currently bound OpenGL ES context,同glFinish.
eglWaitNative对应Native rendering calls made prior to eglWaitNative are guaranteed to be executed before GL rendering calls made after eglWaitNative.保证原生窗口系统的渲染完成,参数engine指定需要等待的渲染引擎
eglClientWaitSyncblock调用的线程知道指定的sync信号收到,或者timeout设置的时间到了。
eglWaitSync在server等一个同步对象的触发信号,和eglClientWaitSync不同的地方是不会进行block和等待,会直接返回。
eglCreateSync创建一个EGL sync对象,sync对象使能线程间和API上下文之间的client API同步. 可以用来测试或称才应用程序线程。
eglGetSyncAttrib返回一个sync对象的属性。
eglDestroySync

Swap相关

eglSwapBuffers把EGL surface color buffer推送至native window,如果surface是back-buffered window surface, eglSwapBuffers then the color buffer is copied (posted) native window associated with that surface. 单buffer窗口或pixmap或buffer没有效果。
eglSwapInterval指定当前上下文关联的窗口中,每buffer swap的视频帧数的最小值。The interval takes effect when eglSwapBuffers is first called subsequent to the eglSwapInterval call.

分类

属性配置类的API、surface创建类API、Context生成绑定类API、Display连接和中止类、错误检查类、同步类

使用

初始化display:EGL提供了图形API如OpenGL ES和原生窗口系统如Linux的X Window之间的一个结合层次,在EGL能够确定可用的Surface类型之前,它必须打开和窗口系统的通信渠道,因为是跨平台的,每个窗口系统都有不同的语义,所以EGL提供基本的不透明类型EGLDisplay(类型为void*),该类型封装了所有系统相关属性,用于原生窗口系统接口,不同的窗口系统定义了不同的Display属性,最终都会Native化,定义为EGLNativeDisplayType。任何使用EGL的应用程序必须执行的第一个操作是创建和初始化与本地EGL Display的连接,eglGetDisplay、eglInitialize。

配置surface:

EGL初始化Display完成后,就可以对Surface进行配置了,有两种方法,一种是查询每个Surface配置,找出最好的选择,另一种是指定一组需求,让EGL推荐最佳匹配,两者都返回一个EGLConfig,包括Surface相关的所有属性。在许多情况下,使用第二种方法更简单,而且很有可能得到用第一种方法找到的匹配, eglGetConfigs, eglGetConfigAttrib, eglChooseConfig
创建surface:
有了EGLConfig之后,就可以创建EGLSurface了,Surface不只一种类型,下面先介绍Window Surface,可以理解为EGL窗口,是屏幕上的渲染区域,由eglCreateWindowSurface创建。eglQuerySurface用于获取Surface信息,eglSurfaceAttrib用于设置Surface属性
PBuffer Surface与Window Surface——
除了可以用OpenGL ES 3.0在屏幕上的窗口渲染之外,还可以渲染称作PBuffer(像素缓冲区Pixel Buffer的缩写)的不可见屏幕外表面,和窗口一样,PBuffer可以利用OpenGL ES 3.0中的任何硬件加速,PBuffer最常用于生成纹理贴图,如果想要做的是渲染到一个纹理,那么建议使用帧缓冲区对象(FBO)代替PBuffer,因为帧缓冲区更高效,不过在某些FBO无法使用的情况下,PBuffer仍然有用,例如用OpenGL ES在屏幕外表面上渲染,然后将其作为其它API(如OpenVG)中的纹理。另外,EGLSurface还有个Pixmap Surface,简单总结一下三者的特点。window是on-screen的,pbuffer和pixmap是off-screen的,window绑定到了NativeWindow,pixmap绑定到了NativePixmap,pbuffer没有任何本地绑定,window是双缓冲区的,pbuffer和pixmap是单缓冲区的,window默认在back buffer渲染,通过eglSwapBuffers交换到屏幕上显示,pbuffer在显存中分配,由EGL_HEIGHT和EGL_WIDTH指定大小,常用作纹理数据,pixmap绑定到本地的像素缓冲区,这个缓冲区可以被其它API使用。创建不同的EGLSurface时,需要在EGLConfig中配置EGL_SURFACE_TYPE,window、pbuffer、pixmap分别对应于EGL_WINDOW_BIT、EGL_PBUFFER_BIT、EGL_PIXMAP_BUFFER。
创建context:
eglCreateContext、eglCreateContext
关联context:
创建了Surface和Context之后,因为可能有多个Surface和Context,所以需要通过eglMakeCurrent绑定Context到Surface,dpy为对应的Display,draw用于绘制,read用于读,ctx为要绑定的Context,成功是返回EGL_TRUE,失败时返回EGL_FALSE。因为EGL规范要求eglMakeCurrent实现进行一次刷新,所以这一调用对于基于图块的架构代价很高。
同步操作

你可能感兴趣的:(EGL介绍)