EGL
通过Surface对象创建一个EGLSurface,将其连接到Surface的BufferQueue上,EGLSurface将会作为一个生产方,会将OpenGL-ES生产的缓冲区加入到该BufferQueue中,然后由该Surface的消费方进行处理。
Surface是一个生产方,EGLSurface也是一个独立的生产方。
一个Surface一次只能和一个EGLSurface进行连接,可以通过断开,然后重新连接另一个EGLSurface。
eglGetDisplay
1 2 3 4 5 6
|
if ((display = eglGetDisplay(EGL_DEFAULT_DISPLAY)) == EGL_NO_DISPLAY) { LOGE("witgao", "eglGetDisplay"); return; }
|
eglInitialize
1 2 3 4 5 6 7
| EGLint major, minor; if (!eglInitialize(display, &major, &minor) || major == NULL || minor == NULL) { LOGE("witgao", "eglInitialize"); return; }
|
eglChooseConfig
surface类型有三种,window_surface、pbuffer_surface、pixmap_surface,只有window_surface和window有关联,可以在window上显示。
绘制模式有两种,back buffer、single buffer,window_surface使用的是back buffer,back buffer是一块GPU中的buffer,可以通过EGL显示在屏幕上;而single buffer 是保存在内存中的位图,不支持显示在屏幕上。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| const EGLint attribs[] = { EGL_SURFACE_TYPE, EGL_WINDOW_BIT, EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, EGL_BLUE_SIZE, 8, EGL_GREEN_SIZE, 8, EGL_RED_SIZE, 8, EGL_NONE }; EGLConfig config; EGLint numConfigs;
if (!eglChooseConfig(display, attribs, &config, 1, &numConfigs)) { LOGE("witgao", "eglChooseConfig"); return; }
|
eglCreateWindowSurface
1 2 3 4 5 6 7 8 9
| if (!(eglSurface = eglCreateWindowSurface(display, config, aNativeWindow, 0))) { LOGE("witgao", "eglCreateWindowSurface"); return; }
ANativeWindow *pNativeWindow = ANativeWindow_fromSurface(jenv, surface);
|
eglCreateContext
1 2 3 4 5 6 7 8 9 10 11 12
| const EGLint context_attribs[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE };
if (!(context = eglCreateContext(display, config, 0, context_attribs))) { LOGE("witgao", "eglCreateContext"); return; }
|
eglMakeCurrent
1 2 3 4 5 6 7 8 9
|
if (!eglMakeCurrent(display, eglSurface, eglSurface, context)) { LOGE("witgao", "eglMakeCurrent"); return; }
|
eglSwapBuffers
1 2 3 4 5
| if (!eglSwapBuffers(display, eglSurface)) { LOGE("witgao", "eglSwapBuffers"); return; }
|