1
2/*
3 * Copyright 2011 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#include "gl/SkNativeGLContext.h"
9
10SkNativeGLContext::AutoContextRestore::AutoContextRestore() {
11    fOldEGLContext = eglGetCurrentContext();
12    fOldDisplay = eglGetCurrentDisplay();
13    fOldSurface = eglGetCurrentSurface(EGL_DRAW);
14
15}
16
17SkNativeGLContext::AutoContextRestore::~AutoContextRestore() {
18    if (NULL != fOldDisplay) {
19        eglMakeCurrent(fOldDisplay, fOldSurface, fOldSurface, fOldEGLContext);
20    }
21}
22
23///////////////////////////////////////////////////////////////////////////////
24
25SkNativeGLContext::SkNativeGLContext()
26    : fContext(EGL_NO_CONTEXT)
27    , fDisplay(EGL_NO_DISPLAY)
28    , fSurface(EGL_NO_SURFACE) {
29}
30
31SkNativeGLContext::~SkNativeGLContext() {
32    this->destroyGLContext();
33}
34
35void SkNativeGLContext::destroyGLContext() {
36    if (fDisplay) {
37        eglMakeCurrent(fDisplay, 0, 0, 0);
38
39        if (fContext) {
40            eglDestroyContext(fDisplay, fContext);
41            fContext = EGL_NO_CONTEXT;
42        }
43
44        if (fSurface) {
45            eglDestroySurface(fDisplay, fSurface);
46            fSurface = EGL_NO_SURFACE;
47        }
48
49        //TODO should we close the display?
50        fDisplay = EGL_NO_DISPLAY;
51    }
52}
53
54const GrGLInterface* SkNativeGLContext::createGLContext() {
55    fDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
56
57    EGLint majorVersion;
58    EGLint minorVersion;
59    eglInitialize(fDisplay, &majorVersion, &minorVersion);
60
61    EGLint numConfigs;
62    static const EGLint configAttribs[] = {
63        EGL_SURFACE_TYPE, EGL_PBUFFER_BIT,
64        EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
65        EGL_RED_SIZE, 8,
66        EGL_GREEN_SIZE, 8,
67        EGL_BLUE_SIZE, 8,
68        EGL_ALPHA_SIZE, 8,
69        EGL_NONE
70    };
71
72    EGLConfig surfaceConfig;
73    eglChooseConfig(fDisplay, configAttribs, &surfaceConfig, 1, &numConfigs);
74
75    static const EGLint contextAttribs[] = {
76        EGL_CONTEXT_CLIENT_VERSION, 2,
77        EGL_NONE
78    };
79    fContext = eglCreateContext(fDisplay, surfaceConfig, NULL, contextAttribs);
80
81
82    static const EGLint surfaceAttribs[] = {
83            EGL_WIDTH, 1,
84            EGL_HEIGHT, 1,
85            EGL_NONE
86        };
87    fSurface = eglCreatePbufferSurface(fDisplay, surfaceConfig, surfaceAttribs);
88
89    eglMakeCurrent(fDisplay, fSurface, fSurface, fContext);
90
91    const GrGLInterface* interface = GrGLCreateNativeInterface();
92    if (!interface) {
93        SkDebugf("Failed to create gl interface");
94        this->destroyGLContext();
95        return NULL;
96    }
97    return interface;
98}
99
100void SkNativeGLContext::makeCurrent() const {
101    if (!eglMakeCurrent(fDisplay, fSurface, fSurface, fContext)) {
102        SkDebugf("Could not set the context.\n");
103    }
104}
105