Use glGetStringi to get extensions when available.
Review URL: https://codereview.chromium.org/12328111

git-svn-id: http://skia.googlecode.com/svn/trunk@7872 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/gpu/gl/GrGLInterface.cpp b/src/gpu/gl/GrGLInterface.cpp
index 61020bc..f1be64f 100644
--- a/src/gpu/gl/GrGLInterface.cpp
+++ b/src/gpu/gl/GrGLInterface.cpp
@@ -7,7 +7,8 @@
 
 
 #include "gl/GrGLInterface.h"
-#include "GrGLUtil.h"
+#include "gl/GrGLExtensions.h"
+#include "gl/GrGLUtil.h"
 
 #include <stdio.h>
 
@@ -37,6 +38,11 @@
     if (0 == (binding & fBindingsExported)) {
         return false;
     }
+    
+    GrGLExtensions extensions;
+    if (!extensions.init(binding, this)) {
+        return false;
+    }
 
     // functions that are always required
     if (NULL == fActiveTexture ||
@@ -131,9 +137,7 @@
         return false;
     }
 
-    const char* ext;
     GrGLVersion glVer = GrGLGetVersion(this);
-    ext = (const char*)fGetString(GR_GL_EXTENSIONS);
 
     // Now check that baseline ES/Desktop fns not covered above are present
     // and that we have fn pointers for any advertised extensions that we will
@@ -160,15 +164,13 @@
         if (glVer >= GR_GL_VER(3,0) && NULL == fBindFragDataLocation) {
             return false;
         }
