blob: f21eed866610dbacfc03165e96cdfdef18679a7c [file] [log] [blame]
djsollen@google.com58629292011-11-03 13:08:29 +00001
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 */
tomhudson@google.com6c8c34e2012-02-14 15:31:03 +00008#include "gl/SkNativeGLContext.h"
djsollen@google.com58629292011-11-03 13:08:29 +00009
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
rmistry@google.comfbfcd562012-08-23 18:09:54 +000025SkNativeGLContext::SkNativeGLContext()
djsollen@google.com58629292011-11-03 13:08:29 +000026 : 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}