Opengl与窗口系统对应的设配层
EGL是由Khronos Group提供的一组平台无关的API,它的主要功能如下:
1. 和本地窗口系统(native windowing system)通讯;
2. 查询可用的配置;
3. 创建OpenGL ES可用的“绘图表面”(drawing surface);
4. 同步不同类别的API之间的渲染,比如在OpenGL ES和OpenVG之间同步,或者在OpenGL和本地窗口的绘图命令之间;
5. 管理“渲染资源”,比如纹理映射(rendering map)
①EGLDisplay与原生窗口的链接:
EGL可运行于GNU/Linux的X Window System,Microsoft Windows和MacOS X的Quartz。
EGL把这些平台的显示系统抽象为一个独立的类型:EGLDisplay。
EGLDisplay eglGetDisplay(EGLNativeDisplayType id);
EGLBoolean eglInitialize(EGLDisplay display, EGLint* majorVersion, EGLint* minorVersion);
EGLint eglGetError();
②EGLConfig 初始化过后,要选择一个合适的“绘图表面”。
EGLBoolean eglChooseConfig(EGLDisplay display,
const EGLint* attribs, // 你想要的属性事先定义到这个数组里
EGLConfig* configs, // 图形系统将返回若干满足条件的配置到该数组
EGLint maxConfigs, // 上面数组的容量
EGLint* numConfigs); // 图形系统返回的可用的配置个数
③Surface创建和Surface配置(窗口和屏幕上的渲染区域)
EGLSurface eglCreateWindowSurface(EGLDisplay display,
EGLConfig config,
EGLNativeWindowType window, // 在Windows上就是HWND类型
const EGLint* attribs); // 此属性表非彼属性表
④EGLContext 创建渲染环境
-渲染环境指OpenGL ES的所有项目运行需要的数据结构,如顶点、片元着色器,顶点数据矩阵
EGLContext eglCreateContext(EGLDisplay display,
EGLConfig config,
EGLContext context, // EGL_NO_CONTEXT表示不向其它的context共享资源
const EGLint * attribs)// 我们暂时只用EGL_CONTEXT_CLIENT_VERSION
eglMakeCurrent(display, window, window, context) // 两个window表示读写都在一个窗口
virtual bool Init(void *win) {
Close();
ANativeWindow *nativeWindow = (ANativeWindow *) win;
//初始化EGL
//①获取EGLDisplay对象 显示设备
mux.lock();
this->eglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
if (eglDisplay == EGL_NO_DISPLAY) {
XLOGE("eglGetDisplay failed!");
mux.unlock();
return false;
}
//②初始化disPlay
if (EGL_TRUE != eglInitialize(eglDisplay, 0, 0)) {
XLOGE("eglInitialize failed!");
mux.unlock();
return false;
}
//③获取配置并创建surface
EGLint configSpec[] = {
EGL_RED_SIZE, 8,
EGL_GREEN_SIZE, 8,
EGL_BLUE_SIZE, 8,
EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
EGL_NONE
};
EGLConfig config = 0;
EGLint numConfigs = 0;
if (EGL_TRUE != eglChooseConfig(eglDisplay, configSpec, &config, 1, &numConfigs)) {
XLOGE("eglChooseConfig failed!");
mux.unlock();
return false;
}
//创建surface
eglSurface = eglCreateWindowSurface(eglDisplay, config, nativeWindow, NULL);
if (eglSurface == EGL_NO_SURFACE) {
XLOGE("eglCreateWindowSurface failed!");
mux.unlock();
return false;
}
//④创建并打开上下文
const EGLint ctxAttr[] = {EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE};
eglContext = eglCreateContext(eglDisplay, config, EGL_NO_CONTEXT, ctxAttr);
if (eglContext == EGL_NO_CONTEXT) {
XLOGE("eglCreateContext failed!");
mux.unlock();
return false;
}
//上下文切换
if (EGL_TRUE != eglMakeCurrent(eglDisplay, eglSurface, eglSurface, eglContext)) {
XLOGE("eglMakeCurrent faliled!");
mux.unlock();
return false;
}
XLOGE("ANativeWindow init success!");
mux.unlock();
return true;
}
};