Cleanup including of GL headers and provide way to include custom headers, extension getter.

git-svn-id: http://skia.googlecode.com/svn/trunk@713 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/gpu/include/GrGLConfig.h b/gpu/include/GrGLConfig.h
index 0d18db1..5c23495 100644
--- a/gpu/include/GrGLConfig.h
+++ b/gpu/include/GrGLConfig.h
@@ -20,146 +20,166 @@
 
 #include "GrTypes.h"
 
-#if GR_CHROME_BUILD // temporary build-flag, orthogonal to mac/win/linux
-    #define GR_INCLUDE_GLES2        <GLES2/gl2.h>
-    #define GR_INCLUDE_GLES2ext     <GLES2/gl2ext.h>
-    #define GR_GL_FUNC
-#elif GR_WIN32_BUILD
-    // glew has to be included before gl
-    #define GR_INCLUDE_GLDESKTOP    <GL/glew.h>
-    #define GR_INCLUDE_GLDESKTOPext <GL/gl.h>
-    #define GR_GL_FUNC __stdcall
-    // undo stupid windows defines
-    #undef near
-    #undef far
-#elif GR_MAC_BUILD
-    #define GR_INCLUDE_GLDESKTOP    <OpenGL/gl.h>
-    #define GR_INCLUDE_GLDESKTOPext <OpenGL/glext.h>
-    #define GR_GL_FUNC
-#elif GR_IOS_BUILD
-    #define GR_INCLUDE_GLES1       <OpenGLES/ES1/gl.h>
-    #define GR_INCLUDE_GLES1ext    <OpenGLES/ES1/glext.h>
-    #define GR_INCLUDE_GLES2       <OpenGLES/ES2/gl.h>
-    #define GR_INCLUDE_GLES2ext    <OpenGLES/ES2/glext.h>
-    #define GR_GL_FUNC
-#elif GR_ANDROID_BUILD
-    #ifndef GL_GLEXT_PROTOTYPES
-        #define GL_GLEXT_PROTOTYPES
+#if !defined(GR_GL_CUSTOM_SETUP)
+    #define GR_GL_CUSTOM_SETUP 0
+#endif
+/**
+ * We need to pull in the right GL headers and determine whether we are
+ * compiling for ES1, ES2, or desktop GL. (We allow ES1 and ES2 to both be
+ * supported in the same build but not ESx and desktop). We also need to know
+ * the platform-specific way to get extension function pointers (e.g.
+ * eglGetProcAddress). The port specifies this info explicitly or we will infer
+ * it from the GR_*_BUILD flag.
+ *
+ * To specify GL setup directly define GR_GL_CUSTOM_SETUP to 1 and define:
+ *      GR_SUPPORT_GLDESKTOP or (GR_SUPPORT_GLES1 and/or GR_SUPPORT_GLES2) to 1
+ *
+ *      if GR_SUPPORT_GLDESKTOP is 1 then provide:
+ *          1. The name of your GL header in GR_INCLUDE_GLDESKTOP
+ *          2. If necessary, the name of a file that includes extension
+ *             definitions in GR_INCLUDE_GLDESKTOPext.
+ *      if GR_SUPPORT_GLES1 is 1 then provide:
+ *          1. The name of your GL header in GR_INCLUDE_GLES1
+ *          2. If necessary, the name of a file that includes extension
+ *             definitions in GR_INCLUDE_GLES1ext.
+ *      if GR_SUPPORT_GLES2 is 1 then provide:
+ *          1. The name of your GL header in GR_INCLUDE_GLES2
+ *          2. If necessary, the name of a file that includes extension
+ *             definitions in GR_INCLUDE_GLES2ext.
+ *
+ *      Optionally, define GR_GL_FUNC to any qualifier needed on GL function
+ *      pointer declarations (e.g. __stdcall).
+ *
+ *      Define GR_GL_PROC_ADDRESS to take a gl function and produce a
+ *      function pointer. Two examples:
+ *          1. Your platform doesn't require a proc address function, just take
+ *             the address of the function:
+ *             #define GR_GL_PROC_ADDRESS(X) &X
+ *          2. Your platform uses eglGetProcAddress:
+ *             #define GR_GL_PROC_ADDRESS eglGetProcAddress(#X)
+ *
+ *     Optionally define GR_GL_PROC_ADDRESS_HEADER to include any additional
+ *     header necessary to use GR_GL_PROC_ADDRESS (e.g. <EGL/egl.h>)
+ *
+ * Alternatively, define GR_GL_CUSTOM_SETUP_HEADER (and not GR_GL_CUSTOM_SETUP)
+ * to a header that can be included. This file should:
+ *      1. Define the approprate GR_SUPPORT_GL* macro(s) to 1
+ *      2. Includes all necessary GL headers.
+ *      3. Optionally define GR_GL_FUNC.
+ *      4. Define GR_GL_PROC_ADDRESS.
+ *      5. Optionally define GR_GL_PROC_ADDRESS_HEADER
+ */
+
+#if GR_GL_CUSTOM_SETUP
+
+    #ifdef GR_SUPPORT_GLES1
+        #include GR_INCLUDE_GLES1
+        #if defined(GR_INCLUDE_GLES1ext)
+            #include GR_INCLUDE_GLES1ext
+        #endif
     #endif
