OLD | NEW |
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 <X11/Xlib.h> | 10 #include <X11/Xlib.h> |
(...skipping 28 matching lines...) Expand all Loading... |
39 #define NUM_GL_VERSIONS SK_ARRAY_COUNT(gl_versions) | 39 #define NUM_GL_VERSIONS SK_ARRAY_COUNT(gl_versions) |
40 | 40 |
41 static bool ctxErrorOccurred = false; | 41 static bool ctxErrorOccurred = false; |
42 static int ctxErrorHandler(Display *dpy, XErrorEvent *ev) { | 42 static int ctxErrorHandler(Display *dpy, XErrorEvent *ev) { |
43 ctxErrorOccurred = true; | 43 ctxErrorOccurred = true; |
44 return 0; | 44 return 0; |
45 } | 45 } |
46 | 46 |
47 class GLXGLContext : public SkGLContext { | 47 class GLXGLContext : public SkGLContext { |
48 public: | 48 public: |
49 GLXGLContext(GrGLStandard forcedGpuAPI); | 49 GLXGLContext(GrGLStandard forcedGpuAPI, GLXGLContext* shareList); |
50 ~GLXGLContext() override; | 50 ~GLXGLContext() override; |
51 | 51 |
52 private: | 52 private: |
53 void destroyGLContext(); | 53 void destroyGLContext(); |
54 | 54 |
55 void onPlatformMakeCurrent() const override; | 55 void onPlatformMakeCurrent() const override; |
56 void onPlatformSwapBuffers() const override; | 56 void onPlatformSwapBuffers() const override; |
57 GrGLFuncPtr onPlatformGetProcAddress(const char*) const override; | 57 GrGLFuncPtr onPlatformGetProcAddress(const char*) const override; |
58 | 58 |
59 GLXContext fContext; | 59 GLXContext fContext; |
60 Display* fDisplay; | 60 Display* fDisplay; |
61 Pixmap fPixmap; | 61 Pixmap fPixmap; |
62 GLXPixmap fGlxPixmap; | 62 GLXPixmap fGlxPixmap; |
63 }; | 63 }; |
64 | 64 |
65 GLXGLContext::GLXGLContext(GrGLStandard forcedGpuAPI) | 65 GLXGLContext::GLXGLContext(GrGLStandard forcedGpuAPI, GLXGLContext* shareContext
) |
66 : fContext(nullptr) | 66 : fContext(nullptr) |
67 , fDisplay(nullptr) | 67 , fDisplay(nullptr) |
68 , fPixmap(0) | 68 , fPixmap(0) |
69 , fGlxPixmap(0) { | 69 , fGlxPixmap(0) { |
| 70 fDisplay = XOpenDisplay(0); |
70 | 71 |
71 fDisplay = XOpenDisplay(0); | 72 GLXContext glxShareContext = shareContext ? shareContext->fContext : nullptr
; |
72 | 73 |
73 if (!fDisplay) { | 74 if (!fDisplay) { |
74 SkDebugf("Failed to open X display.\n"); | 75 SkDebugf("Failed to open X display.\n"); |
75 this->destroyGLContext(); | 76 this->destroyGLContext(); |
76 return; | 77 return; |
77 } | 78 } |
78 | 79 |
79 // Get a matching FB config | 80 // Get a matching FB config |
80 static int visual_attribs[] = { | 81 static int visual_attribs[] = { |
81 GLX_X_RENDERABLE , True, | 82 GLX_X_RENDERABLE , True, |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
182 if (kGLES_GrGLStandard == forcedGpuAPI) { | 183 if (kGLES_GrGLStandard == forcedGpuAPI) { |
183 if (gluCheckExtension( | 184 if (gluCheckExtension( |
184 reinterpret_cast<const GLubyte*>("GLX_EXT_create_context_es2
_profile"), | 185 reinterpret_cast<const GLubyte*>("GLX_EXT_create_context_es2
_profile"), |
185 reinterpret_cast<const GLubyte*>(glxExts))) { | 186 reinterpret_cast<const GLubyte*>(glxExts))) { |
186 static const int context_attribs_gles[] = { | 187 static const int context_attribs_gles[] = { |
187 GLX_CONTEXT_MAJOR_VERSION_ARB, 3, | 188 GLX_CONTEXT_MAJOR_VERSION_ARB, 3, |
188 GLX_CONTEXT_MINOR_VERSION_ARB, 0, | 189 GLX_CONTEXT_MINOR_VERSION_ARB, 0, |
189 GLX_CONTEXT_PROFILE_MASK_ARB, GLX_CONTEXT_ES2_PROFILE_BIT_EX
T, | 190 GLX_CONTEXT_PROFILE_MASK_ARB, GLX_CONTEXT_ES2_PROFILE_BIT_EX
T, |
190 None | 191 None |
191 }; | 192 }; |
192 fContext = glXCreateContextAttribsARB(fDisplay, bestFbc, 0, True
, | 193 fContext = glXCreateContextAttribsARB(fDisplay, bestFbc, glxShar
eContext, True, |
193 context_attribs_gles); | 194 context_attribs_gles); |
194 } | 195 } |
195 } else { | 196 } else { |
196 // Well, unfortunately GLX will not just give us the highest context
so instead we have | 197 // Well, unfortunately GLX will not just give us the highest context
so instead we have |
197 // to do this nastiness | 198 // to do this nastiness |
198 for (i = NUM_GL_VERSIONS - 2; i > 0 ; i--) { | 199 for (i = NUM_GL_VERSIONS - 2; i > 0 ; i--) { |
199 /* don't bother below GL 3.0 */ | 200 /* don't bother below GL 3.0 */ |
200 if (gl_versions[i].major == 3 && gl_versions[i].minor == 0) { | 201 if (gl_versions[i].major == 3 && gl_versions[i].minor == 0) { |
201 break; | 202 break; |
202 } | 203 } |
203 // On Nvidia GPUs, to use Nv Path rendering we need a compatibil
ity profile for the | 204 // On Nvidia GPUs, to use Nv Path rendering we need a compatibil
ity profile for the |
204 // time being. | 205 // time being. |
205 // TODO when Nvidia implements NVPR on Core profiles, we should
start requesting | 206 // TODO when Nvidia implements NVPR on Core profiles, we should
start requesting |
206 // core here | 207 // core here |
207 static const int context_attribs_gl[] = { | 208 static const int context_attribs_gl[] = { |
208 GLX_CONTEXT_MAJOR_VERSION_ARB, gl_versions[i].major, | 209 GLX_CONTEXT_MAJOR_VERSION_ARB, gl_versions[i].major, |
209 GLX_CONTEXT_MINOR_VERSION_ARB, gl_versions[i].minor, | 210 GLX_CONTEXT_MINOR_VERSION_ARB, gl_versions[i].minor, |
210 GLX_CONTEXT_PROFILE_MASK_ARB, GLX_CONTEXT_COMPATIBILITY_PR
OFILE_BIT_ARB, | 211 GLX_CONTEXT_PROFILE_MASK_ARB, GLX_CONTEXT_COMPATIBILITY_PR
OFILE_BIT_ARB, |
211 None | 212 None |
212 }; | 213 }; |
213 fContext = | 214 fContext = |
214 glXCreateContextAttribsARB(fDisplay, bestFbc, 0, True, c
ontext_attribs_gl); | 215 glXCreateContextAttribsARB(fDisplay, bestFbc, glxShareCo
ntext, True, |
| 216 context_attribs_gl); |
215 | 217 |
216 // Sync to ensure any errors generated are processed. | 218 // Sync to ensure any errors generated are processed. |
217 XSync(fDisplay, False); | 219 XSync(fDisplay, False); |
218 | 220 |
219 if (!ctxErrorOccurred && fContext) { | 221 if (!ctxErrorOccurred && fContext) { |
220 break; | 222 break; |
221 } | 223 } |
222 // try again | 224 // try again |
223 ctxErrorOccurred = false; | 225 ctxErrorOccurred = false; |
224 } | 226 } |
225 | 227 |
226 // Couldn't create GL 3.0 context. | 228 // Couldn't create GL 3.0 context. |
227 // Fall back to old-style 2.x context. | 229 // Fall back to old-style 2.x context. |
228 // When a context version below 3.0 is requested, | 230 // When a context version below 3.0 is requested, |
229 // implementations will return the newest context version | 231 // implementations will return the newest context version |
230 // compatible with OpenGL versions less than version 3.0. | 232 // compatible with OpenGL versions less than version 3.0. |
231 if (ctxErrorOccurred || !fContext) { | 233 if (ctxErrorOccurred || !fContext) { |
232 static const int context_attribs_gl_fallback[] = { | 234 static const int context_attribs_gl_fallback[] = { |
233 GLX_CONTEXT_MAJOR_VERSION_ARB, 1, | 235 GLX_CONTEXT_MAJOR_VERSION_ARB, 1, |
234 GLX_CONTEXT_MINOR_VERSION_ARB, 0, | 236 GLX_CONTEXT_MINOR_VERSION_ARB, 0, |
235 None | 237 None |
236 }; | 238 }; |
237 | 239 |
238 ctxErrorOccurred = false; | 240 ctxErrorOccurred = false; |
239 | 241 |
240 fContext = glXCreateContextAttribsARB(fDisplay, bestFbc, 0, True
, | 242 fContext = glXCreateContextAttribsARB(fDisplay, bestFbc, glxShar
eContext, True, |
241 context_attribs_gl_fallbac
k); | 243 context_attribs_gl_fallbac
k); |
242 } | 244 } |
243 } | 245 } |
244 } | 246 } |
245 | 247 |
246 // Sync to ensure any errors generated are processed. | 248 // Sync to ensure any errors generated are processed. |
247 XSync(fDisplay, False); | 249 XSync(fDisplay, False); |
248 | 250 |
249 // Restore the original error handler | 251 // Restore the original error handler |
250 XSetErrorHandler(oldHandler); | 252 XSetErrorHandler(oldHandler); |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
324 void GLXGLContext::onPlatformSwapBuffers() const { | 326 void GLXGLContext::onPlatformSwapBuffers() const { |
325 glXSwapBuffers(fDisplay, fGlxPixmap); | 327 glXSwapBuffers(fDisplay, fGlxPixmap); |
326 } | 328 } |
327 | 329 |
328 GrGLFuncPtr GLXGLContext::onPlatformGetProcAddress(const char* procName) const { | 330 GrGLFuncPtr GLXGLContext::onPlatformGetProcAddress(const char* procName) const { |
329 return glXGetProcAddress(reinterpret_cast<const GLubyte*>(procName)); | 331 return glXGetProcAddress(reinterpret_cast<const GLubyte*>(procName)); |
330 } | 332 } |
331 | 333 |
332 } // anonymous namespace | 334 } // anonymous namespace |
333 | 335 |
334 SkGLContext* SkCreatePlatformGLContext(GrGLStandard forcedGpuAPI) { | 336 SkGLContext* SkCreatePlatformGLContext(GrGLStandard forcedGpuAPI, SkGLContext* s
hareContext) { |
335 GLXGLContext *ctx = new GLXGLContext(forcedGpuAPI); | 337 GLXGLContext* glxShareContext = reinterpret_cast<GLXGLContext*>(shareContext
); |
| 338 GLXGLContext *ctx = new GLXGLContext(forcedGpuAPI, glxShareContext); |
336 if (!ctx->isValid()) { | 339 if (!ctx->isValid()) { |
337 delete ctx; | 340 delete ctx; |
338 return nullptr; | 341 return nullptr; |
339 } | 342 } |
340 return ctx; | 343 return ctx; |
341 } | 344 } |
OLD | NEW |