EGL Version 1.4 阅读理解.doc

上传人:11****ws 文档编号:2990728 上传时间:2019-05-16 格式:DOC 页数:5 大小:282.50KB
下载 相关 举报
EGL Version 1.4 阅读理解.doc_第1页
第1页 / 共5页
EGL Version 1.4 阅读理解.doc_第2页
第2页 / 共5页
EGL Version 1.4 阅读理解.doc_第3页
第3页 / 共5页
EGL Version 1.4 阅读理解.doc_第4页
第4页 / 共5页
EGL Version 1.4 阅读理解.doc_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

1、EGL Version 1.4 阅读理解1. 概览EGL 是介于各种粉刷(rendering)API 如(OpenGL,OpenVG 等)和底层窗口系统平台之间的接口。EGL 提供各种机制创建图形 context 和粉刷 surface 供客户 API 使用。同时,EGL 也在绘图的过程中为本地绘图平台和客户 api 提供同步机制。EGL 提供远程和间接粉刷机制,而 GLX API 则有这个机制。2. EGL 操作2.1 本地窗口系统和粉刷 APIEGL 可以在多个操作系统(塞班/嵌入式 linux/unix/windows 等)和多种本地窗口(X/Microsoft Windows)中实现。

2、EGL 的实现也可能允许本地其他的粉刷 api 来粉刷 EGL surface,如(Xlib,GDI)。2.1.1 常数类型1.EGLBoolean:egl 的 boolean 类型,值可以是 EGL_TRUE (1) 和 EGL_FALSE (0).2.EGLint:类似于 int 类型。2.1.2 Display大部分 EGL 调用都会使用 EGLDisplay 参数,它代表一个抽象的屏幕。2.2 粉刷上下文和绘图平面(Rendering Contexts and Drawing Surfaces)EGL 的一个最主要的目的就是提供粉刷上下文和绘图平面的创建函数供客户端 API 使用。EG

3、L 定义了多种绘图平面类型,统称 EGLSurface。主要包括如下三类:(1)window surface:可以将里面的图形缓冲画到屏幕上。(2)pbuffers surface:数据存在内存缓冲上,不能画在屏幕上。(3)pixmaps,surface:本地 api 可以访问的内存数据缓冲。EGLSurface 是依照各自的 EGLConfig 来进行的(其实就是创建 EGLSurface 的函数需要 EGLCongif 做参数)。EGLConfig 描述了所创建的平面需要的颜色深度,类型,辅助缓冲等一些信息。辅助缓存是对应于 EGLSurface 的,而不是 context。如果很多 co

4、ntext 向同一个 surface 画图,则 context 之间会共享这些缓冲。Surface 和 Context 之间有一种兼容性的说法,满足兼容性条件后,surface 才能被 context 使用。这些条件是:(1)支持相同类型的颜色缓冲。(颜色缓冲类型包括 RGB/luminance 等)(2)具有相同的颜色缓冲深度和辅助缓冲深度。这里的深度只各个颜色深度都要相同,比如 RGB565 与 RGB4444 中,虽然颜色深度总和都是 16bit/pixel,但是每个维度的深度不一样。因此,他们是不兼容的。辅助缓冲有一个特例,如果某个辅助缓冲对于某个客户 API 是没有意义的(不需要的)

5、,那么,这种缓冲不考虑兼容性。如,一个 surface 包含颜色缓冲和 stencil buffer,当 OpenVG 粉刷 api 下的 Context 包含相同的颜色缓冲时,他们是兼容的。因为,OpenVG不需要 stencil buffer。(3)surface 和 context 需要在相同类型的客户 api(都是 opengl 或都是 openVG 等)创建函数下创建。(4)他们的创建函数中使用的 display 参数是一样的。满足兼容条件时,一个 context 可以往多个 EGLSurface 上作画,一个 EGLSurface 也可以对应多个 context。2.2.1 使用粉

6、刷上下文(Rendering Context)OpenGL ES 定义了客户端状态和服务端状态。因此,OpenGL ES 的 context 包含客户和服务端两个状态。OpenVG 则没有。OpenGL ES 和 OpenVG 客户 API 都采用了隐含的 context 作为粉刷入口点,而不是在绘图函数中传入 Context 参数。因此,EGL 会提供一个函数(makeCurrent())来使某个 context 变成当前使用状态。每个线程最多可以为每个支持的客户端 api(opengl/openVG 等)创建一个当前粉刷 context。另外,同一时刻,一个 context 只能被一个线程

