参考:
33559 www.khronos.org/registry/egl/specs/egl spec.1.5.pdf
什么是EGL
EGL支持多平台、多操作系统,包括Android、Unix和Windows。 由于可扩展性,EGL本身独立于平台渲染API的定义。
EGL支持许多客户端API,包括OpenVG、OpenGL和OpenGL ES
### EGL数据类型
egl布尔型:布尔值
EGLint :整数
EGLAttrib :表示属性的整数
EGLContext :不透明的类型。 由具体实现决定,通常表示状态机的状态
EGLImage :不透明类型,EGLImage的handle
EGLSurface :表示可渲染面的不透明类型
egl sync :表示同步对象处理程序的不透明类型
EGLTime:64位uint,用于时间同步,单位为ns
# # # egl显示
通常表示物理显示器,通常有默认的显示
所有EGL对象都绑定到一个EGL显示
# #上下文和表面
EGL的一个重要角色是提供客户端API创建渲染上下文并将其与surface关联
EGL定义了三种类型的EGLSurface :窗口、pbuffer和pixmap。 这些EGLSurface还有另一个支持脱离屏幕渲染的surface,允许后续读取。 其中窗口和pixmap与平台本身的窗口、pixmap联系在一起
通过指定EGLConfig,可以创建包含位深度和其他buffer参数的EGLSurface。
颜色缓冲器具有其他缓冲器,如深度、多样本和stencil。 他们与EGLSurface联系在一起,而不是上下文。 例如,如果有多个上下文写入到同一缓冲区,他们将共享此缓冲区。 因此,多个窗口之间的渲染不会相互影响。
不同客户端API的上下文共享同一曲面的颜色缓冲区,但不是所有客户端API都有其他缓冲区。
单个上下文可用于任何兼容的EGLSurface。 如果兼容并满足地址空间要求,客户端可以使用多个不同的context渲染到同一EGLSurface,然后在一个context中渲染到多个EGLSurface。
使用# # #上下文
OpenGL和OpenGL ES同时定义了客户端/服务器的状态,他们的上下文包括这两部分。 OpenVG不区分服务器/客户端。
对客户端API的调用依赖于一个称为当前上下文的隐式上下文。
="margin-left:0in;">每个线程对每种client api最多只能有一个current context,比如OpenGL ES和OpenVG的context可以同时设为current。
一个context同时只能在一个线程中设为current。由于OpenGL与OpenGL ES同时共享很多entry point,因此有额外的限制,不能同时设为current。
### 渲染模式
EGL、OpenGL与OpenGL ES均支持两种渲染模式:back buffered与single buffered。
back buffered被window、pbuffer类型的surface使用。渲染时color buffer内存由EGL管理,当client完成渲染时,back buffer通过eglSwapBuffers拷贝到可以看到的窗口。其中pbuffer surface虽然有back buffer,但是不与窗口关联,因此无需拷贝。
single buffered只被pixmap类型的surface使用。Color buffer的内存使用系统原生的pixmap形式指定。client完成渲染时系统原生pixmap就已经包含了最终的结果。由于系统原生pixmap的限制,Pixmap surface通常不支持multisampling。
OpenGL、OpenVG在使用window surface时也支持single buffered模式。
两种模式下的surface均支持使用eglCopyBuffers拷贝到系统原生pixmap。
Pixmap surface支持client渲染与系统原生渲染同时运行,因为内存是由系统管理的。Pbuffer buffer不支持,因为color buffer由EGL管理。Window surface在部分情况下支持
### 地址空间
EGL的对象与context只能在创建时的地址空间使用,不能跨进程。大部分平台上提供跨线程支持。
context不能在另一个进程/地址空间中使用。
### 共享
OpenGL与OpenGL ES中的texutre对象不支持同步,如果绑定到多个context,用户必须自己保证多线程同步。两个context中同时读写的行为时未定义的。如果texture对象在多个context中绑定,只有全部delete之后才会delete。glBindTexture之类的命令是atomic的。
Buffer 对象与texture对象的表现是一样的。
### 多线程
EGL不保证多种client api之间的执行顺序。用户需要自己使用同步指令保持同步。
### 电源管理
当电源管理事件发生时,EGLSurface还存在,但其上所有的object都必须销毁重建