-    #define GR_INCLUDE_GLES2        <GLES2/gl2.h>
-    #define GR_INCLUDE_GLES2ext     <GLES2/gl2ext.h>
-    #define GR_GL_FUNC
-#elif GR_LINUX_BUILD
-    // need to distinguish between ES and Deskop versions for linux
-    #ifndef GL_GLEXT_PROTOTYPES
-        #define GL_GLEXT_PROTOTYPES
+
+    #ifdef GR_SUPPORT_GLES2
+        #include GR_INCLUDE_GLES2
+        #if defined(GR_INCLUDE_GLES2ext)
+            #include GR_INCLUDE_GLES2ext
+        #endif
     #endif
-    #define GR_INCLUDE_GLDESKTOP    <GL/gl.h>
-    #define GR_INCLUDE_GLDESKTOPext <GL/glext.h>
-//    #define GR_INCLUDE_GLES1        <GLES/gl.h>
-//    #define GR_INCLUDE_GLES1ext     <GLES/glext.h>
-//    #define GR_INCLUDE_GLES2        <GLES2/gl2.h>
-//    #define GR_INCLUDE_GLES2ext     <GLES2/gl2ext.h>
-    #define GR_GL_FUNC
-#elif GR_QNX_BUILD
-    #ifndef GL_GLEXT_PROTOTYPES
-        #define GL_GLEXT_PROTOTYPES
+
+    #ifdef GR_SUPPORT_GLDESKTOP
+        #include GR_INCLUDE_GLDESKTOP
+        #if defined(GR_INCLUDE_GLDESKTOPext)
+            #include GR_INCLUDE_GLDESKTOPext
+        #endif
     #endif
-    // This is needed by the QNX GLES2 headers
-    #define GL_API_EXT
-    #define GR_INCLUDE_GLES2        <GLES2/gl2.h>
-    #define GR_INCLUDE_GLES2ext     <GLES2/gl2ext.h>
-    #define GR_INCLUDE_EGL          <EGL/egl.h>
-    #define GR_GL_FUNC
+
+#elif defined(GR_GL_CUSTOM_SETUP_HEADER)
+
+    #include GR_GL_CUSTOM_SETUP_HEADER
+
 #else
-    #error "unsupported GR_???_BUILD"
-#endif
 
-// Ensure we're at least defined
-//
-
-#ifndef GR_SUPPORT_GLES1
-    #if defined(GR_INCLUDE_GLES1)
-        #define GR_SUPPORT_GLES1        1
+    #if GR_WIN32_BUILD
+        #define GR_SUPPORT_GLDESKTOP        1
+        // glew has to be included before gl
+        #include <GL/glew.h>
+        #include <GL/gl.h>
+        // remove stupid windows defines
+        #undef near
+        #undef far
+        #define GR_GL_FUNC __stdcall
+        #define GR_GL_PROC_ADDRESS(X)       wglGetProcAddress(#X)
+        #define GR_GL_PROC_ADDRESS_HEADER   <windows.h>
+    #elif GR_MAC_BUILD
+        #define GR_SUPPORT_GLDESKTOP        1
+        #include <OpenGL/gl.h>
+        #include <OpenGL/glext.h>
+        #define GR_GL_PROC_ADDRESS(X)       &X
+    #elif GR_IOS_BUILD
+        #define GR_SUPPORT_GLES1            1
+        #include <OpenGLES/ES1/gl.h>
+        #include <OpenGLES/ES1/glext.h>
+        #define GR_SUPPORT_GLES2            1
+        #include <OpenGLES/ES2/gl.h>
+        #include <OpenGLES/ES2/glext.h>
+        #define GR_GL_PROC_ADDRESS(X)       &X
+    #elif GR_ANDROID_BUILD
+        #ifndef GL_GLEXT_PROTOTYPES
+            #define GL_GLEXT_PROTOTYPES
+        #endif
+        #define GR_SUPPORT_GLES2            1
+        #include <GLES2/gl2.h>
+        #include <GLES2/gl2ext.h>
+        #define GR_GL_PROC_ADDRESS(X)       eglGetProcAddress(#X)
+        #define GR_GL_PROC_ADDRESS_HEADER   <EGL/egl.h>
+    #elif GR_QNX_BUILD
+        #ifndef GL_GLEXT_PROTOTYPES
+            #define GL_GLEXT_PROTOTYPES
+        #endif
+         #define GR_SUPPORT_GLES2           1
+        // This is needed by the QNX GLES2 headers
+        #define GL_API_EXT
+        #include <GLES2/gl2.h>
+        #include <GLES2/gl2ext.h>
+        #define GR_GL_PROC_ADDRESS(X)       eglGetProcAddress(#X)
+        #define GR_GL_PROC_ADDRESS_HEADER   <EGL/egl.h>
+    #elif GR_LINUX_BUILD
+        #define GR_SUPPORT_GLDESKTOP        1
+        #include <GL/gl.h>
+        #include <GL/glext.h>
+        #define GR_GL_PROC_ADDRESS(X)       eglGetProcAddress(#X)
+        #define GR_GL_PROC_ADDRESS_HEADER   <EGL/egl.h>
     #else
-        #define GR_SUPPORT_GLES1        0
+        #error "unsupported GR_???_BUILD"
     #endif
+
 #endif
 
