1 2 /* 3 * Copyright 2012 Google Inc. 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8 9 #include "gl/SkANGLEGLContext.h" 10 11 SkANGLEGLContext::AutoContextRestore::AutoContextRestore() { 12 fOldEGLContext = eglGetCurrentContext(); 13 fOldDisplay = eglGetCurrentDisplay(); 14 fOldSurface = eglGetCurrentSurface(EGL_DRAW); 15 16 } 17 18 SkANGLEGLContext::AutoContextRestore::~AutoContextRestore() { 19 if (NULL != fOldDisplay) { 20 eglMakeCurrent(fOldDisplay, fOldSurface, fOldSurface, fOldEGLContext); 21 } 22 } 23 24 /////////////////////////////////////////////////////////////////////////////// 25 26 SkANGLEGLContext::SkANGLEGLContext() 27 : fContext(EGL_NO_CONTEXT) 28 , fDisplay(EGL_NO_DISPLAY) 29 , fSurface(EGL_NO_SURFACE) { 30 } 31 32 SkANGLEGLContext::~SkANGLEGLContext() { 33 this->destroyGLContext(); 34 } 35 36 void SkANGLEGLContext::destroyGLContext() { 37 if (fDisplay) { 38 eglMakeCurrent(fDisplay, 0, 0, 0); 39 40 if (fContext) { 41 eglDestroyContext(fDisplay, fContext); 42 fContext = EGL_NO_CONTEXT; 43 } 44 45 if (fSurface) { 46 eglDestroySurface(fDisplay, fSurface); 47 fSurface = EGL_NO_SURFACE; 48 } 49 50 //TODO should we close the display? 51 fDisplay = EGL_NO_DISPLAY; 52 } 53 } 54 55 const GrGLInterface* SkANGLEGLContext::createGLContext() { 56 57 fDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY); 58 59 EGLint majorVersion; 60 EGLint minorVersion; 61 eglInitialize(fDisplay, &majorVersion, &minorVersion); 62 63 EGLint numConfigs; 64 static const EGLint configAttribs[] = { 65 EGL_SURFACE_TYPE, EGL_PBUFFER_BIT, 66 EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, 67 EGL_RED_SIZE, 8, 68 EGL_GREEN_SIZE, 8, 69 EGL_BLUE_SIZE, 8, 70 EGL_ALPHA_SIZE, 8, 71 EGL_NONE 72 }; 73 74 EGLConfig surfaceConfig; 75 eglChooseConfig(fDisplay, configAttribs, &surfaceConfig, 1, &numConfigs); 76 77 static const EGLint contextAttribs[] = { 78 EGL_CONTEXT_CLIENT_VERSION, 2, 79 EGL_NONE 80 }; 81 fContext = eglCreateContext(fDisplay, surfaceConfig, NULL, contextAttribs); 82 83 84 static const EGLint surfaceAttribs[] = { 85 EGL_WIDTH, 1, 86 EGL_HEIGHT, 1, 87 EGL_NONE 88 }; 89 fSurface = eglCreatePbufferSurface(fDisplay, surfaceConfig, surfaceAttribs); 90 91 eglMakeCurrent(fDisplay, fSurface, fSurface, fContext); 92 93 const GrGLInterface* interface = GrGLCreateANGLEInterface(); 94 if (NULL == interface) { 95 SkDebugf("Could not create ANGLE GL interface!\n"); 96 this->destroyGLContext(); 97 return NULL; 98 } 99 100 return interface; 101 } 102 103 void SkANGLEGLContext::makeCurrent() const { 104 if (!eglMakeCurrent(fDisplay, fSurface, fSurface, fContext)) { 105 SkDebugf("Could not set the context.\n"); 106 } 107 } 108 109 void SkANGLEGLContext::swapBuffers() const { 110 if (!eglSwapBuffers(fDisplay, fSurface)) { 111 SkDebugf("Could not complete eglSwapBuffers.\n"); 112 } 113 } 114