Index: src/gpu/gl/unix/SkNativeGLContext_unix.cpp |
diff --git a/src/gpu/gl/unix/SkNativeGLContext_unix.cpp b/src/gpu/gl/unix/SkNativeGLContext_unix.cpp |
index c4bd6f937d35142aeaa9e5c2d7f5c124c9deb9d3..4da1eb2f4f8602e427bbb7e9345322072a64750b 100644 |
--- a/src/gpu/gl/unix/SkNativeGLContext_unix.cpp |
+++ b/src/gpu/gl/unix/SkNativeGLContext_unix.cpp |
@@ -66,7 +66,7 @@ void SkNativeGLContext::destroyGLContext() { |
} |
} |
-const GrGLInterface* SkNativeGLContext::createGLContext() { |
+const GrGLInterface* SkNativeGLContext::createGLContext(GrGLStandard forcedGpuAPI) { |
fDisplay = XOpenDisplay(0); |
if (!fDisplay) { |
@@ -187,60 +187,68 @@ const GrGLInterface* SkNativeGLContext::createGLContext() { |
const char *glxExts = glXQueryExtensionsString( |
fDisplay, DefaultScreen(fDisplay) |
); |
+ |
+ |
// Check for the GLX_ARB_create_context extension string and the function. |
// If either is not present, use GLX 1.3 context creation method. |
- if (!gluCheckExtension( |
- reinterpret_cast<const GLubyte*>("GLX_ARB_create_context") |
- , reinterpret_cast<const GLubyte*>(glxExts))) |
- { |
- //SkDebugf("GLX_ARB_create_context not found." |
- // " Using old-style GLX context.\n"); |
+ |
+ if (!gluCheckExtension(reinterpret_cast<const GLubyte*>("GLX_ARB_create_context"), |
+ reinterpret_cast<const GLubyte*>(glxExts))) { |
+ if (kGLES_GrGLStandard != forcedGpuAPI) { |
#ifdef GLX_1_3 |
- fContext = glXCreateNewContext(fDisplay, bestFbc, GLX_RGBA_TYPE, 0, True); |
+ fContext = glXCreateNewContext(fDisplay, bestFbc, GLX_RGBA_TYPE, 0, True); |
#else |
- fContext = glXCreateContext(fDisplay, vi, 0, True); |
+ fContext = glXCreateContext(fDisplay, vi, 0, True); |
#endif |
- |
+ } |
} |
#ifdef GLX_1_3 |
else { |
//SkDebugf("Creating context.\n"); |
- |
PFNGLXCREATECONTEXTATTRIBSARBPROC glXCreateContextAttribsARB = |
(PFNGLXCREATECONTEXTATTRIBSARBPROC) glXGetProcAddressARB((GrGLubyte*)"glXCreateContextAttribsARB"); |
- int context_attribs[] = { |
+ |
+ static const int context_attribs_gl[] = { |
GLX_CONTEXT_MAJOR_VERSION_ARB, 3, |
GLX_CONTEXT_MINOR_VERSION_ARB, 0, |
- //GLX_CONTEXT_FLAGS_ARB , GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB, |
None |
}; |
- fContext = glXCreateContextAttribsARB( |
- fDisplay, bestFbc, 0, True, context_attribs |
- ); |
- |
- // Sync to ensure any errors generated are processed. |
- XSync(fDisplay, False); |
- if (!ctxErrorOccurred && fContext) { |
- //SkDebugf( "Created GL 3.0 context.\n" ); |
+ static const int context_attribs_gl_fallback[] = { |
+ GLX_CONTEXT_MAJOR_VERSION_ARB, 1, |
+ GLX_CONTEXT_MINOR_VERSION_ARB, 0, |
+ None |
+ }; |
+ static const int context_attribs_gles[] = { |
+ GLX_CONTEXT_MAJOR_VERSION_ARB, 3, |
+ GLX_CONTEXT_MINOR_VERSION_ARB, 0, |
+ GLX_CONTEXT_PROFILE_MASK_ARB, GLX_CONTEXT_ES2_PROFILE_BIT_EXT, |
+ None |
+ }; |
+ |
+ if (kGLES_GrGLStandard == forcedGpuAPI) { |
+ if (gluCheckExtension( |
+ reinterpret_cast<const GLubyte*>("GLX_EXT_create_context_es2_profile"), |
+ reinterpret_cast<const GLubyte*>(glxExts))) { |
+ fContext = glXCreateContextAttribsARB(fDisplay, bestFbc, 0, True, |
+ context_attribs_gles); |
+ } |
} else { |
- // Couldn't create GL 3.0 context. |
- // Fall back to old-style 2.x context. |
- // When a context version below 3.0 is requested, |
- // implementations will return the newest context version compatible |
- // with OpenGL versions less than version 3.0. |
- |
- // GLX_CONTEXT_MAJOR_VERSION_ARB = 1 |
- context_attribs[1] = 1; |
- // GLX_CONTEXT_MINOR_VERSION_ARB = 0 |
- context_attribs[3] = 0; |
- |
- ctxErrorOccurred = false; |
- |
- //SkDebugf("Failed to create GL 3.0 context." |
- // " Using old-style GLX context.\n"); |
- fContext = glXCreateContextAttribsARB( |
- fDisplay, bestFbc, 0, True, context_attribs |
- ); |
+ fContext = glXCreateContextAttribsARB(fDisplay, bestFbc, 0, True, context_attribs_gl); |
+ |
+ // Sync to ensure any errors generated are processed. |
+ XSync(fDisplay, False); |
+ if (ctxErrorOccurred || !fContext) { |
+ // Couldn't create GL 3.0 context. |
+ // Fall back to old-style 2.x context. |
+ // When a context version below 3.0 is requested, |
+ // implementations will return the newest context version |
+ // compatible with OpenGL versions less than version 3.0. |
+ |
+ ctxErrorOccurred = false; |
+ |
+ fContext = glXCreateContextAttribsARB(fDisplay, bestFbc, 0, True, |
+ context_attribs_gl_fallback); |
+ } |
} |
} |
#endif |