EGL™是Khronos呈现api(如OpenGL ES或OpenVG)与底层本机平台窗口系统之间的接口。它处理图形上下文管理、表面/缓冲区绑定和呈现同步,并使用其他Khronos api支持高性能、加速、混合模式的2D和3D呈现。EGL还提供了Khronos之间的互操作能力,以支持在api之间高效地传输数据——例如在运行OpenMAX AL的视频子系统和运行OpenGL ES的GPU之间。
通俗来讲就是,EGL是渲染API(如OpenGL, OpenGL ES, OpenVG)和本地窗口系统之间的接口。EGL可以理解为OpenGl ES ES和设备之间的桥梁,EGL是为OpenGl提供绘制表面的。因为OpenGl是跨平台的,当它访问不同平台的设备的时候需要EGL作为中间的适配器。
先update一个小demo后面再解析,代码的链接如下。
1、初始化egl : (代码实现如 testopenglegl.cpp) https://download.csdn.net/download/jmmingming/89208269
1) 获取EGLDisplay对象 显示设备
2)初始化Display
3)获取配置并创建surface
4)创建并打开EGL上下文
具体操作如下:
std::int16_t Testdisplayer(const char * url, void * windows)
{
ALOGD("Testdisplayer: url = %s ", url);
FILE *fp = fopen(url, "rb");
if (!fp) {
ALOGE("open file %s failed !!", url);
return false;
}
ANativeWindow * nwin = (ANativeWindow *) windows;
// ========EGL=======
//1、egl display 创建和初始化
display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
if (display == EGL_NO_DISPLAY) {
ALOGE("eglGetDisplay failed !!");
return false;
}
if (EGL_TRUE != eglInitialize(display, 0, 0)) {
ALOGE("eglInitialize failed !!");
return false;
}
// 2 配置surface
EGLConfig config;
EGLint configNum;
EGLint configSpec[] = {
EGL_RED_SIZE, 8,
EGL_GREEN_SIZE, 8,
EGL_BLUE_SIZE, 8,
EGL_SURFACE_TYPE, EGL_WINDOW_BIT, EGL_NONE
};
if(EGL_TRUE != eglChooseConfig(display,configSpec,&config,1,&configNum))
{
ALOGE("eglChooseConfig failed!");
return false;
}
winsurface = eglCreateWindowSurface(display,config,nwin,0);
if (winsurface == EGL_NO_SURFACE) {
ALOGE("eglCreateWindowSurface test failed !!");
return false;
}
//3 context 创建关联的上下文
const EGLint ctxAttr[] = {
EGL_CONTEXT_CLIENT_VERSION,2,EGL_NONE
};
EGLContext context = eglCreateContext(display,config,EGL_NO_CONTEXT,ctxAttr);
if (context == EGL_NO_CONTEXT) {
ALOGE("eglCreateContext failed !!");
return false;
}
if (EGL_TRUE != eglMakeCurrent(display, winsurface, winsurface, context)) {
ALOGE("eglMakeCurrent fail");
return false;
}
ALOGE("EGL Init Success!");
// &