• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
AutoContextRestore()11 SkANGLEGLContext::AutoContextRestore::AutoContextRestore() {
12     fOldEGLContext = eglGetCurrentContext();
13     fOldDisplay = eglGetCurrentDisplay();
14     fOldSurface = eglGetCurrentSurface(EGL_DRAW);
15 
16 }
17 
~AutoContextRestore()18 SkANGLEGLContext::AutoContextRestore::~AutoContextRestore() {
19     if (NULL != fOldDisplay) {
20         eglMakeCurrent(fOldDisplay, fOldSurface, fOldSurface, fOldEGLContext);
21     }
22 }
23 
24 ///////////////////////////////////////////////////////////////////////////////
25 
SkANGLEGLContext()26 SkANGLEGLContext::SkANGLEGLContext()
27     : fContext(EGL_NO_CONTEXT)
28     , fDisplay(EGL_NO_DISPLAY)
29     , fSurface(EGL_NO_SURFACE) {
30 }
31 
~SkANGLEGLContext()32 SkANGLEGLContext::~SkANGLEGLContext() {
33     this->destroyGLContext();
34 }
35 
destroyGLContext()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 
createGLContext()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 
makeCurrent() const103 void SkANGLEGLContext::makeCurrent() const {
104     if (!eglMakeCurrent(fDisplay, fSurface, fSurface, fContext)) {
105         SkDebugf("Could not set the context.\n");
106     }
107 }
108 
swapBuffers() const109 void SkANGLEGLContext::swapBuffers() const {
110     if (!eglSwapBuffers(fDisplay, fSurface)) {
111         SkDebugf("Could not complete eglSwapBuffers.\n");
112     }
113 }
114