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]. |
浙公网安备 33010602011771号