EGL API Notes

1. EGLDisplay

按照Spec上的说法, EGLDisplay表示一个抽象的显示设备, 绘图的结果是显示在这个设备上的. 从字面上理解, 如显示器, 手机屏幕都可以认为是一个EGLDisplay, 当然多个显示器也可能只相当于一个EGLDisplay. 不过, EGLDisplay的概念是抽象的平台化的, 在各种实现中EGLDisplay的概念不必保证一致. 在特定平台上可以通过查看eglplatform.h头文件中NativeDisplayType的定义来找出EGLDisplay的定义.

基本上每个EGL的函数都需要EGLDisplay作为参数. 从这点上看, EGLDisplay更像是进程中负责绘图的总管, 其维护着EGLConfig, EGLSurface, EGLContext等重要的资源.

 

EGLDisplay eglGetDisplay(EGLNativeDisplayType display_id);

a). 得到一个EGLDisplay.

参数:

display_id 不同平台对应不同的对象. EGL_DEFAULT_DISPLAY宏表示默认的Display.

返回值:

EGL_NO_DISPLAY Get失败.

b). 新Get回来的EGLDisplay的状态是Uninitialized.

c). 可以重复Get同一个EGLDisplay.

 

EGLBoolean eglInitialize(EGLDisplay dpy, EGLint* major, EGLint* minor);

a). 初始化EGLDisplay.

参数:

dpy 任意状态的EGLDisplay.
major 成功调用则更新为主版本号.
minor 成功调用则更新为副版本号.

如果失败, 错误代码如下:

EGL_BAD_DISPLAY 无效的dpy.
EGL_NOT_INITIALIZED dpy有效, 其他原因导致失败.

b). 可以重复初始化一个EGLDisplay, 除了返回EGL_TRUE没有任何效果.

c). 成功初始化后的EGLDisplay进入Initialized状态. 之后列出的所有API除非特殊说明都需要EGLDisplay初始化.

 

EGLBoolean eglTerminate(EGLDisplay dpy);

a). 销毁该EGLDisplay下的所有资源. 该函数并不是立刻销毁所有的资源, 而只是将这些资源全部标记为销毁状态. 一旦这些资源不是current的状态, 则会自动销毁.

参数:

dpy 任意状态的EGLDisplay.

如果失败, 错误代码如下:

EGL_BAD_DISPLAY 无效的dpy.

b). 可以重复销毁一个EGLDisplay, 除了返回EGL_TRUE没有任何效果.

c). 成功销毁后的EGLDisplay进入Uninitialized.

d). 可以将销毁后的EGLDisplay重新Initialize, 但是标记为销毁状态的资源的句柄还是无效的, 这些资源还是会被销毁.

e). 使用状态为Uninitialized的EGLDisplay作为其他接口的参数时, 会使该调用失败, 并产生EGL_NO_INITIAZLIED的错误代码.

 

 

2. EGLConfig

渲染的目标是EGLSurface, 渲染的环境是EGLContext, 而EGLConfig描述了将要创建的EGLSurface和EGLContext的属性. 基本上所有重要的渲染配置都是由EGLConfig指定的, 例如: ColorBuffer的格式, 颜色深度, 是否有StencilBuffer等等. EGLConfig像是一个结构体, 只保存属性信息, 在创建EGLSurface和EGLContext时传入; 但又不是普通的结构体, 其属性不能写只能读. 在各种实现中, 系统已经保存好了自己支持的EGLConfig供调用者查询.

 

EGLBoolean eglGetConfigs(EGLDisplay dpy, EGLConfig* configs, EGLint config_size, EGLint* num_config);

a). 该函数返回平台上支持的所有EGLConfig配置.

参数:

dpy Initialized状态的EGLDisplay.
configs 接收EGLConfig数组的首地址. 可以为NULL.
config_size EGLConfig数组的大小. 可以为0.
num_config 总的EGLConfig数量.

如果失败, 错误代码如下:

