1 2/* 3 * Copyright 2011 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#include "gl/SkNativeGLContext.h" 9 10SkNativeGLContext::AutoContextRestore::AutoContextRestore() { 11 fOldEGLContext = eglGetCurrentContext(); 12 fOldDisplay = eglGetCurrentDisplay(); 13 fOldSurface = eglGetCurrentSurface(EGL_DRAW); 14 15} 16 17SkNativeGLContext::AutoContextRestore::~AutoContextRestore() { 18 if (NULL != fOldDisplay) { 19 eglMakeCurrent(fOldDisplay, fOldSurface, fOldSurface, fOldEGLContext); 20 } 21} 22 23/////////////////////////////////////////////////////////////////////////////// 24 25SkNativeGLContext::SkNativeGLContext() 26 : fContext(EGL_NO_CONTEXT) 27 , fDisplay(EGL_NO_DISPLAY) 28 , fSurface(EGL_NO_SURFACE) { 29} 30 31SkNativeGLContext::~SkNativeGLContext() { 32 this->destroyGLContext(); 33} 34 35void SkNativeGLContext::destroyGLContext() { 36 if (fDisplay) { 37 eglMakeCurrent(fDisplay, 0, 0, 0); 38 39 if (fContext) { 40 eglDestroyContext(fDisplay, fContext); 41 fContext = EGL_NO_CONTEXT; 42 } 43 44 if (fSurface) { 45 eglDestroySurface(fDisplay, fSurface); 46 fSurface = EGL_NO_SURFACE; 47 } 48 49 //TODO should we close the display? 50 fDisplay = EGL_NO_DISPLAY; 51 } 52} 53 54const GrGLInterface* SkNativeGLContext::createGLContext() { 55 fDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY); 56 57 EGLint majorVersion; 58 EGLint minorVersion; 59 eglInitialize(fDisplay, &majorVersion, &minorVersion); 60 61 EGLint numConfigs; 62 static const EGLint configAttribs[] = { 63 EGL_SURFACE_TYPE, EGL_PBUFFER_BIT, 64 EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, 65 EGL_RED_SIZE, 8, 66 EGL_GREEN_SIZE, 8, 67 EGL_BLUE_SIZE, 8, 68 EGL_ALPHA_SIZE, 8, 69 EGL_NONE 70 }; 71 72 EGLConfig surfaceConfig; 73 eglChooseConfig(fDisplay, configAttribs, &surfaceConfig, 1, &numConfigs); 74 75 static const EGLint contextAttribs[] = { 76 EGL_CONTEXT_CLIENT_VERSION, 2, 77 EGL_NONE 78 }; 79 fContext = eglCreateContext(fDisplay, surfaceConfig, NULL, contextAttribs); 80 81 82 static const EGLint surfaceAttribs[] = { 83 EGL_WIDTH, 1, 84 EGL_HEIGHT, 1, 85 EGL_NONE 86 }; 87 fSurface = eglCreatePbufferSurface(fDisplay, surfaceConfig, surfaceAttribs); 88 89 eglMakeCurrent(fDisplay, fSurface, fSurface, fContext); 90 91 const GrGLInterface* interface = GrGLCreateNativeInterface(); 92 if (!interface) { 93 SkDebugf("Failed to create gl interface"); 94 this->destroyGLContext(); 95 return NULL; 96 } 97 return interface; 98} 99 100void SkNativeGLContext::makeCurrent() const { 101 if (!eglMakeCurrent(fDisplay, fSurface, fSurface, fContext)) { 102 SkDebugf("Could not set the context.\n"); 103 } 104} 105