-        if (glVer >= GR_GL_VER(2,0) ||
-            GrGLHasExtensionFromString("GL_ARB_draw_buffers", ext)) {
+        if (glVer >= GR_GL_VER(2,0) || extensions.has("GL_ARB_draw_buffers")) {
             if (NULL == fDrawBuffers) {
                 return false;
             }
         }
 
-        if (glVer >= GR_GL_VER(1,5) ||
-            GrGLHasExtensionFromString("GL_ARB_occlusion_query", ext)) {
+        if (glVer >= GR_GL_VER(1,5) || extensions.has("GL_ARB_occlusion_query")) {
             if (NULL == fGenQueries ||
                 NULL == fDeleteQueries ||
                 NULL == fBeginQuery ||
@@ -180,15 +182,14 @@
             }
         }
         if (glVer >= GR_GL_VER(3,3) ||
-            GrGLHasExtensionFromString("GL_ARB_timer_query", ext) ||
-            GrGLHasExtensionFromString("GL_EXT_timer_query", ext)) {
+            extensions.has("GL_ARB_timer_query") ||
+            extensions.has("GL_EXT_timer_query")) {
             if (NULL == fGetQueryObjecti64v ||
                 NULL == fGetQueryObjectui64v) {
                 return false;
             }
         }
-        if (glVer >= GR_GL_VER(3,3) ||
-            GrGLHasExtensionFromString("GL_ARB_timer_query", ext)) {
+        if (glVer >= GR_GL_VER(3,3) || extensions.has("GL_ARB_timer_query")) {
             if (NULL == fQueryCounter) {
                 return false;
             }
@@ -202,7 +203,7 @@
              NULL == fLoadMatrixf)) {
             return false;
         }
-        if (false && GrGLHasExtensionFromString("GL_NV_path_rendering", ext)) {
+        if (false && extensions.has("GL_NV_path_rendering")) {
             if (NULL == fPathCommands ||
                 NULL == fPathCoords ||
                 NULL == fPathSubCommands ||
@@ -259,8 +260,8 @@
 
     // optional function on desktop before 1.3
     if (kDesktop_GrGLBinding != binding ||
-        (glVer >= GR_GL_VER(1,3) ||
-        GrGLHasExtensionFromString("GL_ARB_texture_compression", ext))) {
+        (glVer >= GR_GL_VER(1,3)) ||
+        extensions.has("GL_ARB_texture_compression")) {
         if (NULL == fCompressedTexImage2D) {
             return false;
         }
@@ -279,13 +280,13 @@
     // There is a desktop ARB extension and an ES+desktop EXT extension
     if (kDesktop_GrGLBinding == binding) {
         if (glVer >= GR_GL_VER(4,2) ||
-            GrGLHasExtensionFromString("GL_ARB_texture_storage", ext) ||
-            GrGLHasExtensionFromString("GL_EXT_texture_storage", ext)) {
+            extensions.has("GL_ARB_texture_storage") ||
+            extensions.has("GL_EXT_texture_storage")) {
             if (NULL == fTexStorage2D) {
                 return false;
             }
         }
-    } else if (GrGLHasExtensionFromString("GL_EXT_texture_storage", ext)) {
+    } else if (extensions.has("GL_EXT_texture_storage")) {
         if (NULL == fTexStorage2D) {
             return false;
         }
@@ -294,29 +295,29 @@
     // FBO MSAA
     if (kDesktop_GrGLBinding == binding) {
         // GL 3.0 and the ARB extension have multisample + blit
-        if (glVer >= GR_GL_VER(3,0) || GrGLHasExtensionFromString("GL_ARB_framebuffer_object", ext)) {
+        if (glVer >= GR_GL_VER(3,0) || extensions.has("GL_ARB_framebuffer_object")) {
             if (NULL == fRenderbufferStorageMultisample ||
                 NULL == fBlitFramebuffer) {
                 return false;
             }
         } else {
-            if (GrGLHasExtensionFromString("GL_EXT_framebuffer_blit", ext) &&
+            if (extensions.has("GL_EXT_framebuffer_blit") &&
                 NULL == fBlitFramebuffer) {
                 return false;
             }
-            if (GrGLHasExtensionFromString("GL_EXT_framebuffer_multisample", ext) &&
+            if (extensions.has("GL_EXT_framebuffer_multisample") &&
                 NULL == fRenderbufferStorageMultisample) {
                 return false;
             }
         }
     } else {
-        if (GrGLHasExtensionFromString("GL_CHROMIUM_framebuffer_multisample", ext)) {
+        if (extensions.has("GL_CHROMIUM_framebuffer_multisample")) {
             if (NULL == fRenderbufferStorageMultisample ||
                 NULL == fBlitFramebuffer) {
                 return false;
             }
         }
-        if (GrGLHasExtensionFromString("GL_APPLE_framebuffer_multisample", ext)) {
+        if (extensions.has("GL_APPLE_framebuffer_multisample")) {
             if (NULL == fRenderbufferStorageMultisample ||
                 NULL == fResolveMultisampleFramebuffer) {
                 return false;
@@ -327,8 +328,7 @@
     // On ES buffer mapping is an extension. On Desktop
     // buffer mapping was part of original VBO extension
     // which we require.
-    if (kDesktop_GrGLBinding == binding ||
-        GrGLHasExtensionFromString("GL_OES_mapbuffer", ext)) {
+    if (kDesktop_GrGLBinding == binding || extensions.has("GL_OES_mapbuffer")) {
         if (NULL == fMapBuffer ||
             NULL == fUnmapBuffer) {
             return false;
@@ -337,12 +337,17 @@
 
     // Dual source blending
     if (kDesktop_GrGLBinding == binding &&
-        (glVer >= GR_GL_VER(3,3) ||
-         GrGLHasExtensionFromString("GL_ARB_blend_func_extended", ext))) {
+        (glVer >= GR_GL_VER(3,3) || extensions.has("GL_ARB_blend_func_extended"))) {
         if (NULL == fBindFragDataLocationIndexed) {
             return false;
         }
     }
+    
+    if (kDesktop_GrGLBinding == binding && glVer >= GR_GL_VER(3, 0)) {
+        if (NULL == fGetStringi) {
+            return false;
+        }
+    }
 
     return true;
 }