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/SkNativeGLContext.h" |
9 | 9 |
10 #include <GL/glu.h> | 10 #include <GL/glu.h> |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
59 if (fPixmap) { | 59 if (fPixmap) { |
60 XFreePixmap(fDisplay, fPixmap); | 60 XFreePixmap(fDisplay, fPixmap); |
61 fPixmap = 0; | 61 fPixmap = 0; |
62 } | 62 } |
63 | 63 |
64 XCloseDisplay(fDisplay); | 64 XCloseDisplay(fDisplay); |
65 fDisplay = NULL; | 65 fDisplay = NULL; |
66 } | 66 } |
67 } | 67 } |
68 | 68 |
69 const GrGLInterface* SkNativeGLContext::createGLContext() { | 69 const GrGLInterface* SkNativeGLContext::createGLContext(GrGLStandard forcedGpuAP
I) { |
70 fDisplay = XOpenDisplay(0); | 70 fDisplay = XOpenDisplay(0); |
71 | 71 |
72 if (!fDisplay) { | 72 if (!fDisplay) { |
73 SkDebugf("Failed to open X display.\n"); | 73 SkDebugf("Failed to open X display.\n"); |
74 this->destroyGLContext(); | 74 this->destroyGLContext(); |
75 return NULL; | 75 return NULL; |
76 } | 76 } |
77 | 77 |
78 // Get a matching FB config | 78 // Get a matching FB config |
79 static int visual_attribs[] = { | 79 static int visual_attribs[] = { |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
180 // error handler, so be sure to guard against other threads issuing | 180 // error handler, so be sure to guard against other threads issuing |
181 // X commands while this code is running. | 181 // X commands while this code is running. |
182 ctxErrorOccurred = false; | 182 ctxErrorOccurred = false; |
183 int (*oldHandler)(Display*, XErrorEvent*) = | 183 int (*oldHandler)(Display*, XErrorEvent*) = |
184 XSetErrorHandler(&ctxErrorHandler); | 184 XSetErrorHandler(&ctxErrorHandler); |
185 | 185 |
186 // Get the default screen's GLX extension list | 186 // Get the default screen's GLX extension list |
187 const char *glxExts = glXQueryExtensionsString( | 187 const char *glxExts = glXQueryExtensionsString( |
188 fDisplay, DefaultScreen(fDisplay) | 188 fDisplay, DefaultScreen(fDisplay) |
189 ); | 189 ); |
| 190 |
| 191 |
190 // Check for the GLX_ARB_create_context extension string and the function. | 192 // Check for the GLX_ARB_create_context extension string and the function. |
191 // If either is not present, use GLX 1.3 context creation method. | 193 // If either is not present, use GLX 1.3 context creation method. |
192 if (!gluCheckExtension( | 194 |
193 reinterpret_cast<const GLubyte*>("GLX_ARB_create_context") | 195 if (!gluCheckExtension(reinterpret_cast<const GLubyte*>("GLX_ARB_create_cont
ext"), |
194 , reinterpret_cast<const GLubyte*>(glxExts))) | 196 reinterpret_cast<const GLubyte*>(glxExts))) { |
195 { | 197 if (kGLES_GrGLStandard != forcedGpuAPI) { |
196 //SkDebugf("GLX_ARB_create_context not found." | |
197 // " Using old-style GLX context.\n"); | |
198 #ifdef GLX_1_3 | 198 #ifdef GLX_1_3 |
199 fContext = glXCreateNewContext(fDisplay, bestFbc, GLX_RGBA_TYPE, 0, True
); | 199 fContext = glXCreateNewContext(fDisplay, bestFbc, GLX_RGBA_TYPE, 0,
True); |
200 #else | 200 #else |
201 fContext = glXCreateContext(fDisplay, vi, 0, True); | 201 fContext = glXCreateContext(fDisplay, vi, 0, True); |
202 #endif | 202 #endif |
203 | 203 } |
204 } | 204 } |
205 #ifdef GLX_1_3 | 205 #ifdef GLX_1_3 |
206 else { | 206 else { |
207 //SkDebugf("Creating context.\n"); | 207 //SkDebugf("Creating context.\n"); |
208 | |
209 PFNGLXCREATECONTEXTATTRIBSARBPROC glXCreateContextAttribsARB = | 208 PFNGLXCREATECONTEXTATTRIBSARBPROC glXCreateContextAttribsARB = |
210 (PFNGLXCREATECONTEXTATTRIBSARBPROC) glXGetProcAddressARB((GrGLubyte*
)"glXCreateContextAttribsARB"); | 209 (PFNGLXCREATECONTEXTATTRIBSARBPROC) glXGetProcAddressARB((GrGLubyte*
)"glXCreateContextAttribsARB"); |
211 int context_attribs[] = { | 210 |
| 211 static const int context_attribs_gl[] = { |
212 GLX_CONTEXT_MAJOR_VERSION_ARB, 3, | 212 GLX_CONTEXT_MAJOR_VERSION_ARB, 3, |
213 GLX_CONTEXT_MINOR_VERSION_ARB, 0, | 213 GLX_CONTEXT_MINOR_VERSION_ARB, 0, |
214 //GLX_CONTEXT_FLAGS_ARB , GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_
ARB, | |
215 None | 214 None |
216 }; | 215 }; |
217 fContext = glXCreateContextAttribsARB( | 216 static const int context_attribs_gl_fallback[] = { |
218 fDisplay, bestFbc, 0, True, context_attribs | 217 GLX_CONTEXT_MAJOR_VERSION_ARB, 1, |
219 ); | 218 GLX_CONTEXT_MINOR_VERSION_ARB, 0, |
| 219 None |
| 220 }; |
| 221 static const int context_attribs_gles[] = { |
| 222 GLX_CONTEXT_MAJOR_VERSION_ARB, 3, |
| 223 GLX_CONTEXT_MINOR_VERSION_ARB, 0, |
| 224 GLX_CONTEXT_PROFILE_MASK_ARB, GLX_CONTEXT_ES2_PROFILE_BIT_EXT, |
| 225 None |
| 226 }; |
220 | 227 |
221 // Sync to ensure any errors generated are processed. | 228 if (kGLES_GrGLStandard == forcedGpuAPI) { |
222 XSync(fDisplay, False); | 229 if (gluCheckExtension( |
223 if (!ctxErrorOccurred && fContext) { | 230 reinterpret_cast<const GLubyte*>("GLX_EXT_create_context_es2
_profile"), |
224 //SkDebugf( "Created GL 3.0 context.\n" ); | 231 reinterpret_cast<const GLubyte*>(glxExts))) { |
| 232 fContext = glXCreateContextAttribsARB(fDisplay, bestFbc, 0, True
, |
| 233 context_attribs_gles); |
| 234 } |
225 } else { | 235 } else { |
226 // Couldn't create GL 3.0 context. | 236 fContext = glXCreateContextAttribsARB(fDisplay, bestFbc, 0, True, co
ntext_attribs_gl); |
227 // Fall back to old-style 2.x context. | |
228 // When a context version below 3.0 is requested, | |
229 // implementations will return the newest context version compatible | |
230 // with OpenGL versions less than version 3.0. | |
231 | 237 |
232 // GLX_CONTEXT_MAJOR_VERSION_ARB = 1 | 238 // Sync to ensure any errors generated are processed. |
233 context_attribs[1] = 1; | 239 XSync(fDisplay, False); |
234 // GLX_CONTEXT_MINOR_VERSION_ARB = 0 | 240 if (ctxErrorOccurred || !fContext) { |
235 context_attribs[3] = 0; | 241 // Couldn't create GL 3.0 context. |
| 242 // Fall back to old-style 2.x context. |
| 243 // When a context version below 3.0 is requested, |
| 244 // implementations will return the newest context version |
| 245 // compatible with OpenGL versions less than version 3.0. |
236 | 246 |
237 ctxErrorOccurred = false; | 247 ctxErrorOccurred = false; |
238 | 248 |
239 //SkDebugf("Failed to create GL 3.0 context." | 249 fContext = glXCreateContextAttribsARB(fDisplay, bestFbc, 0, True
, |
240 // " Using old-style GLX context.\n"); | 250 context_attribs_gl_fallbac
k); |
241 fContext = glXCreateContextAttribsARB( | 251 } |
242 fDisplay, bestFbc, 0, True, context_attribs | |
243 ); | |
244 } | 252 } |
245 } | 253 } |
246 #endif | 254 #endif |
247 | 255 |
248 // Sync to ensure any errors generated are processed. | 256 // Sync to ensure any errors generated are processed. |
249 XSync(fDisplay, False); | 257 XSync(fDisplay, False); |
250 | 258 |
251 // Restore the original error handler | 259 // Restore the original error handler |
252 XSetErrorHandler(oldHandler); | 260 XSetErrorHandler(oldHandler); |
253 | 261 |
(...skipping 28 matching lines...) Expand all Loading... |
282 | 290 |
283 void SkNativeGLContext::makeCurrent() const { | 291 void SkNativeGLContext::makeCurrent() const { |
284 if (!glXMakeCurrent(fDisplay, fGlxPixmap, fContext)) { | 292 if (!glXMakeCurrent(fDisplay, fGlxPixmap, fContext)) { |
285 SkDebugf("Could not set the context.\n"); | 293 SkDebugf("Could not set the context.\n"); |
286 } | 294 } |
287 } | 295 } |
288 | 296 |
289 void SkNativeGLContext::swapBuffers() const { | 297 void SkNativeGLContext::swapBuffers() const { |
290 glXSwapBuffers(fDisplay, fGlxPixmap); | 298 glXSwapBuffers(fDisplay, fGlxPixmap); |
291 } | 299 } |
OLD | NEW |