Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(216)

Side by Side Diff: src/gpu/gl/egl/SkCreatePlatformGLContext_egl.cpp

Issue 640283004: Refactor SkGLContext to be actually extendable (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: win compile fix. Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/gpu/gl/debug/SkDebugGLContext.cpp ('k') | src/gpu/gl/glx/SkCreatePlatformGLContext_glx.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 1
2 /* 2 /*
3 * Copyright 2011 Google Inc. 3 * Copyright 2011 Google Inc.
4 * 4 *
5 * Use of this source code is governed by a BSD-style license that can be 5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file. 6 * found in the LICENSE file.
7 */ 7 */
8 #include "gl/SkGLContext.h" 8 #include "gl/SkGLContext.h"
9 9
10 #include <GLES2/gl2.h> 10 #include <GLES2/gl2.h>
11 #include <EGL/egl.h> 11 #include <EGL/egl.h>
12 12
13 namespace { 13 namespace {
14 14
15 class EGLGLContext : public SkGLContext { 15 class EGLGLContext : public SkGLContext {
16 public: 16 public:
17 EGLGLContext(); 17 EGLGLContext(GrGLStandard forcedGpuAPI);
18 18 virtual ~EGLGLContext() SK_OVERRIDE;
19 virtual ~EGLGLContext();
20
21 virtual void makeCurrent() const SK_OVERRIDE; 19 virtual void makeCurrent() const SK_OVERRIDE;
22 virtual void swapBuffers() const SK_OVERRIDE; 20 virtual void swapBuffers() const SK_OVERRIDE;
23 protected:
24 virtual const GrGLInterface* createGLContext(GrGLStandard forcedGpuAPI) SK_O VERRIDE;
25 virtual void destroyGLContext() SK_OVERRIDE;
26 21
27 private: 22 private:
23 void destroyGLContext();
24
28 EGLContext fContext; 25 EGLContext fContext;
29 EGLDisplay fDisplay; 26 EGLDisplay fDisplay;
30 EGLSurface fSurface; 27 EGLSurface fSurface;
31 }; 28 };
32 29
33 EGLGLContext::EGLGLContext() 30 EGLGLContext::EGLGLContext(GrGLStandard forcedGpuAPI)
34 : fContext(EGL_NO_CONTEXT) 31 : fContext(EGL_NO_CONTEXT)
35 , fDisplay(EGL_NO_DISPLAY) 32 , fDisplay(EGL_NO_DISPLAY)
36 , fSurface(EGL_NO_SURFACE) { 33 , fSurface(EGL_NO_SURFACE) {
37 }
38
39 EGLGLContext::~EGLGLContext() {
40 this->destroyGLContext();
41 }
42
43 void EGLGLContext::destroyGLContext() {
44 if (fDisplay) {
45 eglMakeCurrent(fDisplay, 0, 0, 0);
46
47 if (fContext) {
48 eglDestroyContext(fDisplay, fContext);
49 fContext = EGL_NO_CONTEXT;
50 }
51
52 if (fSurface) {
53 eglDestroySurface(fDisplay, fSurface);
54 fSurface = EGL_NO_SURFACE;
55 }
56
57 //TODO should we close the display?
58 fDisplay = EGL_NO_DISPLAY;
59 }
60 }
61
62 const GrGLInterface* EGLGLContext::createGLContext(GrGLStandard forcedGpuAPI) {
63 static const EGLint kEGLContextAttribsForOpenGL[] = { 34 static const EGLint kEGLContextAttribsForOpenGL[] = {
64 EGL_NONE 35 EGL_NONE
65 }; 36 };
66 37
67 static const EGLint kEGLContextAttribsForOpenGLES[] = { 38 static const EGLint kEGLContextAttribsForOpenGLES[] = {
68 EGL_CONTEXT_CLIENT_VERSION, 2, 39 EGL_CONTEXT_CLIENT_VERSION, 2,
69 EGL_NONE 40 EGL_NONE
70 }; 41 };
71 42
72 static const struct { 43 static const struct {
(...skipping 18 matching lines...) Expand all
91 62
92 size_t apiLimit = SK_ARRAY_COUNT(kAPIs); 63 size_t apiLimit = SK_ARRAY_COUNT(kAPIs);
93 size_t api = 0; 64 size_t api = 0;
94 if (forcedGpuAPI == kGL_GrGLStandard) { 65 if (forcedGpuAPI == kGL_GrGLStandard) {
95 apiLimit = 1; 66 apiLimit = 1;
96 } else if (forcedGpuAPI == kGLES_GrGLStandard) { 67 } else if (forcedGpuAPI == kGLES_GrGLStandard) {
97 api = 1; 68 api = 1;
98 } 69 }
99 SkASSERT(forcedGpuAPI == kNone_GrGLStandard || kAPIs[api].fStandard == force dGpuAPI); 70 SkASSERT(forcedGpuAPI == kNone_GrGLStandard || kAPIs[api].fStandard == force dGpuAPI);
100 71
101 const GrGLInterface* interface = NULL; 72 for (; NULL == fGL.get() && api < apiLimit; ++api) {
102
103 for (; NULL == interface && api < apiLimit; ++api) {
104 fDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY); 73 fDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
105 74
106 EGLint majorVersion; 75 EGLint majorVersion;
107 EGLint minorVersion; 76 EGLint minorVersion;
108 eglInitialize(fDisplay, &majorVersion, &minorVersion); 77 eglInitialize(fDisplay, &majorVersion, &minorVersion);
109 78
110 #if 0 79 #if 0
111 SkDebugf("VENDOR: %s\n", eglQueryString(fDisplay, EGL_VENDOR)); 80 SkDebugf("VENDOR: %s\n", eglQueryString(fDisplay, EGL_VENDOR));
112 SkDebugf("APIS: %s\n", eglQueryString(fDisplay, EGL_CLIENT_APIS)); 81 SkDebugf("APIS: %s\n", eglQueryString(fDisplay, EGL_CLIENT_APIS));
113 SkDebugf("VERSION: %s\n", eglQueryString(fDisplay, EGL_VERSION)); 82 SkDebugf("VERSION: %s\n", eglQueryString(fDisplay, EGL_VERSION));
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
153 this->destroyGLContext(); 122 this->destroyGLContext();
154 continue; 123 continue;
155 } 124 }
156 125
157 if (!eglMakeCurrent(fDisplay, fSurface, fSurface, fContext)) { 126 if (!eglMakeCurrent(fDisplay, fSurface, fSurface, fContext)) {
158 SkDebugf("eglMakeCurrent failed. EGL Error: 0x%08x\n", eglGetError( )); 127 SkDebugf("eglMakeCurrent failed. EGL Error: 0x%08x\n", eglGetError( ));
159 this->destroyGLContext(); 128 this->destroyGLContext();
160 continue; 129 continue;
161 } 130 }
162 131
163 interface = GrGLCreateNativeInterface(); 132 fGL.reset(GrGLCreateNativeInterface());
164 if (NULL == interface) { 133 if (NULL == fGL.get()) {
165 SkDebugf("Failed to create gl interface.\n"); 134 SkDebugf("Failed to create gl interface.\n");
166 this->destroyGLContext(); 135 this->destroyGLContext();
167 continue; 136 continue;
168 } 137 }
169 138
170 if (!interface->validate()) { 139 if (!fGL->validate()) {
171 interface->unref(); 140 SkDebugf("Failed to validate gl interface.\n");
172 interface = NULL;
173 this->destroyGLContext(); 141 this->destroyGLContext();
142 continue;
174 } 143 }
175 } 144 }
145 }
176 146
177 return interface; 147 EGLGLContext::~EGLGLContext() {
148 this->destroyGLContext();
178 } 149 }
179 150
151 void EGLGLContext::destroyGLContext() {
152 fGL.reset(NULL);
153 if (fDisplay) {
154 eglMakeCurrent(fDisplay, 0, 0, 0);
155
156 if (fContext) {
157 eglDestroyContext(fDisplay, fContext);
158 fContext = EGL_NO_CONTEXT;
159 }
160
161 if (fSurface) {
162 eglDestroySurface(fDisplay, fSurface);
163 fSurface = EGL_NO_SURFACE;
164 }
165
166 //TODO should we close the display?
167 fDisplay = EGL_NO_DISPLAY;
168 }
169 }
170
171
180 void EGLGLContext::makeCurrent() const { 172 void EGLGLContext::makeCurrent() const {
181 if (!eglMakeCurrent(fDisplay, fSurface, fSurface, fContext)) { 173 if (!eglMakeCurrent(fDisplay, fSurface, fSurface, fContext)) {
182 SkDebugf("Could not set the context.\n"); 174 SkDebugf("Could not set the context.\n");
183 } 175 }
184 } 176 }
185 177
186 void EGLGLContext::swapBuffers() const { 178 void EGLGLContext::swapBuffers() const {
187 if (!eglSwapBuffers(fDisplay, fSurface)) { 179 if (!eglSwapBuffers(fDisplay, fSurface)) {
188 SkDebugf("Could not complete eglSwapBuffers.\n"); 180 SkDebugf("Could not complete eglSwapBuffers.\n");
189 } 181 }
190 } 182 }
191 183
192 } // anonymous namespace 184 } // anonymous namespace
193 185
194 SkGLContext* SkCreatePlatformGLContext() { 186 SkGLContext* SkCreatePlatformGLContext(GrGLStandard forcedGpuAPI) {
195 return SkNEW(EGLGLContext); 187 EGLGLContext* ctx = SkNEW_ARGS(EGLGLContext, (forcedGpuAPI));
188 if (!ctx->isValid()) {
189 SkDELETE(ctx);
190 return NULL;
191 }
192 return ctx;
196 } 193 }
197 194
OLDNEW
« no previous file with comments | « src/gpu/gl/debug/SkDebugGLContext.cpp ('k') | src/gpu/gl/glx/SkCreatePlatformGLContext_glx.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698