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/SkNativeGLContext.h" | 8 #include "gl/SkGLContext.h" |
9 | 9 |
| 10 #include <X11/Xlib.h> |
| 11 #include <GL/glx.h> |
10 #include <GL/glu.h> | 12 #include <GL/glu.h> |
11 | 13 |
| 14 namespace { |
| 15 |
12 /* Note: Skia requires glx 1.3 or newer */ | 16 /* Note: Skia requires glx 1.3 or newer */ |
13 | 17 |
14 SkNativeGLContext::AutoContextRestore::AutoContextRestore() { | 18 /* This struct is taken from a mesa demo. Please update as required */ |
15 fOldGLXContext = glXGetCurrentContext(); | 19 static const struct { int major, minor; } gl_versions[] = { |
16 fOldDisplay = glXGetCurrentDisplay(); | 20 {1, 0}, |
17 fOldDrawable = glXGetCurrentDrawable(); | 21 {1, 1}, |
18 } | 22 {1, 2}, |
19 | 23 {1, 3}, |
20 SkNativeGLContext::AutoContextRestore::~AutoContextRestore() { | 24 {1, 4}, |
21 if (fOldDisplay) { | 25 {1, 5}, |
22 glXMakeCurrent(fOldDisplay, fOldDrawable, fOldGLXContext); | 26 {2, 0}, |
23 } | 27 {2, 1}, |
24 } | 28 {3, 0}, |
25 | 29 {3, 1}, |
26 /////////////////////////////////////////////////////////////////////////////// | 30 {3, 2}, |
| 31 {3, 3}, |
| 32 {4, 0}, |
| 33 {4, 1}, |
| 34 {4, 2}, |
| 35 {4, 3}, |
| 36 {4, 4}, |
| 37 {0, 0} /* end of list */ |
| 38 }; |
| 39 #define NUM_GL_VERSIONS SK_ARRAY_COUNT(gl_versions) |
27 | 40 |
28 static bool ctxErrorOccurred = false; | 41 static bool ctxErrorOccurred = false; |
29 static int ctxErrorHandler(Display *dpy, XErrorEvent *ev) { | 42 static int ctxErrorHandler(Display *dpy, XErrorEvent *ev) { |
30 ctxErrorOccurred = true; | 43 ctxErrorOccurred = true; |
31 return 0; | 44 return 0; |
32 } | 45 } |
33 | 46 |
34 SkNativeGLContext::SkNativeGLContext() | 47 class GLXGLContext : public SkGLContext { |
| 48 public: |
| 49 GLXGLContext(); |
| 50 |
| 51 virtual ~GLXGLContext(); |
| 52 |
| 53 virtual void makeCurrent() const SK_OVERRIDE; |
| 54 virtual void swapBuffers() const SK_OVERRIDE; |
| 55 protected: |
| 56 virtual const GrGLInterface* createGLContext(GrGLStandard forcedGpuAPI) SK_O
VERRIDE; |
| 57 virtual void destroyGLContext() SK_OVERRIDE; |
| 58 |
| 59 private: |
| 60 GLXContext fContext; |
| 61 Display* fDisplay; |
| 62 Pixmap fPixmap; |
| 63 GLXPixmap fGlxPixmap; |
| 64 }; |
| 65 |
| 66 GLXGLContext::GLXGLContext() |
35 : fContext(NULL) | 67 : fContext(NULL) |
36 , fDisplay(NULL) | 68 , fDisplay(NULL) |
37 , fPixmap(0) | 69 , fPixmap(0) |
38 , fGlxPixmap(0) { | 70 , fGlxPixmap(0) { |
39 } | 71 } |
40 | 72 |
41 SkNativeGLContext::~SkNativeGLContext() { | 73 GLXGLContext::~GLXGLContext() { |
42 this->destroyGLContext(); | 74 this->destroyGLContext(); |
43 } | 75 } |
44 | 76 |
45 void SkNativeGLContext::destroyGLContext() { | 77 void GLXGLContext::destroyGLContext() { |
46 if (fDisplay) { | 78 if (fDisplay) { |
47 glXMakeCurrent(fDisplay, 0, 0); | 79 glXMakeCurrent(fDisplay, 0, 0); |
48 | 80 |
49 if (fContext) { | 81 if (fContext) { |
50 glXDestroyContext(fDisplay, fContext); | 82 glXDestroyContext(fDisplay, fContext); |
51 fContext = NULL; | 83 fContext = NULL; |
52 } | 84 } |
53 | 85 |
54 if (fGlxPixmap) { | 86 if (fGlxPixmap) { |
55 glXDestroyGLXPixmap(fDisplay, fGlxPixmap); | 87 glXDestroyGLXPixmap(fDisplay, fGlxPixmap); |
56 fGlxPixmap = 0; | 88 fGlxPixmap = 0; |
57 } | 89 } |
58 | 90 |
59 if (fPixmap) { | 91 if (fPixmap) { |
60 XFreePixmap(fDisplay, fPixmap); | 92 XFreePixmap(fDisplay, fPixmap); |
61 fPixmap = 0; | 93 fPixmap = 0; |
62 } | 94 } |
63 | 95 |
64 XCloseDisplay(fDisplay); | 96 XCloseDisplay(fDisplay); |
65 fDisplay = NULL; | 97 fDisplay = NULL; |
66 } | 98 } |
67 } | 99 } |
68 | 100 |
69 const GrGLInterface* SkNativeGLContext::createGLContext(GrGLStandard forcedGpuAP
I) { | 101 const GrGLInterface* GLXGLContext::createGLContext(GrGLStandard forcedGpuAPI) { |
70 fDisplay = XOpenDisplay(0); | 102 fDisplay = XOpenDisplay(0); |
71 | 103 |
72 if (!fDisplay) { | 104 if (!fDisplay) { |
73 SkDebugf("Failed to open X display.\n"); | 105 SkDebugf("Failed to open X display.\n"); |
74 this->destroyGLContext(); | 106 this->destroyGLContext(); |
75 return NULL; | 107 return NULL; |
76 } | 108 } |
77 | 109 |
78 // Get a matching FB config | 110 // Get a matching FB config |
79 static int visual_attribs[] = { | 111 static int visual_attribs[] = { |
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
270 | 302 |
271 const GrGLInterface* interface = GrGLCreateNativeInterface(); | 303 const GrGLInterface* interface = GrGLCreateNativeInterface(); |
272 if (!interface) { | 304 if (!interface) { |
273 SkDebugf("Failed to create gl interface"); | 305 SkDebugf("Failed to create gl interface"); |
274 this->destroyGLContext(); | 306 this->destroyGLContext(); |
275 return NULL; | 307 return NULL; |
276 } | 308 } |
277 return interface; | 309 return interface; |
278 } | 310 } |
279 | 311 |
280 void SkNativeGLContext::makeCurrent() const { | 312 void GLXGLContext::makeCurrent() const { |
281 if (!glXMakeCurrent(fDisplay, fGlxPixmap, fContext)) { | 313 if (!glXMakeCurrent(fDisplay, fGlxPixmap, fContext)) { |
282 SkDebugf("Could not set the context.\n"); | 314 SkDebugf("Could not set the context.\n"); |
283 } | 315 } |
284 } | 316 } |
285 | 317 |
286 void SkNativeGLContext::swapBuffers() const { | 318 void GLXGLContext::swapBuffers() const { |
287 glXSwapBuffers(fDisplay, fGlxPixmap); | 319 glXSwapBuffers(fDisplay, fGlxPixmap); |
288 } | 320 } |
| 321 |
| 322 } // anonymous namespace |
| 323 |
| 324 SkGLContext* SkCreatePlatformGLContext() { |
| 325 return SkNEW(GLXGLContext); |
| 326 } |
OLD | NEW |