EGL_NOT_INITIALIZED dpy是Uninitialized的.
EGL_BAD_PARAMETER num_config是NULL.

b). 只要num_config不为NULL, 则一定可以返回总的EGLConfig的数量. 所以使用时一般先传人NULL和0作为configs和config_size的参数, 来得到总的EGLConfig的数量. 再new出该数量的数组接受所有的EGLConfig.

c). EGLConfig属性表:

属性 默认值 说明
EGL_CONFIG_ID EGL_DONT_CARE EGLConfig的ID, 值在[1, N]之间, N为EGLConfig的总数.
EGL_COLOR_BUFFER_TYPE EGL_RGB_BUFFER [EGL_RGB_BUFFER, EGL_LUMINANCE_BUFFER], EGLSurface的类型. 指定为RGB_BUFFER时; RED, GREEN, BLUE的SIZE必须是非零值, LUMINANCE的SIZE必须是零值. 指定为LUMINANCE_BUFFER时相反.
EGL_BUFFER_SIZE 0 Unsigned Interger. R + G + B + A or L + A.
EGL_RED_SIZE 0 Unsigned Interger. EGLSurface的red bits.
EGL_GREEN_SIZE 0 Unsigned Interger. EGLSurface的green bits.
EGL_BLUE_SIZE 0 Unsigned Interger. EGLSurface的blue bits.
EGL_LUMINANCE_SIZE 0 Unsigned Interger. EGLSurface的luminance bits.
EGL_ALPHA_SIZE 0 Unsigned Interger. 为0时, EGLSurface没有ALPHA通道.
EGL_ALPHA_MASK_SIZE 0 Unsigned Interger. OpenVG用.
EGL_DEPTH_SIZE 0 Unsigned Interger. EGLSurface的depth bits.
EGL_STENCIL_SIZE 0 Unsigned Interger. EGLSurface的stencil bits.
EGL_SAMPLE_BUFFERS 0 是否有MultiSamle Buffer, [0, 1].
EGL_SAMPLES 0 Unsigned Interger, MultiSample时的采样数.
EGL_SURFACE_TYPE EGL_WINDOW_BIT [EGL_WINDOW_BIT, EGL_PIXMAP_BIT, EGL_PBUFFER_BIT, EGL_MULTISAMPLE_RESOLVE_BOX_BIT, EGL_SWAP_BEHAVIOR_PRESERVED_BIT], 指定可以创建的Surface类型(省略了OpenVG相关的). 如果设置了EGL_MULTISAMPLE_RESOLVE_BOX_BIT标志位, 则可以选择多重采样时filtering的方式. 如果设置了EGL_SWAP_BEHAVIOR_PRESERVED_BIT标志位, 则可以选择是否保留swap buffer后frontbuffer的内容.
EGL_RENDERABLE_TYPE EGL_OPENGL_ES_BIT [EGL_OPENGL_BIT, EGL_OPENGL_ES_BIT, EGL_OPENGL_ES2_BIT, EGL_OPENVG_BIT], 指定创建的EGLSurface支持哪些API.
EGL_NATIVE_RENDERABLE EGL_DONT_CARE Boolean. 指定系统的绘图指令是否可以操作EGLSurface.
EGL_NATIVE_VISUAL_ID   平台相关, 待研究.
EGL_NATIVE_VISUAL_TYPE EGL_DONT_CARE 平台相关, 待研究.
EGL_CONFIG_CAVEAT EGL_DONT_CARE [EGL_NONE, EGL_SLOW_CONFIG, EGL_NON_CONFORMANT_CONFIG]. 以OpenGL ES来说, 它的Spec规定了一些一致性的标准, 某些实现可能达不到这些标准. SLOW_CONFIG选择的是能够达到标准的, 但不是硬件实现, 运行慢的EGLConfig. NON_CONFORMANT_CONFIG选择的就是不符合一致性标准的EGLConfig.
EGL_CONFORMANT 0 [EGL_OPENGL_BIT, EGL_OPENGL_ES_BIT, EGL_OPENGL_ES2_BIT, EGL_OPENVG_BIT], 配合上面的属性指定API类型.
EGL_LEVEL 0 EGLSurface在Native系统中的叠加层次(如果有的话). 默认是0.
EGL_TRANSPARENT_TYPE EGL_NONE [EGL_NONE, EGL_TRANSPARENT_RGB], EGLSurface是否与Native系统中的Buffer作混合, 混合的ColorKey通过下面三个属性指定. 符合ColorKey的像素会被剔除掉.
EGL_TRANSPARENT_RED_VALUE EGL_DONT_CARE [0, 2EGL_RED_SIZE - 1]
EGL_TRANSPARENT_GREEN_VALUE EGL_DONT_CARE [0, 2EGL_GREEN_SIZE - 1]
EGL_TRANSPARENT_BLUE_VALUE EGL_DONT_CARE [0, 2EGL_BLUE_SIZE - 1]
EGL_MAX_PBUFFER_WIDTH   指定eglCreatePbufferSurface时最大的width.
EGL_MAX_PBUFFER_HEIGHT   指定eglCreatePbufferSurface时最大的height.
EGL_MAX_PBUFFER_PIXELS   指定eglCreatePbufferSurface时最大的pixels. 该值只是设定pbuffer余留的分配数量, 以免被其它pbuffer占用.
EGL_MAX_SWAP_INTERVAL EGL_DONT_CARE 指定eglSwapBuffers时interval的上限.
EGL_MIN_SWAP_INTERVAL EGL_DONT_CARE 指定eglSwapBuffers时interval的下限.
EGL_BIND_TO_TEXTURE_RGB EGL_DONT_CARE Boolean, 指定是否可以将EGLSurface绑定到纹理, 只要当EGLSurface是pbuffer时, 才能为EGL_TRUE, 因为只要pbuffer才能绑定到纹理.
EGL_BIND_TO_TEXTURE_RGBA EGL_DONT_CARE Boolean, 指定是否可以将EGLSurface绑定到纹理, 只要当EGLSurface是pbuffer时, 才能为EGL_TRUE, 因为只要pbuffer才能绑定到纹理.

 