-#ifndef GR_SUPPORT_GLES2
-    #if defined(GR_INCLUDE_GLES2)
-        #define GR_SUPPORT_GLES2        1
-    #else
-        #define GR_SUPPORT_GLES2        0
-    #endif
+#if !defined(GR_SUPPORT_GLDESKTOP)
+    #define GR_SUPPORT_GLDESKTOP    0
+#endif
+#if !defined(GR_SUPPORT_GLES1)
+    #define GR_SUPPORT_GLES1        0
+#endif
+#if !defined(GR_SUPPORT_GLES2)
+    #define GR_SUPPORT_GLES2        0
 #endif
 
-#define GR_SUPPORT_GLES (GR_SUPPORT_GLES1 || GR_SUPPORT_GLES2)
+#define GR_SUPPORT_GLES ((GR_SUPPORT_GLES1) || (GR_SUPPORT_GLES2))
 
-#ifndef GR_SUPPORT_GLDESKTOP
-    #if defined(GR_INCLUDE_GLDESKTOP)
-        #define GR_SUPPORT_GLDESKTOP    1
-    #else
-        #define GR_SUPPORT_GLDESKTOP    0
-    #endif
+#if !(GR_SUPPORT_GLES) != !(GR_SUPPORT_DESKTOP)
+    #error "Either desktop of ES GL must be supported but not both"
 #endif
 
-#ifndef GR_SUPPORT_EGL
-    #if defined(GR_INCLUDE_EGL)
-        #define GR_SUPPORT_EGL          1
-    #else
-        #define GR_SUPPORT_EGL          0
-    #endif
-#endif
-// Filter the includes based on what we support
-//
-
-#if !GR_SUPPORT_GLES1
-    #undef GR_INCLUDE_GLES1
-    #undef GR_INCLUDE_GLES1ext
+#if !defined(GR_GL_FUNC)
+    #define GR_GL_FUNC
 #endif
 
-#if !GR_SUPPORT_GLES2
-    #undef GR_INCLUDE_GLES2
-    #undef GR_INCLUDE_GLES2ext
+#if !defined(GR_GL_PROC_ADDRESS)
+    #error "Must define GR_GL_PROC_ADDRESS"
 #endif
 
-#if !GR_SUPPORT_GLDESKTOP
-    #undef GR_INCLUDE_GLDESKTOP
-    #undef GR_INCLUDE_GLDESKTOPext
-#endif
-
-#if !GR_SUPPORT_EGL
-    #undef GR_INCLUDE_EGL
-#endif
-
-// Begin including GL headers
-//
-
-#ifdef GR_INCLUDE_GLES1
-    #include GR_INCLUDE_GLES1
-#endif
-#ifdef GR_INCLUDE_GLES1ext
-    #include GR_INCLUDE_GLES1ext
-#endif
-#ifdef GR_INCLUDE_GLES2
-    #include GR_INCLUDE_GLES2
-#endif
-#ifdef GR_INCLUDE_GLES2ext
-    #include GR_INCLUDE_GLES2ext
-#endif
-#ifdef GR_INCLUDE_GLDESKTOP
-    #include GR_INCLUDE_GLDESKTOP
-#endif
-#ifdef GR_INCLUDE_GLDESKTOPext
-    #include GR_INCLUDE_GLDESKTOPext
-#endif
-#ifdef GR_INCLUDE_EGL
-    #include GR_INCLUDE_EGL
-#endif
-
-//
-// End including GL headers
+////////////////////////////////////////////////////////////////////////////////
 
 #if GR_SCALAR_IS_FIXED
     #define GrGLType   GL_FIXED
@@ -193,8 +213,8 @@
 #endif
 
 ////////////////////////////////////////////////////////////////////////////////
-// setup for opengl ES/desktop extensions
-// we make a struct of function pointers so that each GL context
+// Setup for opengl ES/desktop extensions
+// We make a struct of function pointers so that each GL context
 // can have it's own struct. (Some environments may have different proc
 // addresses for different contexts).
 
@@ -289,6 +309,7 @@
 #define GR_PALETTE8_RGBA8           0x8B91
 
 extern void GrGLInitExtensions(GrGLExts* exts);
+
 ////////////////////////////////////////////////////////////////////////////////
 
 extern void GrGLCheckErr(const char* location, const char* call);
diff --git a/gpu/include/GrUserConfig.h b/gpu/include/GrUserConfig.h
index 42a977b..2d46b9f 100644
--- a/gpu/include/GrUserConfig.h
+++ b/gpu/include/GrUserConfig.h
@@ -56,9 +56,6 @@
  *  temporary flags (may go away soon)
  */
 
-// specific changes for current Chrome build
-//#define GR_CHROME_BUILD     1
-
 // disable 2-point-radial gradient shader programs
 //#define GR_SKIP_2POINTRADIAL_PROGRAMS
 
diff --git a/gpu/src/GrGLUtil.cpp b/gpu/src/GrGLUtil.cpp
new file mode 100644
index 0000000..f961194
--- /dev/null
+++ b/gpu/src/GrGLUtil.cpp
@@ -0,0 +1,256 @@
+/*

+ Copyright 2010 Google Inc.

+

+ Licensed under the Apache License, Version 2.0 (the "License");

+ you may not use this file except in compliance with the License.

+ You may obtain a copy of the License at

+

+ http://www.apache.org/licenses/LICENSE-2.0

+

+ Unless required by applicable law or agreed to in writing, software

+ distributed under the License is distributed on an "AS IS" BASIS,

+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+ See the License for the specific language governing permissions and

+ limitations under the License.

+ */

+

+#include "GrGLConfig.h"

+#include <stdio.h>

+

