Get correct GLVersion for Mesa to avoid GrContext creation failure

Path originally written by yunchao.he@intel.com

Review URL: https://codereview.chromium.org/15779009/

git-svn-id: http://skia.googlecode.com/svn/trunk@9309 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/gpu/gl/GrGLUtil.cpp b/src/gpu/gl/GrGLUtil.cpp
index f4c5da6..08bbebc 100644
--- a/src/gpu/gl/GrGLUtil.cpp
+++ b/src/gpu/gl/GrGLUtil.cpp
@@ -48,6 +48,37 @@
     }
 }
 
+namespace {
+// Mesa uses a non-standard version string of format: 1.4 Mesa <mesa_major>.<mesa_minor>.
+// The mapping of from mesa version to GL version came from here: http://www.mesa3d.org/intro.html
+bool get_gl_version_for_mesa(int mesaMajorVersion, int* major, int* minor) {
+    switch (mesaMajorVersion) {
+        case 2:
+        case 3:
+        case 4:
+        case 5:
+        case 6:
+            *major = 1;
+            *minor = mesaMajorVersion - 1;
+            return true;
+        case 7:
+            *major = 2;
+            *minor = 1;
+            return true;
+        case 8:
+            *major = 3;
+            *minor = 0;
+            return true;
+        case 9:
+            *major = 3;
+            *minor = 1;
+            return true;
+        default:
+            return false;
+    }
+}
+}
+
 ///////////////////////////////////////////////////////////////////////////////
 
 #if GR_GL_LOG_CALLS
@@ -76,8 +107,7 @@
 
     // check for ES 1
     char profile[2];
-    n = sscanf(versionString, "OpenGL ES-%c%c %d.%d", profile, profile+1,
-               &major, &minor);
+    n = sscanf(versionString, "OpenGL ES-%c%c %d.%d", profile, profile+1, &major, &minor);
     if (4 == n) {
         // we no longer support ES1.
         return kNone_GrGLBinding;
@@ -99,7 +129,18 @@
 
     int major, minor;
 
-    int n = sscanf(versionString, "%d.%d", &major, &minor);
+    // check for mesa
+    int mesaMajor, mesaMinor;
+    int n = sscanf(versionString, "%d.%d Mesa %d.%d", &major, &minor, &mesaMajor, &mesaMinor);
+    if (4 == n) {
+        if (get_gl_version_for_mesa(mesaMajor, &major, &minor)) {
+            return GR_GL_VER(major, minor);
+        } else {
+            return 0;
+        }
+    }
+
+    n = sscanf(versionString, "%d.%d", &major, &minor);
     if (2 == n) {
         return GR_GL_VER(major, minor);
     }