EGLBoolean eglChooseConfig(EGLDisplay dpy, const EGLint* attrib_list, EGLConfig* configs,  EGLint config_size, EGLint* num_config);

a). 该函数返回符合指定属性要求的EGLConfig集合, 属性如上表. 指定attrib_list时只需要给出感兴趣的属性即可, 不需要全部列出.

参数:

dpy Initialized状态的EGLDisplay.
attrib_list 指定的属性.
configs 接收EGLConfig数组的首地址. 可以为NULL.
config_size EGLConfig数组的大小. 可以为0.
num_config 符合属性要求的EGLConfig的数量.

如果失败, 错误代码如下:

EGL_NOT_INITIALIZED dpy是Uninitialized的.
EGL_BAD_PARAMETER num_config是NULL.
EGL_BAD_ATTRIBUTE attrib_list不是EGLConfig的属性项, 或者属性值不对.

b). 当指定EGL_CONFIG_ID时, 其他属性全部被忽略, 只有这个ID的EGLConfig返回.

c). 当指定EGL_MAX_PBUFFER_WIDTH, EGL_MAX_PBUFFER_HEIGHT, EGL_MAX_PBUFFER_PIXELS, EGL_NATIVE_VISUAL_ID时, 这些属性直接被忽略掉.

d). 当指定EGL_SURFACE_TYPE不包含EGL_WINDOWS_BIT时, EGL_NATIVE_VISUAL_TYPE被忽略掉.

e). 当指定EGL_TRANSPRENT_TYPE为EGL_NONE时, EGL_TRANSPRENT_X_VALUE统统被忽略掉.

f). EGL_MATCH_NATIVE_PIXMAP是一个伪属性, 用它可以选择指定的Native的Pixmap. 使用时属性值就是Pixmap的Native句柄. 注意: 它是伪属性, 只能在这里用来查询.

