Implementation of a GL-virtualization layer for Skia.  This allows for
environments using skia to specify a GL implementation at run-time, instead of
relying on the linker to pull in the appropriate GL impl.

A new structure, GrGLInterface is exposed.  This struct contains a set of
function pointers that should point to an appropriate GL implementation.

This change also removes the reliance on GLew on windows builds.

Review: http://codereview.appspot.com/4254059/



git-svn-id: http://skia.googlecode.com/svn/trunk@937 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/gpu/src/GrGpuGL.cpp b/gpu/src/GrGpuGL.cpp
index dc9b92d..94e9bfd 100644
--- a/gpu/src/GrGpuGL.cpp
+++ b/gpu/src/GrGpuGL.cpp
@@ -103,8 +103,7 @@
 
 static bool gPrintStartupSpew;
 
-
-static bool fbo_test(GrGLExts exts, int w, int h) {
+static bool fbo_test(int w, int h) {
 
     GLint savedFBO;
     GLint savedTexUnit;
@@ -114,8 +113,8 @@
     GR_GL(ActiveTexture(GL_TEXTURE0 + SPARE_TEX_UNIT));
 
     GLuint testFBO;
-    GR_GLEXT(exts, GenFramebuffers(1, &testFBO));
-    GR_GLEXT(exts, BindFramebuffer(GR_FRAMEBUFFER, testFBO));
+    GR_GL(GenFramebuffers(1, &testFBO));
+    GR_GL(BindFramebuffer(GR_FRAMEBUFFER, testFBO));
     GLuint testRTTex;
     GR_GL(GenTextures(1, &testRTTex));
     GR_GL(BindTexture(GL_TEXTURE_2D, testRTTex));
@@ -125,14 +124,14 @@
     GR_GL(TexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h,
                      0, GL_RGBA, GL_UNSIGNED_BYTE, NULL));
     GR_GL(BindTexture(GL_TEXTURE_2D, 0));
-    GR_GLEXT(exts, FramebufferTexture2D(GR_FRAMEBUFFER, GR_COLOR_ATTACHMENT0,
-                                        GL_TEXTURE_2D, testRTTex, 0));
-    GLenum status = GR_GLEXT(exts, CheckFramebufferStatus(GR_FRAMEBUFFER));
-    GR_GLEXT(exts, DeleteFramebuffers(1, &testFBO));
+    GR_GL(FramebufferTexture2D(GR_FRAMEBUFFER, GR_COLOR_ATTACHMENT0,
+                               GL_TEXTURE_2D, testRTTex, 0));
+    GLenum status = GR_GL(CheckFramebufferStatus(GR_FRAMEBUFFER));
+    GR_GL(DeleteFramebuffers(1, &testFBO));
     GR_GL(DeleteTextures(1, &testRTTex));
 
     GR_GL(ActiveTexture(savedTexUnit));
-    GR_GLEXT(exts, BindFramebuffer(GR_FRAMEBUFFER, savedFBO));
+    GR_GL(BindFramebuffer(GR_FRAMEBUFFER, savedFBO));
 
     return status == GR_FRAMEBUFFER_COMPLETE;
 }
@@ -142,16 +141,18 @@
     if (gPrintStartupSpew) {
         GrPrintf("------------------------- create GrGpuGL %p --------------\n",
                  this);
-        GrPrintf("------ VENDOR %s\n", glGetString(GL_VENDOR));
-        GrPrintf("------ RENDERER %s\n", glGetString(GL_RENDERER));
-        GrPrintf("------ VERSION %s\n", glGetString(GL_VERSION));
-        GrPrintf("------ EXTENSIONS\n %s \n", glGetString(GL_EXTENSIONS));
+        GrPrintf("------ VENDOR %s\n",
+                 GrGLGetGLInterface()->fGetString(GL_VENDOR));
+        GrPrintf("------ RENDERER %s\n",
+                 GrGLGetGLInterface()->fGetString(GL_RENDERER));
+        GrPrintf("------ VERSION %s\n",
+                 GrGLGetGLInterface()->fGetString(GL_VERSION));
+        GrPrintf("------ EXTENSIONS\n %s \n",
+                 GrGLGetGLInterface()->fGetString(GL_EXTENSIONS));
     }
 
     GrGLClearErr();
 