+bool has_gl_extension(const char* ext) {

+    const char* glstr = (const char*) glGetString(GL_EXTENSIONS);

+

+    int extLength = strlen(ext);

+

+    while (true) {

+        int n = strcspn(glstr, " ");

+        if (n == extLength && 0 == strncmp(ext, glstr, n)) {

+            return true;

+        }

+        if (0 == glstr[n]) {

+            return false;

+        }

+        glstr += n+1;

+    }

+}

+

+void gl_version(int* major, int* minor) {

+    const char* v = (const char*) glGetString(GL_VERSION);

+    if (NULL == v) {

+        GrAssert(0);

+        *major = 0;

+        *minor = 0;

+        return;

+    }

+#if GR_SUPPORT_GLDESKTOP

+    int n = sscanf(v, "%d.%d", major, minor);

+    if (n != 2) {

+        GrAssert(0);

+        *major = 0;

+        *minor = 0;

+        return;

+    }

+#else

+    char profile[2];

+    int n = sscanf(v, "OpenGL ES-%c%c %d.%d", profile, profile+1, major, minor);

+    bool ok = 4 == n;

+    if (!ok) {

+        int n = sscanf(v, "OpenGL ES %d.%d", major, minor);

+        ok = 2 == n;

+    }

+    if (!ok) {

+        GrAssert(0);

+        *major = 0;

+        *minor = 0;

+        return;

+    }

+#endif

+}

+

+#if defined(GR_GL_PROC_ADDRESS_HEADER)

+    #include GR_GL_PROC_ADDRESS_HEADER

+#endif

+

+typedef void (*glProc)(void);

+

+#define GET_PROC(EXT_STRUCT, PROC_NAME) \

