Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / third_party / skia / src / gpu / gl / angle / SkANGLEGLContext.cpp
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 }