g). 属性和属性值成对的组成列表, 最后以EGL_NONE标志终结.

h). 得到的EGLConfig一直有效, 直到相应的EGLDisplay被销毁为止.

 

EGLBoolean eglGetConfigAttrib(EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint* value);

a). 查询指定EGLConfig的属性值.

参数:

dpy Initialized状态的EGLDisplay.
config 要查询的EGLConfig.
attribute 上面列出的EGLConfig的属性.
value 属性值.

如果失败, 错误代码如下:

EGL_NOT_INITIALIZED dpy是Uninitialized的.
EGL_BAD_ATTRIBUTE attrib_list不是EGLConfig的属性项.

b). 不能查询EGL_MATCH_NATIVE_PIXMAP的属性值, 因为它是伪属性.

 

 

3. EGLSurface

EGLSurface是绘图的目标. EGLSurface有三种类型: Window, Pixmap, Pbuffer. Window类型和native的窗口绑定, 绘图结果直接显示在native的窗口中. Pixmap类型和native的Pixmap绑定, 绘图结果离屏不显示. 这两种的EGLSurface可以都混合Native API绘图和GL API绘图. Pbuffer类型则是由EGL自己负责, 和native无关, 也是离屏渲染.

 

EGLSurface eglCreateWindowSurface(EGLDisplay dpy, EGLConfig config, EGLNativeWindowType win, const EGLint* attrib_list);

a). 创造Window类型的EGLSurface.

参数:

dpy Initialized状态的EGLDisplay.
config 通过EGLConfig指定EGLSurface的属性.
win Native窗口的句柄.
attrib_list Native窗口的属性. 可以为NULL.

如果失败返回EGL_NO_SURFACE, 错误代码如下:

EGL_NOT_INITIALIZED dpy是Uninitialized的.
EGL_BAD_CONFIG config不是有效的EGLConfig.
EGL_BAD_NATIVE_WINDOW 窗口句柄不是有效的.
EGL_BAD_MATCH config不配套, 例如: config不含EGL_WINDOWS_BIT.
EGL_BAD_ALLOC 不能为EGLSurface分配资源, 例如重复在一个win上创建EGLSurface.

b). attrib_list的属性指的是Native窗口的属性, 和EGLConfig属性不是一个概念. 属性主要是EGL_RENDER_BUFFER(还有两个OpenVG的属性), 可用值为

EGL_SINGLE_BUFFER, EGL_BACK_BUFFER(默认值).

 

EGLSurface eglCreatePbufferSurface(EGLDisplay dpy, EGLConfig config, const EGLint* attrib_list);

a). 创建Pbuffer类型的EGLSurface.

参数:

dpy Initialized状态的EGLDisplay.
config 通过EGLConfig指定EGLSurface的属性.
attrib_list pbuffer属性. 可以为NULL.

如果失败返回EGL_NO_SURFACE, 错误代码如下:

EGL_NOT_INITIALIZED dpy是Uninitialized的.
EGL_BAD_CONFIG config不是有效的EGLConfig.
EGL_BAD_PARAMETER width, height参数为负.
EGL_BAD_ATTRIBUTE attrib_list开启了纹理, 但是config不支持OpenGL ES.
EGL_BAD_MATCH config不配套, 例如: config不含EGL_PBUFFER_BIT.
EGL_BAD_ALLOC 资源不够.

b). attrib_list是pbuffer的属性, 属性如下(省略OpenVG的属性):

属性 默认值 说明
EGL_WIDTH 0 指定pbuffer的像素宽.
EGL_HEIGHT 0 指定pbuffer的像素高.
EGL_LARGEST_PBUFFER EGL_FALSE 创建能够创建得最大的pbuffer, WIDTH和HEIGHT属性被忽略.
EGL_TEXTURE_FORMAT EGL_NO_TEXTURE [EGL_TEXTURE_RGB, EGL_TEXTURE_RGBA, EGL_NO_TEXTURE], 当pbuffer绑定到纹理时, 这个纹理的格式.
EGL_TEXTURE_TARGET EGL_NO_TEXTURE [EGL_TEXTURE_2D, EGL_NO_TEXTURE], 当pbuffer绑定到纹理时, 这个纹理的target.
EGL_MIPMAP_TEXTURE EGL_FALSE Boolean, 绑定到纹理时, 是否生成mipmap.

