|
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 (NULL != 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() { |
|
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 |
|
103 void SkANGLEGLContext::makeCurrent() const { |
|
104 if (!eglMakeCurrent(fDisplay, fSurface, fSurface, fContext)) { |
|
105 SkDebugf("Could not set the context.\n"); |
|
106 } |
|
107 } |
|
108 |
|
109 void SkANGLEGLContext::swapBuffers() const { |
|
110 if (!eglSwapBuffers(fDisplay, fSurface)) { |
|
111 SkDebugf("Could not complete eglSwapBuffers.\n"); |
|
112 } |
|
113 } |