+    *((glProc*) &(EXT_STRUCT-> PROC_NAME)) = (glProc) GR_GL_PROC_ADDRESS((gl ## PROC_NAME)); \

+    GrAssert(NULL != EXT_STRUCT-> PROC_NAME)

+

+#define GET_SUFFIX_PROC(EXT_STRUCT, PROC_NAME, SUFFIX) \

+    *((glProc*) &(EXT_STRUCT-> PROC_NAME)) = (glProc) GR_GL_PROC_ADDRESS((gl ## PROC_NAME ## SUFFIX)); \

+    GrAssert(NULL != EXT_STRUCT-> PROC_NAME)

+

+extern void GrGLInitExtensions(GrGLExts* exts) {

+    exts->GenFramebuffers                   = NULL;

+    exts->BindFramebuffer                   = NULL;

+    exts->FramebufferTexture2D              = NULL;

+    exts->CheckFramebufferStatus            = NULL;

+    exts->DeleteFramebuffers                = NULL;

+    exts->RenderbufferStorage               = NULL;

+    exts->GenRenderbuffers                  = NULL;

+    exts->DeleteRenderbuffers               = NULL;

+    exts->FramebufferRenderbuffer           = NULL;

+    exts->BindRenderbuffer                  = NULL;

+    exts->RenderbufferStorageMultisample    = NULL;

+    exts->BlitFramebuffer                   = NULL;

+    exts->ResolveMultisampleFramebuffer     = NULL;

+    exts->FramebufferTexture2DMultisample   = NULL;

+    exts->MapBuffer                         = NULL;

+    exts->UnmapBuffer                       = NULL;

+

+    GLint major, minor;

+    gl_version(&major, &minor);

+#if GR_SUPPORT_GLDESKTOP

+

+    bool fboFound = false;

+    #if GL_VERSION_3_0

+    if (!fboFound && major >= 3) { // all of ARB_fbo is in 3.x

+        exts->GenFramebuffers                   = glGenFramebuffers;

+        exts->BindFramebuffer                   = glBindFramebuffer;

+        exts->FramebufferTexture2D              = glFramebufferTexture2D;

+        exts->CheckFramebufferStatus            = glCheckFramebufferStatus;

+        exts->DeleteFramebuffers                = glDeleteFramebuffers;

+        exts->RenderbufferStorage               = glRenderbufferStorage;

+        exts->GenRenderbuffers                  = glGenRenderbuffers;

+        exts->DeleteRenderbuffers               = glDeleteRenderbuffers;

+        exts->FramebufferRenderbuffer           = glFramebufferRenderbuffer;

+        exts->BindRenderbuffer                  = glBindRenderbuffer;

+        exts->RenderbufferStorageMultisample    = glRenderbufferStorageMultisample;

+        exts->BlitFramebuffer                   = glBlitFramebuffer;

+        fboFound = true;

+    }

+    #endif

+    #if GL_ARB_framebuffer_object

+    if (!fboFound && has_gl_extension("GL_ARB_framebuffer_object")) {

+        // GL_ARB_framebuffer_object doesn't use ARB suffix.

+        GET_PROC(exts, GenFramebuffers);

+        GET_PROC(exts, BindFramebuffer);

+        GET_PROC(exts, FramebufferTexture2D);

+        GET_PROC(exts, CheckFramebufferStatus);

+        GET_PROC(exts, DeleteFramebuffers);

+        GET_PROC(exts, RenderbufferStorage);

+        GET_PROC(exts, GenRenderbuffers);

+        GET_PROC(exts, DeleteRenderbuffers);

+        GET_PROC(exts, FramebufferRenderbuffer);

+        GET_PROC(exts, BindRenderbuffer);

+        GET_PROC(exts, RenderbufferStorageMultisample);

+        GET_PROC(exts, BlitFramebuffer);

+        fboFound = true;

+    }

+    #endif

+    // Mac doesn't declare prototypes for EXT FBO extensions

+    #if GL_EXT_framebuffer_object && !GR_MAC_BUILD

+    if (!fboFound && has_gl_extension("GL_EXT_framebuffer_object")) {

+        GET_SUFFIX_PROC(exts, GenFramebuffers, EXT);

+        GET_SUFFIX_PROC(exts, BindFramebuffer, EXT);

+        GET_SUFFIX_PROC(exts, FramebufferTexture2D, EXT);

+        GET_SUFFIX_PROC(exts, CheckFramebufferStatus, EXT);

+        GET_SUFFIX_PROC(exts, DeleteFramebuffers, EXT);

+        GET_SUFFIX_PROC(exts, RenderbufferStorage, EXT);

+        GET_SUFFIX_PROC(exts, GenRenderbuffers, EXT);

+        GET_SUFFIX_PROC(exts, DeleteRenderbuffers, EXT);

+        GET_SUFFIX_PROC(exts, FramebufferRenderbuffer, EXT);

+        GET_SUFFIX_PROC(exts, BindRenderbuffer, EXT);

+        fboFound = true;

+        // check for fbo ms and fbo blit

+        #if GL_EXT_framebuffer_multisample

+        if (has_gl_extension("GL_EXT_framebuffer_multisample")) {

+            GET_SUFFIX_PROC(exts, RenderbufferStorageMultisample, EXT);

+        }

+        #endif

+        #if GL_EXT_framebuffer_blit

+        if (has_gl_extension("GL_EXT_framebuffer_blit")) {

+            GET_SUFFIX_PROC(exts, BlitFramebuffer, EXT);

+        }

+        #endif

+    }

+    #endif

+    if (!fboFound) {

+        // we require some form of FBO

+        GrAssert(!"No FBOs supported?");

+    }

+    // we assume we have at least GL 1.5 or higher (VBOs introduced in 1.5)

+    exts->MapBuffer     = glMapBuffer;

+    exts->UnmapBuffer   = glUnmapBuffer;

+#else // !GR_SUPPORT_GLDESKTOP

+    bool foundFBO = false;

+    #if GR_SUPPORT_GLES2

+    if (!fboFound && major >= 2) {// ES 2.0 supports FBO

+        exts->GenFramebuffers                   = glGenFramebuffers;

+        exts->BindFramebuffer                   = glBindFramebuffer;

+        exts->FramebufferTexture2D              = glFramebufferTexture2D;

+        exts->CheckFramebufferStatus            = glCheckFramebufferStatus;

+        exts->DeleteFramebuffers                = glDeleteFramebuffers;

+        exts->RenderbufferStorage               = glRenderbufferStorage;

+        exts->GenRenderbuffers                  = glGenRenderbuffers;

+        exts->DeleteRenderbuffers               = glDeleteRenderbuffers;

+        exts->FramebufferRenderbuffer           = glFramebufferRenderbuffer;

+        exts->BindRenderbuffer                  = glBindRenderbuffer;

+        fboFound = true;

+    }

+    #endif

+    #if !GL_OES_framebuffer_object

+    if (!fboFound && has_gl_extension("GL_OES_framebuffer_object")) {

+        GET_SUFFIX_PROC(exts, GenFramebuffers, OES);

+        GET_SUFFIX_PROC(exts, BindFramebuffer, OES);

+        GET_SUFFIX_PROC(exts, FramebufferTexture2D, OES);

+        GET_SUFFIX_PROC(exts, CheckFramebufferStatus, OES);

+        GET_SUFFIX_PROC(exts, DeleteFramebuffers, OES);

+        GET_SUFFIX_PROC(exts, RenderbufferStorage, OES);

+        GET_SUFFIX_PROC(exts, GenRenderbuffers, OES);

+        GET_SUFFIX_PROC(exts, DeleteRenderbuffers, OES);

+        GET_SUFFIX_PROC(exts, FramebufferRenderbuffer, OES);

+        GET_SUFFIX_PROC(exts, BindRenderbuffer, OES);

+    }

+    #endif

+

+    if (!fboFound) {

+        // we require some form of FBO

+        GrAssert(!"No FBOs supported?");

+    }

+

+    #if GL_APPLE_framebuffer_multisample

+    if (has_gl_extension("GL_APPLE_framebuffer_multisample")) {

+        GET_SUFFIX_PROC(exts, ResolveMultisampleFramebuffer, APPLE);

+    }

+    #endif

+

+    #if GL_IMG_multisampled_render_to_texture

+    if (has_gl_extension("GL_IMG_multisampled_render_to_texture")) {

+        GET_SUFFIX_PROC(exts, FramebufferTexture2DMultisample, IMG);

+    }

+    #endif

+

+    #if GL_OES_mapbuffer

+    if (has_gl_extension("GL_OES_mapbuffer")) {

+        GET_SUFFIX_PROC(exts, MapBuffer, OES);

+        GET_SUFFIX_PROC(exts, UnmapBuffer, OES);

+    }

+    #endif

+#endif // !GR_SUPPORT_GLDESKTOP

+}

+

+
+///////////////////////////////////////////////////////////////////////////////
+
+void GrGLCheckErr(const char* location, const char* call) {
+    uint32_t err =  glGetError();
+    if (GL_NO_ERROR != err) {
+        GrPrintf("---- glGetError %x", err);
+        if (NULL != location) {
+            GrPrintf(" at\n\t%s", location);
+        }
+        if (NULL != call) {
+            GrPrintf("\n\t\t%s", call);
+        }
+        GrPrintf("\n");
+    }
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+bool gPrintGL = true;
+
+
+

diff --git a/gpu/src/GrGpuGL.cpp b/gpu/src/GrGpuGL.cpp
index 2951895..0198481 100644
--- a/gpu/src/GrGpuGL.cpp
+++ b/gpu/src/GrGpuGL.cpp
@@ -16,7 +16,6 @@
 
 #include "GrGpuGL.h"
 #include "GrMemory.h"
-#include <stdio.h>
 #if GR_WIN32_BUILD
     // need to get wglGetProcAddress
     #undef WIN32_LEAN_AND_MEAN
@@ -48,57 +47,13 @@
     GL_ONE_MINUS_DST_ALPHA,
 };
 
-bool has_gl_extension(const char* ext) {
-    const char* glstr = (const char*) glGetString(GL_EXTENSIONS);
 
-    int extLength = strlen(ext);
 
-    while (true) {
-        int n = strcspn(glstr, " ");
-        if (n == extLength && 0 == strncmp(ext, glstr, n)) {
-            return true;
-        }
-        if (0 == glstr[n]) {
-            return false;
-        }
-        glstr += n+1;
-    }
-}
-
-void gl_version(int* major, int* minor) {
-    const char* v = (const char*) glGetString(GL_VERSION);
-    if (NULL == v) {
-        GrAssert(0);
-        *major = 0;
-        *minor = 0;
-        return;
-    }
-#if GR_SUPPORT_GLDESKTOP
-    int n = sscanf(v, "%d.%d", major, minor);
-    if (n != 2) {
-        GrAssert(0);
-        *major = 0;
-        *minor = 0;
-        return;
-    }
-#else
-    char profile[2];
-    int n = sscanf(v, "OpenGL ES-%c%c %d.%d", profile, profile+1, major, minor);
-    bool ok = 4 == n;
-    if (!ok) {
-        int n = sscanf(v, "OpenGL ES %d.%d", major, minor);
-        ok = 2 == n;
-    }
-    if (!ok) {
-        GrAssert(0);
-        *major = 0;
-        *minor = 0;
-        return;
-    }
-#endif
-}
 ///////////////////////////////////////////////////////////////////////////////
 
+static bool gPrintStartupSpew;
+
+
 bool fbo_test(GrGLExts exts, int w, int h) {
 
     GLint savedFBO;
@@ -132,10 +87,6 @@
     return status == GR_FRAMEBUFFER_COMPLETE;
 }
 
-///////////////////////////////////////////////////////////////////////////////
-
-static bool gPrintStartupSpew;
-
 GrGpuGL::GrGpuGL() {
     if (gPrintStartupSpew) {
         GrPrintf("------------------------- create GrGpuGL %p --------------\n",
@@ -527,14 +478,14 @@
 }
 
 GrRenderTarget* GrGpuGL::createRenderTargetFrom3DApiState() {
-    
+
     GrGLRenderTarget::GLRenderTargetIDs rtIDs;
-    
+
     GR_GL_GetIntegerv(GR_FRAMEBUFFER_BINDING, (GLint*)&rtIDs.fRTFBOID);
     rtIDs.fTexFBOID = rtIDs.fRTFBOID;
     rtIDs.fMSColorRenderbufferID = 0;
     rtIDs.fStencilRenderbufferID = 0;
-    
+
     GLint vp[4];
     GR_GL_GetIntegerv(GL_VIEWPORT, vp);
     GrIRect viewportRect;
@@ -1755,197 +1706,3 @@
             return false;
     }
 }
-
-///////////////////////////////////////////////////////////////////////////////
-
-void GrGLCheckErr(const char* location, const char* call) {
-    uint32_t err =  glGetError();
-    if (GL_NO_ERROR != err) {
-        GrPrintf("---- glGetError %x", err);
-        if (NULL != location) {
-            GrPrintf(" at\n\t%s", location);
-        }
-        if (NULL != call) {
-            GrPrintf("\n\t\t%s", call);
-        }
-        GrPrintf("\n");
-    }
-}
-
-///////////////////////////////////////////////////////////////////////////////
-
-typedef void (*glProc)(void);
-
-void get_gl_proc(const char procName[], glProc *address) {
-#if GR_CHROME_BUILD
-    GrAssert(!"should not get called");
-#elif GR_WIN32_BUILD
-    *address = (glProc)wglGetProcAddress(procName);
-    GrAssert(NULL != *address);
-#elif GR_MAC_BUILD || GR_IOS_BUILD
-    GrAssert(!"Extensions don't need to be initialized!");
-#elif GR_ANDROID_BUILD
-    *address = eglGetProcAddress(procName);
-    GrAssert(NULL != *address);
-#elif GR_LINUX_BUILD
-//    GR_STATIC_ASSERT(!"Add environment-dependent implementation here");
-    //*address = glXGetProcAddressARB(procName);
-    *address = NULL;//eglGetProcAddress(procName);
-#elif GR_QNX_BUILD
-    *address = eglGetProcAddress(procName);
-    GrAssert(NULL != *address);
-#else
-    // hopefully we're on a system with EGL
-    *address = eglGetProcAddress(procName);
-    GrAssert(NULL != *address);
-#endif
-}
-
-#define GET_PROC(EXT_STRUCT, PROC_NAME, EXT_TAG) \
-    get_gl_proc("gl" #PROC_NAME #EXT_TAG, (glProc*)&EXT_STRUCT-> PROC_NAME);
-
-extern void GrGLInitExtensions(GrGLExts* exts) {
-    exts->GenFramebuffers                   = NULL;
-    exts->BindFramebuffer                   = NULL;
-    exts->FramebufferTexture2D              = NULL;
-    exts->CheckFramebufferStatus            = NULL;
-    exts->DeleteFramebuffers                = NULL;
-    exts->RenderbufferStorage               = NULL;
-    exts->GenRenderbuffers                  = NULL;
-    exts->DeleteRenderbuffers               = NULL;
-    exts->FramebufferRenderbuffer           = NULL;
-    exts->BindRenderbuffer                  = NULL;
-    exts->RenderbufferStorageMultisample    = NULL;
-    exts->BlitFramebuffer                   = NULL;
-    exts->ResolveMultisampleFramebuffer     = NULL;
-    exts->FramebufferTexture2DMultisample   = NULL;
-    exts->MapBuffer                         = NULL;
-    exts->UnmapBuffer                       = NULL;
-
-#if GR_MAC_BUILD
-    exts->GenFramebuffers                   = glGenFramebuffers;
-    exts->BindFramebuffer                   = glBindFramebuffer;
-    exts->FramebufferTexture2D              = glFramebufferTexture2D;
-    exts->CheckFramebufferStatus            = glCheckFramebufferStatus;
-    exts->DeleteFramebuffers                = glDeleteFramebuffers;
-    exts->RenderbufferStorage               = glRenderbufferStorage;
-    exts->GenRenderbuffers                  = glGenRenderbuffers;
-    exts->DeleteRenderbuffers               = glDeleteRenderbuffers;
-    exts->FramebufferRenderbuffer           = glFramebufferRenderbuffer;
-    exts->BindRenderbuffer                  = glBindRenderbuffer;
-    exts->RenderbufferStorageMultisample    = glRenderbufferStorageMultisample;
-    exts->BlitFramebuffer                   = glBlitFramebuffer;
-    exts->MapBuffer                         = glMapBuffer;
-    exts->UnmapBuffer                       = glUnmapBuffer;
-#elif GR_IOS_BUILD
-    exts->GenFramebuffers                   = glGenFramebuffers;
-    exts->BindFramebuffer                   = glBindFramebuffer;
-    exts->FramebufferTexture2D              = glFramebufferTexture2D;
-    exts->CheckFramebufferStatus            = glCheckFramebufferStatus;
-    exts->DeleteFramebuffers                = glDeleteFramebuffers;
-    exts->RenderbufferStorage               = glRenderbufferStorage;
-    exts->GenRenderbuffers                  = glGenRenderbuffers;
-    exts->DeleteRenderbuffers               = glDeleteRenderbuffers;
-    exts->FramebufferRenderbuffer           = glFramebufferRenderbuffer;
-    exts->BindRenderbuffer                  = glBindRenderbuffer;
-    exts->RenderbufferStorageMultisample    = glRenderbufferStorageMultisampleAPPLE;
-    exts->ResolveMultisampleFramebuffer     = glResolveMultisampleFramebufferAPPLE;
-    exts->MapBuffer                         = glMapBufferOES;
-    exts->UnmapBuffer                       = glUnmapBufferOES;
-#else
-    GLint major, minor;
-    gl_version(&major, &minor);
-    #if GR_SUPPORT_GLDESKTOP
-    if (major >= 3) {// FBO, FBOMS, and FBOBLIT part of 3.0
-        exts->GenFramebuffers                   = glGenFramebuffers;
-        exts->BindFramebuffer                   = glBindFramebuffer;
-        exts->FramebufferTexture2D              = glFramebufferTexture2D;
-        exts->CheckFramebufferStatus            = glCheckFramebufferStatus;
-        exts->DeleteFramebuffers                = glDeleteFramebuffers;
-        exts->RenderbufferStorage               = glRenderbufferStorage;
-        exts->GenRenderbuffers                  = glGenRenderbuffers;
-        exts->DeleteRenderbuffers               = glDeleteRenderbuffers;
-        exts->FramebufferRenderbuffer           = glFramebufferRenderbuffer;
-        exts->BindRenderbuffer                  = glBindRenderbuffer;
-        exts->RenderbufferStorageMultisample    = glRenderbufferStorageMultisample;
-        exts->BlitFramebuffer                   = glBlitFramebuffer;
-    } else if (has_gl_extension("GL_ARB_framebuffer_object")) {
-        GET_PROC(exts, GenFramebuffers, ARB);
-        GET_PROC(exts, BindFramebuffer, ARB);
-        GET_PROC(exts, FramebufferTexture2D, ARB);
-        GET_PROC(exts, CheckFramebufferStatus, ARB);
-        GET_PROC(exts, DeleteFramebuffers, ARB);
-        GET_PROC(exts, RenderbufferStorage, ARB);
-        GET_PROC(exts, GenRenderbuffers, ARB);
-        GET_PROC(exts, DeleteRenderbuffers, ARB);
-        GET_PROC(exts, FramebufferRenderbuffer, ARB);
-        GET_PROC(exts, BindRenderbuffer, ARB);
-        GET_PROC(exts, RenderbufferStorageMultisample, ARB);
-        GET_PROC(exts, BlitFramebuffer, ARB);
-    } else {
-        // we require some form of FBO
-        GrAssert(has_gl_extension("GL_EXT_framebuffer_object"));
-        GET_PROC(exts, GenFramebuffers, EXT);
-        GET_PROC(exts, BindFramebuffer, EXT);
-        GET_PROC(exts, FramebufferTexture2D, EXT);
-        GET_PROC(exts, CheckFramebufferStatus, EXT);
-        GET_PROC(exts, DeleteFramebuffers, EXT);
-        GET_PROC(exts, RenderbufferStorage, EXT);
-        GET_PROC(exts, GenRenderbuffers, EXT);
-        GET_PROC(exts, DeleteRenderbuffers, EXT);
-        GET_PROC(exts, FramebufferRenderbuffer, EXT);
-        GET_PROC(exts, BindRenderbuffer, EXT);
-        if (has_gl_extension("GL_EXT_framebuffer_multisample")) {
-            GET_PROC(exts, RenderbufferStorageMultisample, EXT);
-        }
-        if (has_gl_extension("GL_EXT_framebuffer_blit")) {
-            GET_PROC(exts, BlitFramebuffer, EXT);
-        }
-    }
-    // we assume we have at least GL 1.5 or higher (VBOs introduced in 1.5)
-    exts->MapBuffer     = glMapBuffer;
-    exts->UnmapBuffer   = glUnmapBuffer;
-    #else // !GR_SUPPORT_GLDESKTOP
-    if (major >= 2) {// ES 2.0 supports FBO
-        exts->GenFramebuffers                   = glGenFramebuffers;
-        exts->BindFramebuffer                   = glBindFramebuffer;
-        exts->FramebufferTexture2D              = glFramebufferTexture2D;
-        exts->CheckFramebufferStatus            = glCheckFramebufferStatus;
-        exts->DeleteFramebuffers                = glDeleteFramebuffers;
-        exts->RenderbufferStorage               = glRenderbufferStorage;
-        exts->GenRenderbuffers                  = glGenRenderbuffers;
-        exts->DeleteRenderbuffers               = glDeleteRenderbuffers;
-        exts->FramebufferRenderbuffer           = glFramebufferRenderbuffer;
-        exts->BindRenderbuffer                  = glBindRenderbuffer;
-    } else {
-        // we require some form of FBO
-        GrAssert(has_gl_extension("GL_OES_framebuffer_object"));
-
-        GET_PROC(exts, GenFramebuffers, OES);
-        GET_PROC(exts, BindFramebuffer, OES);
-        GET_PROC(exts, FramebufferTexture2D, OES);
-        GET_PROC(exts, CheckFramebufferStatus, OES);
-        GET_PROC(exts, DeleteFramebuffers, OES);
-        GET_PROC(exts, RenderbufferStorage, OES);
-        GET_PROC(exts, GenRenderbuffers, OES);
-        GET_PROC(exts, DeleteRenderbuffers, OES);
-        GET_PROC(exts, FramebufferRenderbuffer, OES);
-        GET_PROC(exts, BindRenderbuffer, OES);
-    }
-    if (has_gl_extension("GL_APPLE_framebuffer_multisample")) {
-        GET_PROC(exts, ResolveMultisampleFramebuffer, APPLE);
-    }
-    if (has_gl_extension("GL_IMG_multisampled_render_to_texture")) {
-        GET_PROC(exts, FramebufferTexture2DMultisample, IMG);
-    }
-    if (has_gl_extension("GL_OES_mapbuffer")) {
-        GET_PROC(exts, MapBuffer, OES);
-        GET_PROC(exts, UnmapBuffer, OES);
-    }
-    #endif // !GR_SUPPORT_GLDESKTOP
-#endif // BUILD
-}
-
-bool gPrintGL = true;
-
-
diff --git a/gpu/src/GrGpuGLShaders.cpp b/gpu/src/GrGpuGLShaders.cpp
index cacb8d4..c7baf1f 100644
--- a/gpu/src/GrGpuGLShaders.cpp
+++ b/gpu/src/GrGpuGLShaders.cpp
@@ -650,7 +650,7 @@
 
     GrTexture* texture = fCurrDrawState.fTextures[0];
     bool posAsTex =
-            StagePosAsTexCoordVertexLayoutBit(0) & fGeometrySrc.fVertexLayout;
+          !!(StagePosAsTexCoordVertexLayoutBit(0) & fGeometrySrc.fVertexLayout);
 
     if (!VertexUsesStage(0, fGeometrySrc.fVertexLayout)) {
         goto HAVE_NEXT_PROGRAM;
diff --git a/gpu/src/gr_files.mk b/gpu/src/gr_files.mk
index f9ca49e..2665d92 100644
--- a/gpu/src/gr_files.mk
+++ b/gpu/src/gr_files.mk
@@ -11,6 +11,7 @@
     GrGpuGLShaders.cpp \
     GrGpuGLFixed.cpp \
     GrGpuFactory.cpp \
+	GrGLUtil.cpp \
     GrGpuGL.cpp \
     GrInOrderDrawBuffer.cpp \
     GrMatrix.cpp \
@@ -20,4 +21,4 @@
     GrTextureCache.cpp \
     GrTextContext.cpp \
     GrTextStrike.cpp \
-    GrVertexBufferAllocPool.cpp
+    GrVertexBufferAllocPool.cpp