c). pbuffer与Native窗口毫无关系, 完全由EGL负责, 所以Native的绘图API不能操作pbuffer. 对于离屏渲染现在有更好的选择:FBO.

 

EGLSurface eglCreatePbufferFromClientBuffer(EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, EGLConfig config, const EGLint* attrib_list);

a). OpenVG用, 这里略过.

 

EGLSurface eglCreatePixmapSurface(EGLDisplay dpy, EGLConfig config, EGLNativePixmapType pixmap, const EGLint* attrib_list);

a). 创建Pixmap类型的EGLSurface.

参数:

dpy Initialized状态的EGLDisplay.
config 通过EGLConfig指定EGLSurface的属性.
pixmap Native Pixmap的句柄.
attrib_list Native Pixmap的属性. 可以为NULL.

如果失败返回EGL_NO_SURFACE, 错误代码如下:

EGL_NOT_INITIALIZED dpy是Uninitialized的.
EGL_BAD_CONFIG config不是有效的EGLConfig.
EGL_BAD_NATIVE_PIXMAP pixmap句柄不是有效的.
EGL_BAD_MATCH config不配套, 例如: config不含EGL_PIXMAP_BIT.
EGL_BAD_ALLOC 不能为EGLSurface分配资源, 例如重复在一个pixmap上创建EGLSurface.

b). 创建Pixmap类型的EGLSurface必须首先在平台上创建Native的Pixmap, 然后在EGLConfig中选择用伪属性EGL_MATCH_NATIVE_PIXMAP选择支持的EGLConfig. 最后用这个EGLConfig和Pixmap的句柄来创建EGLSurface.

c). attrib_list有两个OpenVG用的属性, 这里略过. 在使用OpenGL ES时, 直接为NULL

 

EGLBoolean eglDestroySurface(EGLDisplay dpy, EGLSurface surface);

a). 销毁EGLSurface, EGLSurface管理的资源会被标记为销毁状态, Native的资源不受影响. 效果和调用eglTerminate一样.

参数:

dpy Initialized状态的EGLDisplay.
surface EGLSurface句柄.

如果失败, 错误代码如下:

EGL_NOT_INITIALIZED dpy是Uninitialized的.
EGL_BAD_SURFACE surface不是有效的EGLSurface.

 

EGLBoolean eglSurfaceAttrib(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value);

a). 设置EGLSurface的属性.

参数:

dpy Initialized状态的EGLDisplay.
surface EGLSurface句柄.
attribute 需要设置的EGLSurface的属性.
value 属性值.

如果失败, 错误代码如下:

EGL_NOT_INITIALIZED dpy是Uninitialized的.
EGL_BAD_SURFACE surface不是有效的EGLSurface.
EGL_BAD_PARAMETER 在非OpenGL ES的Surface上, 指定MIPMAP_LEVEL属性.
EGL_BAD_MATCH EGLConfig没有支持时, 设置MULTISAMPLE_RESOLVE, SWAP_BEHAVIRO.

b). 可以设置的属性:

属性 默认值 说明
EGL_MIPMAP_LEVEL 0 Unsigned Integer. 只有是pbuffer类型的EGLSurface, 并且绑定了纹理才起作用.
EGL_MULTISAMPLE_RESOLVE EGL_MULTISAMPLE_RESOLVE_DEFAULT [EGL_MULTISAMPLE_RESOLVE_DEFAULT, EGL_MULTISAMPLE_RESOLVE_BOX], 设置多重取样的算法. 只有当EGLConfig支持时, 才有效.
EGL_SWAP_BEHAVIOR 不定 [EGL_BUFFER_PRESERVED, EGL_BUFFER_DESTROYED], 设置Swap Buffer后, 是否保留Front Buffer. 只有当EGLConfig支持时, 才有效.

 

