Home | History | Annotate | Download | only in angle
      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 (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(GrGLStandard forcedGpuAPI) {
     56     if (kGL_GrGLStandard == forcedGpuAPI) {
     57         return NULL;
     58     }
     59 
     60     fDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
     61 
     62     EGLint majorVersion;
     63     EGLint minorVersion;
     64     eglInitialize(fDisplay, &majorVersion, &minorVersion);
     65 
     66     EGLint numConfigs;
     67     static const EGLint configAttribs[] = {
     68         EGL_SURFACE_TYPE, EGL_PBUFFER_BIT,
     69         EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
     70         EGL_RED_SIZE, 8,
     71         EGL_GREEN_SIZE, 8,
     72         EGL_BLUE_SIZE, 8,
     73         EGL_ALPHA_SIZE, 8,
     74         EGL_NONE
     75     };
     76 
     77     EGLConfig surfaceConfig;
     78     eglChooseConfig(fDisplay, configAttribs, &surfaceConfig, 1, &numConfigs);
     79 
     80     static const EGLint contextAttribs[] = {
     81         EGL_CONTEXT_CLIENT_VERSION, 2,
     82         EGL_NONE
     83     };
     84     fContext = eglCreateContext(fDisplay, surfaceConfig, NULL, contextAttribs);
     85 
     86 
     87     static const EGLint surfaceAttribs[] = {
     88             EGL_WIDTH, 1,
     89             EGL_HEIGHT, 1,
     90             EGL_NONE
     91         };
     92     fSurface = eglCreatePbufferSurface(fDisplay, surfaceConfig, surfaceAttribs);
     93 
     94     eglMakeCurrent(fDisplay, fSurface, fSurface, fContext);
     95 
     96     const GrGLInterface* interface = GrGLCreateANGLEInterface();
     97     if (NULL == interface) {
     98         SkDebugf("Could not create ANGLE GL interface!\n");
     99         this->destroyGLContext();
    100         return NULL;
    101     }
    102 
    103     return interface;
    104 }
    105 
    106 void SkANGLEGLContext::makeCurrent() const {
    107     if (!eglMakeCurrent(fDisplay, fSurface, fSurface, fContext)) {
    108         SkDebugf("Could not set the context.\n");
    109     }
    110 }
    111 
    112 void SkANGLEGLContext::swapBuffers() const {
    113     if (!eglSwapBuffers(fDisplay, fSurface)) {
    114         SkDebugf("Could not complete eglSwapBuffers.\n");
    115     }
    116 }
    117