分类
联系方式
  1. 新浪微博
  2. E-mail

EGL

介绍

EGL 是渲染接口与底层平台间的一个接口层。

渲染接口包括 OpenCL、OpenGL、OpenGL ES 或者 OpenVG,都通称为客户 API。

底层平台举例,比如 X11。

EGL 提供的机制:

  • 创建 rendering surface,客户 API 在上面绘制
  • 创建客户 API 的图形上下文
  • 在客户 API 和系统渲染 API 间进行同步

EGL 没有显式支持 remote or indirect rendering,这一点不像类似的 GLX API。

原生平台

EGL 在设计时是跨操作系统(Android、Unix、Windows)的,也是跨平台的(X11、微软 Windows、支持脱离显示设备进行渲染的平台如 GBM)。

实现者还可以选择,通过 native rendering API,允许渲染到平台特定的 EGL Surfaces,比如 Xlib、GDI。

为了实现扩展性,EGL 的自身定义和概念都与任何平台和渲染 API 无关。

基础类型

类型 说明 备注
EGLBoolean 布尔类型 EGL_TRUE

EGL_FALSE

ELGint 整型
EGLAttrib 指针 与 ISO C intptr_t 等效
EGLContext 客户 API 上下文 上下文的定义取决于客户 API,通常来说,表示描述客户 API 的 abstract machine 的 state vector,允许结合该 state vector 执行客户 API 命令
EGLImage EGLImage 不知道这个图片的含义是什么
EGLSurface surface 供客户 API 将内容绘制在上面的 surface
EGLSync 同步相关
EGLTime 时间 64位无符号整形

Display

大多数 EGL 调用包含一个 EGLDisplay 参数。Display 表示图形绘制的抽象 display。

在大多数环境中,display 对应于一个单独的物理显示器。

Rendering Contexts and Drawing Surfaces

客户 API are intentionally vague on how a rendering context(由客户 API 定义的状态机)是如何创建的。

EGL 的一个目标是提供一种方法来创建客户 API 的 rendering context(可简化为 Context),并将其与绘制 Surface 向关联。

EGLSurfaces

EGL 中定义了多种绘制 Surface,他们统称为 EGLSurfaces。EGLSurfaces 种类包括:

  1. windows:屏上渲染(onscreen rendering)
  2. pbuffers:离屏渲染(offscreen rendering)
  3. pixmaps:离屏渲染(offscreen rendering)到原生 API 能够访问到的 buffers

其中:EGL 的 window 和 pixmap 跟平台的 window、pixmap 是相绑定的。

EGLSurfaces 在创建时受 EGLConfig 配置。具体配置项包括颜色深度,ancillary buffers 的数量和尺寸。

Rendering Context

OpenGL 和 OpenGL ES 定义了 client state 和 server state。因此 OpenGL 和 OpenGL ES 的 context 包含两个部分:一部分持有 client state,一部分持有 server state。

OpenGL、OpenGL ES、OpenVG 的 client API 都依赖一个隐式的 context,而非通过显式的 context 传参。

每个 API 所需的隐式的 context 通过 EGL 调用传入。对于这些 API,隐式 context 也被称为 current context。

对于每种被支持的 client API 来说,每个线程最多有一个 current rendering context。一个 context 一次只能绑定一个线程。

渲染模型

EGL、OpenGL、OpenGL ES 支持两种渲染模型:back buffered 和 single buffered。

back buffered 在 window 和 pbuffer 类型的 surface 中使用。当 client 完成一 frame 绘制,back buffer 会通过 eglSwapBuffers 被拷贝到可见得 window。pbuffer 有 back buffer 但是没有关联 window,因此 back buffer 不需要被拷贝。

single buffered 在 pixmap surface 中使用。当 client 完成一 frame 绘制,native pixmap 包含了最终的 image。

back buffered 和 single buffered 都可以使用 eglCopyBuffers 拷贝到 native pixmap 中。

共享状态

context 中包含很多状态,大多数都很小。但是有些类型的状态很大,拷贝开销较大,因此会在多个 context 中共享该状态。

OpenGL 和 OpenGL ES Texture 对象

Texture state 可以被封装成一个有名字的 texture 对象。

通过将一个未使用的名称与 OpenGL 和 OpenGL ES context 支持的 texture targets (GL_TEXTURE_2D,GL_TEXTURE_3D,GL_TEXTURE_CUBE_MAP)相绑定,可以创建出 texture 对象。

OpenGL 和 OpenGL ES Buffer 对象

如果一个 OpenGL 和 OpenGL ES Buffer 对象与多于一个 context 相绑定,有程序员来保证,一个 context 对 buffer 内容的改动不会影响另一个。

所有对共享 context 状态的修改,都是调用 glBindBuffer 的结果。

EGLImage

在有些场景下,需要在不同的 Client API 之间共享状态。举例来说,将一个由 OpenVG 渲染好的 image 作为 OpenGL ES 的 texture object。