EGLBoolean eglQuerySurface(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint* value);

a). 查询EGLSurface的属性.

参数:

dpy Initialized状态的EGLDisplay.
surface EGLSurface句柄.
attribute 需要查询的EGLSurface的属性.
value 返回的属性值.

如果失败, 错误代码如下:

EGL_NOT_INITIALIZED dpy是Uninitialized的.
EGL_BAD_SURFACE surface不是有效的EGLSurface.
EGL_BAD_ATTRIBUTE attribute不是EGLSurface的属性名.

b). 可以查询的属性表:

EGL_CONFIG_ID EGLConfig的ID.
EGL_WIDTH Surface的像素宽.
EGL_HEIGHT Surface的像素高.
EGL_HORIZONTAL_RESOLUTION 水平点距, 单位(pixels/meter * EGL_DISPLAY_SCALING(10000)). 只有Window Surface才有效, 其他情况下返回EGL_UNKNOWN.
EGL_VERTICAL_RESOLUTION 垂直点距, 单位(pixels/meter * EGL_DISPLAY_SCALING(10000)). 只有Window Surface才有效, 其他情况下返回EGL_UNKNOWN.
EGL_PIXEL_ASPECT_RATIO 一个像素的Width/Height * EGL_DISPLAY_SCALING. 大多数显示器的像素都是正方形, 所以这个值一般是EGL_DISPLAY_SCALING.
EGL_RENDER_BUFFER pbuffer是EGL_BACK_BUFFER, pixmap是EGL_SINGLE_BUFFER, window是根据设定返回的.
EGL_MULTISAMPLE_RESOLVE 返回设定的值.
EGL_SWAP_BEHAVIOR 返回设定的值.
EGL_TEXTURE_FORMAT 返回设定的值.
EGL_TEXTURE_TARGET 返回设定的值.
EGL_MIPMAP_TEXTURE 返回设定的值.
EGL_MIPMAP_LEVEL 返回设定的值.
EGL_LARGEST_PBUFFER 返回设定的值.
EGL_VG_ALPHA_FORMAT OpenVG用.
EGL_VG_COLORSPACE OpenVG用.

 

 

4. EGLContext

EGLContext也就是Rendering Context, 它维护着所有渲染状态, 并保证API调用按顺序执行. 一个EGLDisplay中可以有多个EGLContext, 但是一个线程只能绑定一个EGLContext, 一个EGLContext也不能同时绑定到多个线程. 但不同类型的EGLContext可以同时绑定到一个线程, 例如: 同时使用OpenGL ES和OpenVG.

 

EGLBoolean eglBindAPI(EGLenum api);

a). 为调用线程指定current rendering API.

参数:

api [EGL_OPENGL_API, EGL_OPENGL_ES_API, EGL_OPENVG_API].

如果失败, 错误代码如下:

EGL_BAD_PARAMETER api不是上面的类型.

b). 在有OpenGL ES的环境中, current rendering API的初始值是ELG_OPENGL_ES_API; 否则则是EGL_NONE.

c). 在调用eglCreateContext, eglGetCurrentContext, eglGetCurrentDisplay, eglGetCurrentSurface, elgMakeCurrent(以EGL_NO_CONTEXT为参数时), eglWaitClient, eglWaitNative前, 必须正确的设置current rendering API. 因为这些函数都隐式的依赖current rendering API.

 

EGLenum eglQueryAPI(void);

a). 查询current rendering API, 不多解释.

 

EGLContext eglCreateContext(EGLDisplay dpy, EGLConfig config, EGLContext share_context, const EGLint* attrib_list);

a). 根据current rendering API创建相应API类型的EGLContext.

参数:

dpy Initialized状态的EGLDisplay.
config 通过EGLConfig指定EGLContext的属性.
share_context 需要共享资源的另一个EGLContext. 没有时用GL_NONE作为参数.
attrib list 只有一个属性EGL_CONTEXT_CLIENT_VERSION, 指定API版本. 例如: 1是OpenGL ES 1.x; 2是OpenGL ES 2.x.

如果失败则返回EGL_NO_CONTEXT, 错误代码如下:

EGL_NOT_INITIALIZED dpy是Uninitialized的.
EGL_BAD_MATCH current rendering API是GL_NONE.
EGL_BAD_CONTEXT share_context不是有效的.
EGL_BAD_CONFIG config配置不合适, 例如, config指明是OPENGL_ES2_BIT, 但是current rendering API设置的确是OpenVG.
EGL_BAD_MATH 一般是share_context不匹配, 具体可以看Spec.
EGL_BAD_ALLOC 没有足够资源创建EGLContext.

 

EGLBoolean eglDestroyContext(EGLDisplay dpy, EGLContext ctx);

a). 销毁EGLContext, EGLContext管理的资源会被标记为销毁状态, 共享的资源不受影响. 效果和调用eglTerminate一样.

参数:

dpy Initialized状态的EGLDisplay.
ctx 要销毁的EGLContext.

如果失败, 错误代码如下:

EGL_NOT_INITIALIZED dpy是Uninitialized的.
EGL_BAD_CONTEXT ctx不是有效的.

 

EGLBoolean eglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx);

a). 将EGLContext绑定到调用线程上, 并且将EGLContext和EGLSurface绑定起来.

参数:

dpy Initialized状态的EGLDisplay.
draw 绘制的EGLSurface.
read 读的EGLSurface.
ctx 要绑定的EGLContext.

如果失败, 错误代码如下:

EGL_NOT_INITIALIZED dpy是Uninitialized的.
EGL_BAD_MATCH EGLSurface和EGLContext的配置不兼容.
EGL_BAD_ACCESS ctx已经绑定到其他线程上, 或者draw, read已经绑定到其他线程上等等. 参考Spec.
EGL_BAD_CONTEXT ctx不是有效的.
EGL_BAD_SURFACE draw, read不是有效的.
EGL_BAD_NATIVE_WINDOW Native窗口失效.
EGL_BAD_CURRENT_SURFACE 前一个EGLContext任务还没做完.
EGL_BAD_ALLOC draw, read的附属buffer无法分配空间.
EGL_CONTEXT_LOST  
EGL_BAD_DISPLAY dpy不是有效的.

b). EGL_NO_SURFACE作为draw和read参数, EGL_NO_CONTEXT作为ctx参数, 将解除绑定.

 

EGLContext eglGetCurrentContext(void);
EGLSurface eglGetCurrentSurface(EGLint readdraw);
EGLDisplay eglGetCurrentDisplay(void);

a). 以上API可以望文生义, 不多解释.

 

EGLBoolean eglQueryContext(EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint* value);

a). 查询EGLContext的属性.

参数:

dpy Initialized状态的EGLDisplay.
ctx 待查询的EGLContext.
attribute 要查询的属性名.
value 得到的属性值.

如果失败, 错误代码如下:

EGL_NOT_INITIALIZED dpy是Uninitialized的.
EGL_BAD_ATTRIBUTE attribute不是有效的.
EGL_BAD_CONTEXT ctx不是有效的.

b). 查询EGLContext的属性, 可查属性如下表:

EGL_CONFIG_ID EGLConfig的ID.
EGL_CONTEXT_CLIENT_TYPE current rendering API类型.
EGL_CONTEXT_CLIENT_VERSION API版本号.
EGL_RENDER_BUFFER [EGL_SINGLE_BUFFER, EGL_BACK_BUFFER, EGL_NONE].

 

 

5. 未完待续 ...

posted on 2012-11-07 13:38  bentonq  阅读(2252)  评论(0)    收藏  举报