7、置成当前。2.2.2 粉刷模式EGL 支持两种粉刷模式:后备缓冲和单缓冲。(back buffered and single buffered)后备缓冲可以用在 window 和 pbuffer 两种 surface 中,EGL 负责相关的内存申请和使用。单缓冲则用在 pixmap surface 中,其内存格式和本地系统使用的 pixmap 格式一样,可供本地窗口系统函数访问。当然,某些些客户 api 比如Opengl 和 OpenVG,也支持单缓冲的 window surface。不管是单缓冲还是后备缓冲的 surface 都可以通过 eglCopyBuffers()函数,拷贝到指定的本地

8、 pixmap 中。EGL surface 对应的本地窗口缩放时,EGL 的 window surface 也需要跟着缩放。一般的实现过程是,本地操作系统和窗口系统执行一个的回调函数通知 EGL 改变窗口大小,这个改变对客户端 api 是透明的。也有一些 EGL 实现,是通过surface 大小改变的函数调用来实现。对于没有实现窗口改变功能的 EGL 实现,需要通过调用 eglSwapBuffers 函数调用来回本地窗口改变。2.4 状态共享大部分客户端 api 的 context 状态是很小的。但是,一些有时候我们希望 context 之间可以共享一些状态,省得各个 context 都拥有一

9、些相同的内部状态数据。只有相同客户 api 创建(如都是 OpenGL 创建的)的 context 才能共享内部一些状态。OpenGL contexts 可以共享 texture objects, shader 和 program objects, display list objects, pixel 和 vertex buffer objects. OpenGL ES contexts 可以共享 texture objects, shader 和 program objects, vertex buffer objects.OpenVG contexts 可以共享 images, pain

10、t objects, paths.2.5 多线程EGL 和它的客户端 api 函数必须是线程安全的。客户端 api 和本地绘图 api 可以通过一些同步原语来实现同步。3. EGL 函数与错误3.1 错误要检测当前 egl 调用的详细错误信息,可以调用:EGLint eglGetError(void);3.2 初始化(1)EGLDisplay eglGetDisplay(EGLNativeDisplayType display_id);需要先初始化 Display 后,才能调用 EGL 其他函数和客户端 API 函数。这里 EGLNativeDisplayType 是依不同本地平台而不同的。如

11、,X windows 窗口系统下,它对应于 X Display;对于微软系统下,它对应于 Windows Device Context。(2)EGLBoolean eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor);初始化刚才得到的display。(3)EGLBoolean eglTerminate(EGLDisplay dpy););释放刚才得到的display。3.3 EGL 信息(1)const char *eglQueryString(EGLDisplay dpy, EGLint name);查询当前display下的

12、EGL信息。name 参数可以是如下几个:EGL_CLIENT_APIS, EGL_EXTENSIONS, EGL_VENDOR, 或者EGL_VERSION.返回值为查询结果。3.4 EGL Configuration 管理EGLConfig 描述了一个 EGLSurface 所包含的像数格式,类型,颜色缓冲大小,辅助缓存大小等信息。如果EGLSurface 是属于 window surface,那么这个 surface 的 EGLConfig 还包含相关的本地视窗类型。表 3-1 描述了EGLConfig 的属性值,他们可以作为 eglChooseConfig 的参数。EGL_CONFIG

13、_ID 是一个唯一指定不同 EGLConfig 的整数值。他们是1-N的正整数。(1)EGLBoolean eglGetConfigs(EGLDisplay dpy, EGLConfig *configs, EGLint config_size,EGLint *num_config);查询所有指定 display 下的 EGLCongifs,num_config 返回了可用的数目。(2)EGLBoolean eglChooseConfig(EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_s

14、ize, EGLint *num_config);传入需求的属性列表,看是否有合适的config。(3)EGLBoolean eglGetConfigAttrib(EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint *value);查询某个config的某些属性值。3.5 粉刷表面(Rendering Surface)(1)EGLSurface eglCreateWindowSurface(EGLDisplay dpy, EGLConfig config, EGLNativeWindowType win,const EGLint

15、 *attrib_list);创建windowsurface。(2)EGLSurface eglCreatePbufferSurface(EGLDisplay dpy, EGLConfig config, const EGLint *attrib_list);创建pbuffer surface.(3)EGLSurface eglCreatePbufferFromClientBuffer(EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, EGLConfig config, const EGLint *attrib_list);绑定s