-    GrGLInitExtensions(&fExts);
-
     resetDirtyFlags();
 
     GLint maxTextureUnits;
@@ -329,7 +330,7 @@
 
     // sanity check to make sure we can at least create an FBO from a POT texture
 
-    bool simpleFBOSuccess = fbo_test(fExts, 128, 128);
+    bool simpleFBOSuccess = fbo_test(128, 128);
     if (gPrintStartupSpew) {
         if (!simpleFBOSuccess) {
             GrPrintf("FBO Sanity Test: FAILED\n");
@@ -348,7 +349,7 @@
      */
     bool fNPOTRenderTargetSupport = false;
     if (fNPOTTextureSupport) {
-        fNPOTRenderTargetSupport = fbo_test(fExts, 200, 200);
+        fNPOTRenderTargetSupport = fbo_test(200, 200);
     }
 
     if (gPrintStartupSpew) {
@@ -384,7 +385,7 @@
     for (GLuint i = 1; i <= 256; fNPOTRenderTargetSupport ? ++i : i *= 2) {
         GLuint w = maxRenderSize;
         GLuint h = i;
-        if (fbo_test(fExts, w, h)) {
+        if (fbo_test(w, h)) {
             if (gPrintStartupSpew) {
                 GrPrintf("\t[%d, %d]: PASSED\n", w, h);
             }
@@ -405,7 +406,7 @@
     for (GLuint i = 1; i <= 256; fNPOTRenderTargetSupport ? i *= 2 : ++i) {
         GLuint w = i;
         GLuint h = maxRenderSize;
-        if (fbo_test(fExts, w, h)) {
+        if (fbo_test(w, h)) {
             if (gPrintStartupSpew) {
                 GrPrintf("\t[%d, %d]: PASSED\n", w, h);
             }
@@ -777,7 +778,7 @@
         GrAssert(NULL == srcData);
         glDesc.fOrientation =  GrGLTexture::kBottomUp_Orientation;
 
-        GR_GLEXT(fExts, GenFramebuffers(1, &rtIDs.fTexFBOID));
+        GR_GL(GenFramebuffers(1, &rtIDs.fTexFBOID));
         GrAssert(rtIDs.fTexFBOID);
 
         // If we are using multisampling and any extension other than the IMG
@@ -785,16 +786,15 @@
         // the texture bound to the other. The IMG extension does an implicit
         // resolve.
         if (samples > 1 && kIMG_MSFBO != fMSFBOType && kNone_MSFBO != fMSFBOType) {
-            GR_GLEXT(fExts, GenFramebuffers(1, &rtIDs.fRTFBOID));
+            GR_GL(GenFramebuffers(1, &rtIDs.fRTFBOID));
             GrAssert(0 != rtIDs.fRTFBOID);
-            GR_GLEXT(fExts, GenRenderbuffers(1, &rtIDs.fMSColorRenderbufferID));
+            GR_GL(GenRenderbuffers(1, &rtIDs.fMSColorRenderbufferID));
             GrAssert(0 != rtIDs.fMSColorRenderbufferID);
             if (!fboInternalFormat(desc.fFormat, &msColorRenderbufferFormat)) {
-                GR_GLEXT(fExts,
-                         DeleteRenderbuffers(1, &rtIDs.fMSColorRenderbufferID));
+                GR_GL(DeleteRenderbuffers(1, &rtIDs.fMSColorRenderbufferID));
                 GR_GL(DeleteTextures(1, &glDesc.fTextureID));
-                GR_GLEXT(fExts, DeleteFramebuffers(1, &rtIDs.fTexFBOID));
-                GR_GLEXT(fExts, DeleteFramebuffers(1, &rtIDs.fRTFBOID));
+                GR_GL(DeleteFramebuffers(1, &rtIDs.fTexFBOID));
+                GR_GL(DeleteFramebuffers(1, &rtIDs.fRTFBOID));
                 return return_null_texture();
             }
         } else {
@@ -802,7 +802,7 @@
         }
         int attempts = 1;
         if (!(kNoPathRendering_TextureFlag & desc.fFlags)) {
-            GR_GLEXT(fExts, GenRenderbuffers(1, &rtIDs.fStencilRenderbufferID));
+            GR_GL(GenRenderbuffers(1, &rtIDs.fStencilRenderbufferID));
             GrAssert(0 != rtIDs.fStencilRenderbufferID);
             attempts = GR_ARRAY_COUNT(gStencilFormats);
         }
@@ -815,21 +815,20 @@
         err = ~GL_NO_ERROR;
         for (int i = 0; i < attempts; ++i) {
             if (rtIDs.fStencilRenderbufferID) {
-                GR_GLEXT(fExts, BindRenderbuffer(GR_RENDERBUFFER,
-                                                 rtIDs.fStencilRenderbufferID));
+                GR_GL(BindRenderbuffer(GR_RENDERBUFFER,
+                                       rtIDs.fStencilRenderbufferID));
                 if (samples > 1) {
-                    GR_GLEXT_NO_ERR(fExts, RenderbufferStorageMultisample(
+                    GR_GL_NO_ERR(RenderbufferStorageMultisample(
                                                 GR_RENDERBUFFER,
                                                 samples,
                                                 gStencilFormats[i].fEnum,
                                                 glDesc.fAllocWidth,
                                                 glDesc.fAllocHeight));
                 } else {
-                    GR_GLEXT_NO_ERR(fExts, RenderbufferStorage(
-                                                GR_RENDERBUFFER,
-                                                gStencilFormats[i].fEnum,
-                                                glDesc.fAllocWidth,
-                                                glDesc.fAllocHeight));
+                    GR_GL_NO_ERR(RenderbufferStorage(GR_RENDERBUFFER,
+                                                     gStencilFormats[i].fEnum,
+                                                     glDesc.fAllocWidth,
+                                                     glDesc.fAllocHeight));
                 }
                 err = glGetError();
                 if (err != GL_NO_ERROR) {
@@ -838,9 +837,9 @@
             }
             if (rtIDs.fRTFBOID != rtIDs.fTexFBOID) {
                 GrAssert(samples > 1);
-                GR_GLEXT(fExts, BindRenderbuffer(GR_RENDERBUFFER,
-                                                 rtIDs.fMSColorRenderbufferID));
-                GR_GLEXT_NO_ERR(fExts, RenderbufferStorageMultisample(
+                GR_GL(BindRenderbuffer(GR_RENDERBUFFER,
+                                       rtIDs.fMSColorRenderbufferID));
+                GR_GL_NO_ERR(RenderbufferStorageMultisample(
                                                    GR_RENDERBUFFER,
                                                    samples,
                                                    msColorRenderbufferFormat,
@@ -851,52 +850,50 @@
                     continue;
                 }
             }
-            GR_GLEXT(fExts, BindFramebuffer(GR_FRAMEBUFFER, rtIDs.fTexFBOID));
+            GR_GL(BindFramebuffer(GR_FRAMEBUFFER, rtIDs.fTexFBOID));
 
 #if GR_COLLECT_STATS
             ++fStats.fRenderTargetChngCnt;
 #endif
             if (kIMG_MSFBO == fMSFBOType && samples > 1) {
-                GR_GLEXT(fExts, FramebufferTexture2DMultisample(
-                                                         GR_FRAMEBUFFER,
-                                                         GR_COLOR_ATTACHMENT0,
-                                                         GL_TEXTURE_2D,
-                                                         glDesc.fTextureID,
-                                                         0,
-                                                         samples));
+                GR_GL(FramebufferTexture2DMultisample(GR_FRAMEBUFFER,
+                                                      GR_COLOR_ATTACHMENT0,
+                                                      GL_TEXTURE_2D,
+                                                      glDesc.fTextureID,
+                                                      0,
+                                                      samples));
 
             } else {
-                GR_GLEXT(fExts, FramebufferTexture2D(GR_FRAMEBUFFER,
-                                                     GR_COLOR_ATTACHMENT0,
-                                                     GL_TEXTURE_2D,
-                                                     glDesc.fTextureID, 0));
+                GR_GL(FramebufferTexture2D(GR_FRAMEBUFFER,
+                                           GR_COLOR_ATTACHMENT0,
+                                           GL_TEXTURE_2D,
+                                           glDesc.fTextureID, 0));
             }
             if (rtIDs.fRTFBOID != rtIDs.fTexFBOID) {
-                GLenum status = GR_GLEXT(fExts,
-                                         CheckFramebufferStatus(GR_FRAMEBUFFER));
+                GLenum status = GR_GL(CheckFramebufferStatus(GR_FRAMEBUFFER));
                 if (status != GR_FRAMEBUFFER_COMPLETE) {
                     GrPrintf("-- glCheckFramebufferStatus %x %d %d\n",
                              status, desc.fWidth, desc.fHeight);
                     continue;
                 }
-                GR_GLEXT(fExts, BindFramebuffer(GR_FRAMEBUFFER, rtIDs.fRTFBOID));
+                GR_GL(BindFramebuffer(GR_FRAMEBUFFER, rtIDs.fRTFBOID));
             #if GR_COLLECT_STATS
                 ++fStats.fRenderTargetChngCnt;
             #endif
-                GR_GLEXT(fExts, FramebufferRenderbuffer(GR_FRAMEBUFFER,
-                                                 GR_COLOR_ATTACHMENT0,
-                                                 GR_RENDERBUFFER,
-                                                 rtIDs.fMSColorRenderbufferID));
+                GR_GL(FramebufferRenderbuffer(GR_FRAMEBUFFER,
+                                              GR_COLOR_ATTACHMENT0,
+                                              GR_RENDERBUFFER,
+                                              rtIDs.fMSColorRenderbufferID));
 
             }
             if (rtIDs.fStencilRenderbufferID) {
                 // bind the stencil to rt fbo if present, othewise the tex fbo
-                GR_GLEXT(fExts, FramebufferRenderbuffer(GR_FRAMEBUFFER,
-                                                 GR_STENCIL_ATTACHMENT,
-                                                 GR_RENDERBUFFER,
-                                                 rtIDs.fStencilRenderbufferID));
+                GR_GL(FramebufferRenderbuffer(GR_FRAMEBUFFER,
+                                              GR_STENCIL_ATTACHMENT,
+                                              GR_RENDERBUFFER,
+                                              rtIDs.fStencilRenderbufferID));
             }
-            status = GR_GLEXT(fExts, CheckFramebufferStatus(GR_FRAMEBUFFER));
+            status = GR_GL(CheckFramebufferStatus(GR_FRAMEBUFFER));
 
 #if GR_SUPPORT_GLDESKTOP
             // On some implementations you have to be bound as DEPTH_STENCIL.
@@ -904,16 +901,15 @@
             // buffer doesn't work.)
             if (rtIDs.fStencilRenderbufferID &&
                 status != GR_FRAMEBUFFER_COMPLETE) {
-                GR_GLEXT(fExts, FramebufferRenderbuffer(GR_FRAMEBUFFER,
-                                                        GR_STENCIL_ATTACHMENT,
-                                                        GR_RENDERBUFFER,
-                                                        0));
-                GR_GLEXT(fExts,
-                         FramebufferRenderbuffer(GR_FRAMEBUFFER,
-                                                 GR_DEPTH_STENCIL_ATTACHMENT,
-                                                 GR_RENDERBUFFER,
-                                                 rtIDs.fStencilRenderbufferID));
-                status = GR_GLEXT(fExts, CheckFramebufferStatus(GR_FRAMEBUFFER));
+                GR_GL(FramebufferRenderbuffer(GR_FRAMEBUFFER,
+                                              GR_STENCIL_ATTACHMENT,
+                                              GR_RENDERBUFFER,
+                                              0));
+                GR_GL(FramebufferRenderbuffer(GR_FRAMEBUFFER,
+                                              GR_DEPTH_STENCIL_ATTACHMENT,
+                                              GR_RENDERBUFFER,
+                                              rtIDs.fStencilRenderbufferID));
+                status = GR_GL(CheckFramebufferStatus(GR_FRAMEBUFFER));
             }
 #endif
             if (status != GR_FRAMEBUFFER_COMPLETE) {
@@ -921,10 +917,10 @@
                          status, desc.fWidth, desc.fHeight);
 #if GR_SUPPORT_GLDESKTOP
                 if (rtIDs.fStencilRenderbufferID) {
-                    GR_GLEXT(fExts, FramebufferRenderbuffer(GR_FRAMEBUFFER,
-                                                     GR_DEPTH_STENCIL_ATTACHMENT,
-                                                     GR_RENDERBUFFER,
-                                                     0));
+                    GR_GL(FramebufferRenderbuffer(GR_FRAMEBUFFER,
+                                                  GR_DEPTH_STENCIL_ATTACHMENT,
+                                                  GR_RENDERBUFFER,
+                                                  0));
                 }
 #endif
                 continue;
@@ -942,18 +938,16 @@
         }
         if (failed) {
             if (rtIDs.fStencilRenderbufferID) {
-                GR_GLEXT(fExts,
-                         DeleteRenderbuffers(1, &rtIDs.fStencilRenderbufferID));
+                GR_GL(DeleteRenderbuffers(1, &rtIDs.fStencilRenderbufferID));
             }
             if (rtIDs.fMSColorRenderbufferID) {
-                GR_GLEXT(fExts,
-                         DeleteRenderbuffers(1, &rtIDs.fMSColorRenderbufferID));
+                GR_GL(DeleteRenderbuffers(1, &rtIDs.fMSColorRenderbufferID));
             }
             if (rtIDs.fRTFBOID != rtIDs.fTexFBOID) {
-                GR_GLEXT(fExts, DeleteFramebuffers(1, &rtIDs.fRTFBOID));
+                GR_GL(DeleteFramebuffers(1, &rtIDs.fRTFBOID));
             }
             if (rtIDs.fTexFBOID) {
-                GR_GLEXT(fExts, DeleteFramebuffers(1, &rtIDs.fTexFBOID));
+                GR_GL(DeleteFramebuffers(1, &rtIDs.fTexFBOID));
             }
             GR_GL(DeleteTextures(1, &glDesc.fTextureID));
             return return_null_texture();
@@ -1169,13 +1163,13 @@
 
     if (fHWDrawState.fRenderTarget != fCurrDrawState.fRenderTarget) {
         GrGLRenderTarget* rt = (GrGLRenderTarget*)fCurrDrawState.fRenderTarget;
-        GR_GLEXT(fExts, BindFramebuffer(GR_FRAMEBUFFER, rt->renderFBOID()));
+        GR_GL(BindFramebuffer(GR_FRAMEBUFFER, rt->renderFBOID()));
     #if GR_COLLECT_STATS
         ++fStats.fRenderTargetChngCnt;
     #endif
         rt->setDirty(true);
     #if GR_DEBUG
-        GLenum status = GR_GLEXT(fExts, CheckFramebufferStatus(GR_FRAMEBUFFER));
+        GLenum status = GR_GL(CheckFramebufferStatus(GR_FRAMEBUFFER));
         if (status != GR_FRAMEBUFFER_COMPLETE) {
             GrPrintf("-- glCheckFramebufferStatus %x\n", status);
         }
@@ -1287,9 +1281,9 @@
     if (NULL != rt && rt->needsResolve()) {
         GrAssert(kNone_MSFBO != fMSFBOType);
         GrAssert(rt->textureFBOID() != rt->renderFBOID());
-        GR_GLEXT(fExts, BindFramebuffer(GR_READ_FRAMEBUFFER,
+        GR_GL(BindFramebuffer(GR_READ_FRAMEBUFFER,
                                         rt->renderFBOID()));
-        GR_GLEXT(fExts, BindFramebuffer(GR_DRAW_FRAMEBUFFER,
+        GR_GL(BindFramebuffer(GR_DRAW_FRAMEBUFFER,
                                         rt->textureFBOID()));
     #if GR_COLLECT_STATS
         ++fStats.fRenderTargetChngCnt;
@@ -1305,11 +1299,11 @@
         if (kApple_MSFBO == fMSFBOType) {
             GR_GL(Enable(GL_SCISSOR_TEST));
             GR_GL(Scissor(left, bottom, right-left, top-bottom));
-            GR_GLEXT(fExts, ResolveMultisampleFramebuffer());
+            GR_GL(ResolveMultisampleFramebuffer());
             fHWBounds.fScissorRect.invalidate();
             fHWBounds.fScissorEnabled = true;
         } else {
-            GR_GLEXT(fExts, BlitFramebuffer(left, bottom, right, top,
+            GR_GL(BlitFramebuffer(left, bottom, right, top,
                                      left, bottom, right, top,
                                      GL_COLOR_BUFFER_BIT, GL_NEAREST));
         }