Speed up GrDrawState handling.
Compact GrDrawState and nested structs; dynamically only copy and compare
the fields actually active on the structs in question.
Yields 10-20% speedup of text benchmarks in GPU configuration.

Could probably get additional marginal speedup by ignoring unused
kernel fields.
Has some fragile constructs: pointer math on members to compute
sizes of portions of structs.
Removes fields necessary for GrTesselatedPathRenderer.



git-svn-id: http://skia.googlecode.com/svn/trunk@2644 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/gpu/GrGpuGL.cpp b/src/gpu/GrGpuGL.cpp
index d768a24..c162e11 100644
--- a/src/gpu/GrGpuGL.cpp
+++ b/src/gpu/GrGpuGL.cpp
@@ -622,8 +622,9 @@
     fActiveTextureUnitIdx = -1;
 
     // illegal values
-    fHWDrawState.fSrcBlend = (GrBlendCoeff)-1;
-    fHWDrawState.fDstBlend = (GrBlendCoeff)-1;
+    //fHWDrawState.fSrcBlend = (GrBlendCoeff)(uint8_t)-1;
+    fHWDrawState.fSrcBlend = (GrBlendCoeff)0xFF;
+    fHWDrawState.fDstBlend = (GrBlendCoeff)(uint8_t)-1;
 
     fHWDrawState.fBlendConstant = 0x00000000;
     GL_CALL(BlendColor(0,0,0,0));
@@ -1872,7 +1873,8 @@
                 GrAssert(settings->fFrontFunc < kBasicStencilFuncCount);
                 frontFunc = grToGLStencilFunc[settings->fFrontFunc];
             } else {
-                frontFunc = grToGLStencilFunc[ConvertStencilFunc(stencilClip, settings->fFrontFunc)];
+                frontFunc = grToGLStencilFunc[ConvertStencilFunc(
+                        stencilClip, settings->fFrontFunc)];
 
                 ConvertStencilFuncAndMask(settings->fFrontFunc,
                                           stencilClip,
@@ -1882,14 +1884,14 @@
                                           &frontMask);
                 frontWriteMask &= userStencilMask;
             }
-            GrAssert(settings->fFrontFailOp >= 0 &&
-                     (unsigned) settings->fFrontFailOp < GR_ARRAY_COUNT(grToGLStencilOp));
-            GrAssert(settings->fFrontPassOp >= 0 &&
-                     (unsigned) settings->fFrontPassOp < GR_ARRAY_COUNT(grToGLStencilOp));
-            GrAssert(settings->fBackFailOp >= 0 &&
-                     (unsigned) settings->fBackFailOp < GR_ARRAY_COUNT(grToGLStencilOp));
-            GrAssert(settings->fBackPassOp >= 0 &&
-                     (unsigned) settings->fBackPassOp < GR_ARRAY_COUNT(grToGLStencilOp));
+            GrAssert((size_t)
+                settings->fFrontFailOp < GR_ARRAY_COUNT(grToGLStencilOp));
+            GrAssert((size_t)
+                settings->fFrontPassOp < GR_ARRAY_COUNT(grToGLStencilOp));
+            GrAssert((size_t)
+                settings->fBackFailOp < GR_ARRAY_COUNT(grToGLStencilOp));
+            GrAssert((size_t)
+                settings->fBackPassOp < GR_ARRAY_COUNT(grToGLStencilOp));
             if (this->getCaps().fTwoSidedStencilSupport) {
                 GrGLenum backFunc;
 
@@ -1902,7 +1904,8 @@
                     GrAssert(settings->fBackFunc < kBasicStencilFuncCount);
                     backFunc = grToGLStencilFunc[settings->fBackFunc];
                 } else {
-                    backFunc = grToGLStencilFunc[ConvertStencilFunc(stencilClip, settings->fBackFunc)];
+                    backFunc = grToGLStencilFunc[ConvertStencilFunc(
+                        stencilClip, settings->fBackFunc)];
                     ConvertStencilFuncAndMask(settings->fBackFunc,
                                               stencilClip,
                                               clipStencilMask,