EGL 介绍
OpenGL-ES 是一个操作GPU的图像API标准,它通过驱动向 GPU 发送相关图形指令,控制图形渲染管线状态机的运行状态,但OpenGL需要本地视窗系统进行交互,这就需要一个中间控制层,最好与平台无关
EGL ---- 因此被独立的设计出来,它作为 OpenGL-ES和本地窗口的桥梁
EGL 是 OpenGL ES和底层 Native 平台视窗系统之间的接口层,EGL API 是独立于OpenGL ES各版本标准的独立 API,EGL 提供下面的机制:
- 和设备的原生窗口系统进行通信
- 查询绘图表面的可用类型和配置
- 创建绘图表面
- 在
OpenGL-ES和其他渲染API之间同步渲染 - 管理纹理贴图等绘图资源
比如 egl 可以和 opencl 进行同步,主要通过下面几种方式:
- 通过
eglCreateContext创建共享的上下文 - 通过
eglCreateImageKHR创建可以被OpenGL ES和OpenCL0共同访问的图像资源 eglCreateSyncKHR/eglDestroySyncKHR等函数可以创建跨API的同步点
总结:对接窗口系统,保存绘图状态,管理绘图资源,提供绘图表面配置,和其他 API 进行同步
为 OpenGL-ES指令创建 Context 、绘制目标Surface 、配置Framebuffer属性、Swap提交绘制结果等都是EGL实现的功能
EGL 的作用如下图所示:

EGL 类型和初始化
EGL 包含了自己的一组数据类型,同时也提供了对一组平台相关的本地数据类型的支持,这些 Native 数据类型定义在 EGL 系统的头文件中
下面表格中列举了常见的几种 EGL类型:
| 数据类型 | 说明 |
|---|---|
| EGLBoolean | EGL_TRUE =1,EGL_FALSE=0 |
| EGLint | windows上是int32类型 |
| EGLDisplay | Handle 概念 typedef void *EGLDisplay; |
| EGLConfig | Handle 概念 typedef void *EGLConfig; |
| EGLSurface | Handle 概念 typedef void *EGLSurface |
| EGLContext | Handle 概念 typedef void *EGLContext; OpenGL-ES 图形上下文,它代表了OpenGL状态机) |
EGL初始化方法
EGL 初始化流程如下图所示:

获取 eglDisplay
获得 Display 要调用 EGLboolean eglGetDisplay(NativeDisplay dpy) 参数一般为 EGL_DEFAULT_DISPLAY
初始化 EGL
调用 EGLboolean eglInitialize**(EGLDisplay dpy, EGLint *major, EGLint *minor),该函数会进行一些内部初始化工作,并传回 EGL版本号(major,minor)
选择 Config
一般用EGLboolean eglChooseConfig**(EGLDisplay dpy, const EGLint * attr_list, EGLConfig * config, EGLint config_size, EGLint *num_config)
其中 attr_list 是以 EGL_NONE 结束的参数数组,通常以id,value依次存放,对于个别标识性的属性可以只有 id,没有value
另一个办法是用 EGLboolean eglGetConfigs(EGLDisplay dpy, EGLConfig * config, EGLint config_size, EGLint *num_config) 来获得所有config,这两个函数都会返回不多于 config_size 个 config ,结果保存在 config[]中,系统的总 Config 个数保存 在num_config 中
可以利用 eglGetConfig() 中间两个参数为0来查询系统支持的 Config总个数,Config有众多的Attribute,这些Attribute决定FrameBuffer的格式和能力,通过 eglGetConfigAttrib来读取,但不能修改

最低0.47元/天 解锁文章
1003

被折叠的 条评论
为什么被折叠?



