Make GrGLInterface a per-GrContext refcounted object rather than a global

Review URL: http://codereview.appspot.com/4901046/



git-svn-id: http://skia.googlecode.com/svn/trunk@2140 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/gpu/src/GrGpuGLFixed.cpp b/gpu/src/GrGpuGLFixed.cpp
index b955eeb..87b051b 100644
--- a/gpu/src/GrGpuGLFixed.cpp
+++ b/gpu/src/GrGpuGLFixed.cpp
@@ -46,9 +46,22 @@
     GR_GL_MODELVIEW, GR_GL_TEXTURE
 };
 
+#define GL_CALL(X) GR_GL_CALL(this->glInterface(), X)
 ///////////////////////////////////////////////////////////////////////////////
 
-GrGpuGLFixed::GrGpuGLFixed() {
+namespace {
+GrGLBinding get_binding_in_use(const GrGLInterface* gl) {
+    if (gl->supportsDesktop()) {
+        return kDesktop_GrGLBinding;
+    } else {
+        GrAssert(gl->supportsES1());
+        return kES1_GrGLBinding;
+    }
+}
+}
+
+GrGpuGLFixed::GrGpuGLFixed(const GrGLInterface* gl)
+    : GrGpuGL(gl, get_binding_in_use(gl)) {
     f4X4DownsampleFilterSupport = false;
     fDualSourceBlendingSupport = false;
 }
@@ -59,22 +72,42 @@
 void GrGpuGLFixed::resetContext() {
     INHERITED::resetContext();
 
-    GR_GL(Disable(GR_GL_TEXTURE_2D));
+    GL_CALL(Disable(GR_GL_TEXTURE_2D));
 
     for (int s = 0; s < kNumStages; ++s) {
         setTextureUnit(s);
-        GR_GL(EnableClientState(GR_GL_VERTEX_ARRAY));
-        GR_GL(TexEnvi(GR_GL_TEXTURE_ENV, GR_GL_TEXTURE_ENV_MODE, GR_GL_COMBINE));
-        GR_GL(TexEnvi(GR_GL_TEXTURE_ENV, GR_GL_COMBINE_RGB,   GR_GL_MODULATE));
-        GR_GL(TexEnvi(GR_GL_TEXTURE_ENV, GR_GL_SRC0_RGB,      GR_GL_TEXTURE0+s));
-        GR_GL(TexEnvi(GR_GL_TEXTURE_ENV, GR_GL_SRC1_RGB,      GR_GL_PREVIOUS));
-        GR_GL(TexEnvi(GR_GL_TEXTURE_ENV, GR_GL_OPERAND1_RGB,  GR_GL_SRC_COLOR));
+        GL_CALL(EnableClientState(GR_GL_VERTEX_ARRAY));
+        GL_CALL(TexEnvi(GR_GL_TEXTURE_ENV,
+                        GR_GL_TEXTURE_ENV_MODE,
+                        GR_GL_COMBINE));
+        GL_CALL(TexEnvi(GR_GL_TEXTURE_ENV,
+                        GR_GL_COMBINE_RGB,
+                        GR_GL_MODULATE));
+        GL_CALL(TexEnvi(GR_GL_TEXTURE_ENV,
+                        GR_GL_SRC0_RGB,
+                        GR_GL_TEXTURE0+s));
+        GL_CALL(TexEnvi(GR_GL_TEXTURE_ENV,
+                        GR_GL_SRC1_RGB,
+                        GR_GL_PREVIOUS));
+        GL_CALL(TexEnvi(GR_GL_TEXTURE_ENV,
+                        GR_GL_OPERAND1_RGB,
+                        GR_GL_SRC_COLOR));
 
-        GR_GL(TexEnvi(GR_GL_TEXTURE_ENV, GR_GL_COMBINE_ALPHA, GR_GL_MODULATE));
-        GR_GL(TexEnvi(GR_GL_TEXTURE_ENV, GR_GL_SRC0_ALPHA, GR_GL_TEXTURE0+s));
-        GR_GL(TexEnvi(GR_GL_TEXTURE_ENV, GR_GL_OPERAND0_ALPHA, GR_GL_SRC_ALPHA));
-        GR_GL(TexEnvi(GR_GL_TEXTURE_ENV, GR_GL_SRC1_ALPHA, GR_GL_PREVIOUS));
-        GR_GL(TexEnvi(GR_GL_TEXTURE_ENV, GR_GL_OPERAND1_ALPHA, GR_GL_SRC_ALPHA));
+        GL_CALL(TexEnvi(GR_GL_TEXTURE_ENV,
+                        GR_GL_COMBINE_ALPHA,
+                        GR_GL_MODULATE));
+        GL_CALL(TexEnvi(GR_GL_TEXTURE_ENV,
+                        GR_GL_SRC0_ALPHA,
+                        GR_GL_TEXTURE0+s));
+        GL_CALL(TexEnvi(GR_GL_TEXTURE_ENV,
+                        GR_GL_OPERAND0_ALPHA,
+                        GR_GL_SRC_ALPHA));
+        GL_CALL(TexEnvi(GR_GL_TEXTURE_ENV,
+                        GR_GL_SRC1_ALPHA,
+                        GR_GL_PREVIOUS));
+        GL_CALL(TexEnvi(GR_GL_TEXTURE_ENV,
+                        GR_GL_OPERAND1_ALPHA,
+                        GR_GL_SRC_ALPHA));
 
         // color oprand0 changes between GL_SRC_COLR and GL_SRC_ALPHA depending
         // upon whether we have a (premultiplied) RGBA texture or just an ALPHA
@@ -85,14 +118,14 @@
 
     fHWGeometryState.fVertexLayout = 0;
     fHWGeometryState.fVertexOffset  = ~0;
-    GR_GL(EnableClientState(GR_GL_VERTEX_ARRAY));
-    GR_GL(DisableClientState(GR_GL_TEXTURE_COORD_ARRAY));
-    GR_GL(ShadeModel(GR_GL_FLAT));
-    GR_GL(DisableClientState(GR_GL_COLOR_ARRAY));
+    GL_CALL(EnableClientState(GR_GL_VERTEX_ARRAY));
+    GL_CALL(DisableClientState(GR_GL_TEXTURE_COORD_ARRAY));
+    GL_CALL(ShadeModel(GR_GL_FLAT));
+    GL_CALL(DisableClientState(GR_GL_COLOR_ARRAY));
 
-    GR_GL(PointSize(1.f));
+    GL_CALL(PointSize(1.f));
 
-    GrGLClearErr();
+    GrGLClearErr(this->glInterface());
     fTextVerts = false;
 
     fBaseVertex = 0xffffffff;
@@ -113,8 +146,8 @@
     mat[12] = -1.f;
     mat[13] = 1.f;
 
-    GR_GL(MatrixMode(GR_GL_PROJECTION));
-    GR_GL(LoadMatrixf(mat));
+    GL_CALL(MatrixMode(GR_GL_PROJECTION));
+    GL_CALL(LoadMatrixf(mat));
 }
 
 bool GrGpuGLFixed::flushGraphicsState(GrPrimitiveType type) {
@@ -129,7 +162,7 @@
         }
     }
 
-    if (GR_GL_SUPPORT_ES1) {
+    if (kES1_GrGLBinding == this->glBinding()) {
         if (BlendCoeffReferencesConstant(fCurrDrawState.fSrcBlend) ||
             BlendCoeffReferencesConstant(fCurrDrawState.fDstBlend)) {
             unimpl("ES1 doesn't support blend constant");
@@ -152,9 +185,9 @@
         if (usingTextures[s] != wasUsingTexture) {
             setTextureUnit(s);
             if (usingTextures[s]) {
-                GR_GL(Enable(GR_GL_TEXTURE_2D));
+                GL_CALL(Enable(GR_GL_TEXTURE_2D));
             } else {
-                GR_GL(Disable(GR_GL_TEXTURE_2D));
+                GL_CALL(Disable(GR_GL_TEXTURE_2D));
             }
         }
     }
@@ -165,17 +198,17 @@
 
     if (vertColor != prevVertColor) {
         if (vertColor) {
-            GR_GL(ShadeModel(GR_GL_SMOOTH));
+            GL_CALL(ShadeModel(GR_GL_SMOOTH));
             // invalidate the immediate mode color
             fHWDrawState.fColor = GrColor_ILLEGAL;
         } else {
-            GR_GL(ShadeModel(GR_GL_FLAT));
+            GL_CALL(ShadeModel(GR_GL_FLAT));
         }
     }
 
 
     if (!vertColor && fHWDrawState.fColor != fCurrDrawState.fColor) {
-        GR_GL(Color4ub(GrColorUnpackR(fCurrDrawState.fColor),
+        GL_CALL(Color4ub(GrColorUnpackR(fCurrDrawState.fColor),
                        GrColorUnpackG(fCurrDrawState.fColor),
                        GrColorUnpackB(fCurrDrawState.fColor),
                        GrColorUnpackA(fCurrDrawState.fColor)));
@@ -193,7 +226,7 @@
                         kColor_TextureEnvRGBOperand;
                 if (fHWRGBOperand0[s] != nextRGBOperand0) {
                     setTextureUnit(s);
-                    GR_GL(TexEnvi(GR_GL_TEXTURE_ENV,
+                    GL_CALL(TexEnvi(GR_GL_TEXTURE_ENV,
                                   GR_GL_OPERAND0_RGB,
                                   (nextRGBOperand0==kAlpha_TextureEnvRGBOperand) ?
                                     GR_GL_SRC_ALPHA :
@@ -212,8 +245,8 @@
                     GrGpuMatrix glm;
                     glm.set(texMat);
                     setTextureUnit(s);
-                    GR_GL(MatrixMode(GR_GL_TEXTURE));
-                    GR_GL(LoadMatrixf(glm.fMat));
+                    GL_CALL(MatrixMode(GR_GL_TEXTURE));
+                    GL_CALL(LoadMatrixf(glm.fMat));
                     recordHWSamplerMatrix(s, getSamplerMatrix(s));
                 }
             } else {
@@ -226,8 +259,8 @@
     if (fHWDrawState.fViewMatrix != fCurrDrawState.fViewMatrix) {
         GrGpuMatrix glm;
         glm.set(fCurrDrawState.fViewMatrix);
-        GR_GL(MatrixMode(GR_GL_MODELVIEW));
-        GR_GL(LoadMatrixf(glm.fMat));
+        GL_CALL(MatrixMode(GR_GL_MODELVIEW));
+        GL_CALL(LoadMatrixf(glm.fMat));
         fHWDrawState.fViewMatrix =
         fCurrDrawState.fViewMatrix;
     }
@@ -285,7 +318,8 @@
                                    this->getGeomSrc().fVertexLayout)));
 
     if (posAndTexChange) {
-        GR_GL(VertexPointer(2, scalarType, newStride, (GrGLvoid*)vertexOffset));
+        GL_CALL(VertexPointer(2, scalarType,
+                              newStride, (GrGLvoid*)vertexOffset));
         fHWGeometryState.fVertexOffset = vertexOffset;
     }
 
@@ -293,32 +327,37 @@
         // need to enable array if tex coord offset is 0
         // (using positions as coords)
         if (newTexCoordOffsets[s] >= 0) {
-            GrGLvoid* texCoordOffset = (GrGLvoid*)(vertexOffset + newTexCoordOffsets[s]);
+            GrGLvoid* texCoordOffset = (GrGLvoid*)(vertexOffset +
+                                                   newTexCoordOffsets[s]);
             if (oldTexCoordOffsets[s] < 0) {
-                GR_GL(ClientActiveTexture(GR_GL_TEXTURE0+s));
-                GR_GL(EnableClientState(GR_GL_TEXTURE_COORD_ARRAY));
-                GR_GL(TexCoordPointer(2, scalarType, newStride, texCoordOffset));
+                GL_CALL(ClientActiveTexture(GR_GL_TEXTURE0+s));
+                GL_CALL(EnableClientState(GR_GL_TEXTURE_COORD_ARRAY));
+                GL_CALL(TexCoordPointer(2, scalarType,
+                                        newStride, texCoordOffset));
             } else if (posAndTexChange ||
                        newTexCoordOffsets[s] != oldTexCoordOffsets[s]) {
-                GR_GL(ClientActiveTexture(GR_GL_TEXTURE0+s));
-                GR_GL(TexCoordPointer(2, scalarType, newStride, texCoordOffset));
+                GL_CALL(ClientActiveTexture(GR_GL_TEXTURE0+s));
+                GL_CALL(TexCoordPointer(2, scalarType,
+                                        newStride, texCoordOffset));
             }
         } else if (oldTexCoordOffsets[s] >= 0) {
-            GR_GL(ClientActiveTexture(GR_GL_TEXTURE0+s));
-            GR_GL(DisableClientState(GR_GL_TEXTURE_COORD_ARRAY));
+            GL_CALL(ClientActiveTexture(GR_GL_TEXTURE0+s));
+            GL_CALL(DisableClientState(GR_GL_TEXTURE_COORD_ARRAY));
         }
     }
 
     if (newColorOffset > 0) {
         GrGLvoid* colorOffset = (GrGLvoid*)(vertexOffset + newColorOffset);
         if (oldColorOffset <= 0) {
-            GR_GL(EnableClientState(GR_GL_COLOR_ARRAY));
-            GR_GL(ColorPointer(4, GR_GL_UNSIGNED_BYTE, newStride, colorOffset));
+            GL_CALL(EnableClientState(GR_GL_COLOR_ARRAY));
+            GL_CALL(ColorPointer(4, GR_GL_UNSIGNED_BYTE,
+                                newStride, colorOffset));
         } else if (allOffsetsChange || newColorOffset != oldColorOffset) {
-            GR_GL(ColorPointer(4, GR_GL_UNSIGNED_BYTE, newStride, colorOffset));
+            GL_CALL(ColorPointer(4, GR_GL_UNSIGNED_BYTE,
+                                 newStride, colorOffset));
         }
     } else if (oldColorOffset > 0) {
-        GR_GL(DisableClientState(GR_GL_COLOR_ARRAY));
+        GL_CALL(DisableClientState(GR_GL_COLOR_ARRAY));
     }
 
     fHWGeometryState.fVertexLayout = this->getGeomSrc().fVertexLayout;