| 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
 | 
| 
 |