| /* | |
| * Copyright 2012 Google Inc. | |
| * | |
| * Use of this source code is governed by a BSD-style license that can be | |
| * found in the LICENSE file. | |
| */ | |
| #include "gl/angle/SkANGLEGLContext.h" | |
| SkANGLEGLContext::SkANGLEGLContext() | |
| : fContext(EGL_NO_CONTEXT) | |
| , fDisplay(EGL_NO_DISPLAY) | |
| , fSurface(EGL_NO_SURFACE) { | |
| fDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY); | |
| EGLint majorVersion; | |
| EGLint minorVersion; | |
| eglInitialize(fDisplay, &majorVersion, &minorVersion); | |
| EGLint numConfigs; | |
| static const EGLint configAttribs[] = { | |
| EGL_SURFACE_TYPE, EGL_PBUFFER_BIT, | |
| EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, | |
| EGL_RED_SIZE, 8, | |
| EGL_GREEN_SIZE, 8, | |
| EGL_BLUE_SIZE, 8, | |
| EGL_ALPHA_SIZE, 8, | |
| EGL_NONE | |
| }; | |
| EGLConfig surfaceConfig; | |
| eglChooseConfig(fDisplay, configAttribs, &surfaceConfig, 1, &numConfigs); | |
| static const EGLint contextAttribs[] = { | |
| EGL_CONTEXT_CLIENT_VERSION, 2, | |
| EGL_NONE | |
| }; | |
| fContext = eglCreateContext(fDisplay, surfaceConfig, NULL, contextAttribs); | |
| static const EGLint surfaceAttribs[] = { | |
| EGL_WIDTH, 1, | |
| EGL_HEIGHT, 1, | |
| EGL_NONE | |
| }; | |
| fSurface = eglCreatePbufferSurface(fDisplay, surfaceConfig, surfaceAttribs); | |
| eglMakeCurrent(fDisplay, fSurface, fSurface, fContext); | |
| fGL.reset(GrGLCreateANGLEInterface()); | |
| if (NULL == fGL.get()) { | |
| SkDebugf("Could not create ANGLE GL interface!\n"); | |
| this->destroyGLContext(); | |
| return; | |
| } | |
| if (!fGL->validate()) { | |
| SkDebugf("Could not validate ANGLE GL interface!\n"); | |
| this->destroyGLContext(); | |
| return; | |
| } | |
| } | |
| SkANGLEGLContext::~SkANGLEGLContext() { | |
| this->destroyGLContext(); | |
| } | |
| void SkANGLEGLContext::destroyGLContext() { | |
| fGL.reset(NULL); | |
| if (fDisplay) { | |
| eglMakeCurrent(fDisplay, 0, 0, 0); | |
| if (fContext) { | |
| eglDestroyContext(fDisplay, fContext); | |
| fContext = EGL_NO_CONTEXT; | |
| } | |
| if (fSurface) { | |
| eglDestroySurface(fDisplay, fSurface); | |
| fSurface = EGL_NO_SURFACE; | |
| } | |
| //TODO should we close the display? | |
| fDisplay = EGL_NO_DISPLAY; | |
| } | |
| } | |
| void SkANGLEGLContext::makeCurrent() const { | |
| if (!eglMakeCurrent(fDisplay, fSurface, fSurface, fContext)) { | |
| SkDebugf("Could not set the context.\n"); | |
| } | |
| } | |
| void SkANGLEGLContext::swapBuffers() const { | |
| if (!eglSwapBuffers(fDisplay, fSurface)) { | |
| SkDebugf("Could not complete eglSwapBuffers.\n"); | |
| } | |
| } |