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