bool GLEnv::InitWithNewContext() { if (IsInitialized()) { LOGE("GLEnv: Attempting to reinitialize environment!"); return false; } display_ = eglGetDisplay(EGL_DEFAULT_DISPLAY); if (CheckEGLError("eglGetDisplay")) return false; EGLint majorVersion; EGLint minorVersion; eglInitialize(display(), &majorVersion, &minorVersion); if (CheckEGLError("eglInitialize")) return false; initialized_ = true; // Configure context/surface EGLConfig config; EGLint numConfigs = -1; // TODO(renn): Do we need the window bit here? // TODO: Currently choosing the config that includes all // This is not needed if the encoding is not being used EGLint configAttribs[] = { EGL_SURFACE_TYPE, EGL_WINDOW_BIT, EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, EGL_RED_SIZE, 8, EGL_GREEN_SIZE, 8, EGL_BLUE_SIZE, 8, EGL_RECORDABLE_ANDROID, EGL_TRUE, EGL_NONE }; eglChooseConfig(display(), configAttribs, &config, 1, &numConfigs); if (numConfigs < 1) { LOGE("GLEnv::Init: No suitable EGL configuration found!"); return false; } // Create dummy surface using a SurfaceTexture sp<SurfaceTexture> st = new SurfaceTexture(0, false); window_ = new SurfaceTextureClient(st); surfaces_[0] = SurfaceWindowPair(eglCreateWindowSurface(display(), config, window_.get(), NULL), NULL); if (CheckEGLError("eglCreateWindowSurface")) return false; // Create context EGLint context_attribs[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE }; contexts_[0] = eglCreateContext(display(), config, EGL_NO_CONTEXT, context_attribs); if (CheckEGLError("eglCreateContext")) return false; created_context_ = created_surface_ = true; return true; }
GLEnv::~GLEnv() { // Destroy surfaces for (std::map<int, SurfaceWindowPair>::iterator it = surfaces_.begin(); it != surfaces_.end(); ++it) { if (it->first != 0 || created_surface_) { eglDestroySurface(display(), it->second.first); if (it->second.second) { it->second.second->Destroy(); delete it->second.second; } } } // Destroy contexts for (std::map<int, EGLContext>::iterator it = contexts_.begin(); it != contexts_.end(); ++it) { if (it->first != 0 || created_context_) eglDestroyContext(display(), it->second); } // Destroy attached shaders and frames STLDeleteValues(&attached_shaders_); STLDeleteValues(&attached_vframes_); // Destroy display if (initialized_) eglTerminate(display()); // Log error if this did not work if (CheckEGLError("TearDown!")) ALOGE("GLEnv: Error tearing down GL Environment!"); }
bool GLEnv::Deactivate() { eglMakeCurrent(display(), EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); return !CheckEGLError("eglMakeCurrent"); }
bool GLEnv::SwapBuffers() { const bool result = eglSwapBuffers(display(), surface()) == EGL_TRUE; return !CheckEGLError("eglSwapBuffers") && result; }