16、urface到客户端api的buffer里。(4)EGLSurface eglCreatePixmapSurface(EGLDisplay dpy, EGLConfig config, EGLNativePixmapType pixmap, const EGLint *attrib_list);创建native pixmap粉刷surface。(5)EGLBoolean eglDestroySurface(EGLDisplay dpy, EGLSurface surface);销毁surface。(6)EGLBoolean eglSurfaceAttrib(EGLDisplay dpy, EG

17、LSurface surface, EGLint attribute, EGLint value);设定surface的属性值。(7)EGLBoolean eglQuerySurface(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint *value);查询surface的属性值。相关属性值见下表:3.6 粉刷纹理(Rendering to Textures)使用如下一些 api 可以实现把 pbuffer surface 里面像数数据粉刷到 OpenGL ES 纹理(texture)中。(1)EGLBoolean egl

18、BindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer);这个命令定义了一个两维的纹理图像。纹理图像包含了指定图像的buffer缓冲区。当前,EGL只支持EGL_BACK_BUFFER。也就是说,函数中,buffer只能等于EGL_BACK_BUFFER。(2)EGLBoolean eglReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer);释放被texture使用的surface缓冲。3.7 粉刷上下文(Rendering Context)(1

19、)EGLBoolean eglBindAPI(EGLenum api);绑定客户端api,参数可以是:EGL_OPENGL_API,EGL_OPENGL_ES_API,或者 EGL_OPENVG_API。(2)EGLenum eglQueryAPI(void);查询当前支持的客户端api。(3)EGLContext eglCreateContext(EGLDisplay dpy, EGLConfig config, EGLContext share_context, const EGLint *attrib_list);创建context。(4)EGLBoolean eglDestroyCon

20、text(EGLDisplay dpy, EGLContext ctx);销毁一个context(5)EGLBoolean eglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx);这个函数就是前面所说的make current功能。指定当前使用的context,之后的一些api调用都是基于这个context状态下的。draw参数指定的surface可以用来做所有的操作除了读像数,read则是用来读的。read和draw可以指定同一个surface,这样该surface可以用来读,也可以写。

21、(6)EGLContext eglGetCurrentContext(void); 返回当前客户端api的当前context。(7)EGLSurface eglGetCurrentSurface(EGLint readdraw);返回read/draw的surface。(8)EGLDisplay eglGetCurrentDisplay(void);返回当前display。(9)EGLBoolean eglQueryContext(EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint *value);获取当前context的属性值。3

22、.8 同步原语(1)EGLBoolean eglWaitClient(void);(2)EGLBoolean eglWaitGL(void);(3)EGLBoolean eglWaitNative(EGLint engine);3.9 提交颜色缓冲(1)EGLBoolean eglSwapBuffers(EGLDisplay dpy, GLSurface surface);如果是后备缓冲的window surface,那么它的颜色缓冲就会被拷贝到本地窗口,如果是单缓冲的surface,那么这个函数就没有用了。(2)EGLBoolean eglCopyBuffers(EGLDisplay dpy

23、, EGLSurface surface, EGLNativePixmapType target);拷贝surface的颜色缓冲到本地pixmap中。关于提交,如果函数中display和surface参数是当前线程的current context的display和surface,那么eglSwapBuffers和eglCopyBuffers会在当前的context下执行一个显式的flush操作(对于opengl或者opengl es是glFlush函数,对于OpenVG 则是vgFlush函数)。后来的客户端api命令也可以马上发送,但是在这次提交操作完成前(flush),不会被执行。(3)EGLBoolean eglSwapInterval(EGLDisplay dpy, EGLint interval);用于指定最小的帧发送间隔(一般指video)。3.10 获取扩展函数指针void (*eglGetProcAddress(const char *procname)(void);3.11 释放线程状态EGLBoolean eglReleaseThread(void);EGL保存一些线程状态供类似elgGetError等函数查询,调用这个函数可以使他们恢复到初始状态。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 实用文档资料库 > 策划方案

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。