| |
| /* |
| * Copyright 2011 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| #include "gl/SkNativeGLContext.h" |
| |
| SkNativeGLContext::AutoContextRestore::AutoContextRestore() { |
| fOldEGLContext = eglGetCurrentContext(); |
| fOldDisplay = eglGetCurrentDisplay(); |
| fOldSurface = eglGetCurrentSurface(EGL_DRAW); |
| |
| } |
| |
| SkNativeGLContext::AutoContextRestore::~AutoContextRestore() { |
| if (NULL != fOldDisplay) { |
| eglMakeCurrent(fOldDisplay, fOldSurface, fOldSurface, fOldEGLContext); |
| } |
| } |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| |
| SkNativeGLContext::SkNativeGLContext() |
| : fContext(EGL_NO_CONTEXT) |
| , fDisplay(EGL_NO_DISPLAY) |
| , fSurface(EGL_NO_SURFACE) { |
| } |
| |
| SkNativeGLContext::~SkNativeGLContext() { |
| this->destroyGLContext(); |
| } |
| |
| void SkNativeGLContext::destroyGLContext() { |
| 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; |
| } |
| } |
| |
| const GrGLInterface* SkNativeGLContext::createGLContext() { |
| 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); |
| |
| const GrGLInterface* interface = GrGLCreateNativeInterface(); |
| if (!interface) { |
| SkDebugf("Failed to create gl interface"); |
| this->destroyGLContext(); |
| return NULL; |
| } |
| return interface; |
| } |
| |
| void SkNativeGLContext::makeCurrent() const { |
| if (!eglMakeCurrent(fDisplay, fSurface, fSurface, fContext)) { |
| SkDebugf("Could not set the context.\n"); |
| } |
| } |