Flip the switch to turn on GrCustomStage implementation of gradients;
remove old implementation, including enums & state on various structs.

http://codereview.appspot.com/6245078/



git-svn-id: http://skia.googlecode.com/svn/trunk@4129 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/gpu/gl/GrGLProgram.cpp b/src/gpu/gl/GrGLProgram.cpp
index 7233233..6c22f46 100644
--- a/src/gpu/gl/GrGLProgram.cpp
+++ b/src/gpu/gl/GrGLProgram.cpp
@@ -1158,14 +1158,6 @@
                 GrAssert(kUnusedUniform != locations.fNormalizedTexelSizeUni);
             }
 
-            if (kUseUniform == locations.fRadial2Uni) {
-                GrStringBuilder radial2ParamName;
-                radial2_param_name(s, &radial2ParamName);
-                GL_CALL_RET(locations.fRadial2Uni,
-                            GetUniformLocation(progID, radial2ParamName.c_str()));
-                GrAssert(kUnusedUniform != locations.fRadial2Uni);
-            }
-
             if (kUseUniform == locations.fTexDomUni) {
                 GrStringBuilder texDomName;
                 tex_domain_name(s, &texDomName);
@@ -1188,8 +1180,6 @@
             GL_CALL(Uniform1i(programData->fUniLocations.fStages[s].fSamplerUni, s));
         }
         programData->fTextureMatrices[s] = GrMatrix::InvalidMatrix();
-        programData->fRadial2CenterX1[s] = GR_ScalarMax;
-        programData->fRadial2Radius0[s] = -GR_ScalarMax;
         programData->fTextureWidth[s] = -1;
         programData->fTextureHeight[s] = -1;
         programData->fTextureDomain[s].setEmpty();
@@ -1209,156 +1199,6 @@
 
 namespace {
 
-bool isRadialMapping(GrGLProgram::StageDesc::CoordMapping mapping) {
-    return
-       (GrGLProgram::StageDesc::kRadial2Gradient_CoordMapping == mapping ||
-        GrGLProgram::StageDesc::kRadial2GradientDegenerate_CoordMapping == mapping);
-}
-
-const GrGLShaderVar* genRadialVS(int stageNum,
-                        GrGLShaderBuilder* segments,
-                        GrGLProgram::StageUniLocations* locations,
-                        const char** radial2VaryingVSName,
-                        const char** radial2VaryingFSName,
-                        const char* varyingVSName) {
-    GrStringBuilder r2ParamsName;
-    radial2_param_name(stageNum, &r2ParamsName);
-    const GrGLShaderVar* radial2FSParams =
-        &segments->addUniform(GrGLShaderBuilder::kBoth_VariableLifetime,
-                              kFloat_GrSLType, r2ParamsName.c_str(), -1, 6);
-    locations->fRadial2Uni = kUseUniform;
-
-    // for radial grads without perspective we can pass the linear
-    // part of the quadratic as a varying.
-    if (segments->fVaryingDims == segments->fCoordDims) {
-        GrAssert(2 == segments->fCoordDims);
-        segments->addVarying(kFloat_GrSLType,
-                             "Radial2BCoeff",
-                             stageNum,
-                             radial2VaryingVSName,
-                             radial2VaryingFSName);
-
-        GrStringBuilder radial2p2;
-        GrStringBuilder radial2p3;
-        radial2FSParams->appendArrayAccess(2, &radial2p2);
-        radial2FSParams->appendArrayAccess(3, &radial2p3);
-
-        // r2Var = 2 * (r2Parm[2] * varCoord.x - r2Param[3])
-        const char* r2ParamName = radial2FSParams->getName().c_str();
-        segments->fVSCode.appendf("\t%s = 2.0 *(%s * %s.x - %s);\n",
-                                  *radial2VaryingVSName, radial2p2.c_str(),
-                                  varyingVSName, radial2p3.c_str());
-    }
-
-    return radial2FSParams;
-}
-
-void genRadial2GradientCoordMapping(int stageNum,
-                                    GrGLShaderBuilder* segments,
-                                    const char* radial2VaryingFSName,
-                                    const GrGLShaderVar* radial2Params) {
-    GrStringBuilder cName("c");
-    GrStringBuilder ac4Name("ac4");
-    GrStringBuilder rootName("root");
-
-    cName.appendS32(stageNum);
-    ac4Name.appendS32(stageNum);
-    rootName.appendS32(stageNum);
-
-    GrStringBuilder radial2p0;
-    GrStringBuilder radial2p1;
-    GrStringBuilder radial2p2;
-    GrStringBuilder radial2p3;
-    GrStringBuilder radial2p4;
-    GrStringBuilder radial2p5;
-    radial2Params->appendArrayAccess(0, &radial2p0);
-    radial2Params->appendArrayAccess(1, &radial2p1);
-    radial2Params->appendArrayAccess(2, &radial2p2);
-    radial2Params->appendArrayAccess(3, &radial2p3);
-    radial2Params->appendArrayAccess(4, &radial2p4);
-    radial2Params->appendArrayAccess(5, &radial2p5);
-
-    // if we were able to interpolate the linear component bVar is the varying
-    // otherwise compute it
-    GrStringBuilder bVar;
-    if (segments->fCoordDims == segments->fVaryingDims) {
-        bVar = radial2VaryingFSName;
-        GrAssert(2 == segments->fVaryingDims);
-    } else {
-        GrAssert(3 == segments->fVaryingDims);
-        bVar = "b";
-        bVar.appendS32(stageNum);
-        segments->fFSCode.appendf("\tfloat %s = 2.0 * (%s * %s.x - %s);\n",
-                                    bVar.c_str(), radial2p2.c_str(),
-                                    segments->fSampleCoords.c_str(), radial2p3.c_str());
-    }
-
-    // c = (x^2)+(y^2) - params[4]
-    segments->fFSCode.appendf("\tfloat %s = dot(%s, %s) - %s;\n",
-                              cName.c_str(), segments->fSampleCoords.c_str(),
-                              segments->fSampleCoords.c_str(),
-                              radial2p4.c_str());
-    // ac4 = 4.0 * params[0] * c
-    segments->fFSCode.appendf("\tfloat %s = %s * 4.0 * %s;\n",
-                              ac4Name.c_str(), radial2p0.c_str(),
-                              cName.c_str());
-
-    // root = sqrt(b^2-4ac)
-    // (abs to avoid exception due to fp precision)
-    segments->fFSCode.appendf("\tfloat %s = sqrt(abs(%s*%s - %s));\n",
-                              rootName.c_str(), bVar.c_str(), bVar.c_str(),
-                              ac4Name.c_str());
-
-    // x coord is: (-b + params[5] * sqrt(b^2-4ac)) * params[1]
-    // y coord is 0.5 (texture is effectively 1D)
-    segments->fSampleCoords.printf("vec2((-%s + %s * %s) * %s, 0.5)",
-                        bVar.c_str(), radial2p5.c_str(),
-                        rootName.c_str(), radial2p1.c_str());
-    segments->fComplexCoord = true;
-}
-
-void genRadial2GradientDegenerateCoordMapping(int stageNum,
-                                              GrGLShaderBuilder* segments,
-                                              const char* radial2VaryingFSName,
-                                              const GrGLShaderVar* radial2Params) {
-    GrStringBuilder cName("c");
-
-    cName.appendS32(stageNum);
-
-    GrStringBuilder radial2p2;
-    GrStringBuilder radial2p3;
-    GrStringBuilder radial2p4;
-    radial2Params->appendArrayAccess(2, &radial2p2);
-    radial2Params->appendArrayAccess(3, &radial2p3);
-    radial2Params->appendArrayAccess(4, &radial2p4);
-
-    // if we were able to interpolate the linear component bVar is the varying
-    // otherwise compute it
-    GrStringBuilder bVar;
-    if (segments->fCoordDims == segments->fVaryingDims) {
-        bVar = radial2VaryingFSName;
-        GrAssert(2 == segments->fVaryingDims);
-    } else {
-        GrAssert(3 == segments->fVaryingDims);
-        bVar = "b";
-        bVar.appendS32(stageNum);
-        segments->fFSCode.appendf("\tfloat %s = 2.0 * (%s * %s.x - %s);\n",
-                                    bVar.c_str(), radial2p2.c_str(),
-                                    segments->fSampleCoords.c_str(), radial2p3.c_str());
-    }
-
-    // c = (x^2)+(y^2) - params[4]
-    segments->fFSCode.appendf("\tfloat %s = dot(%s, %s) - %s;\n",
-                              cName.c_str(), segments->fSampleCoords.c_str(),
-                              segments->fSampleCoords.c_str(),
-                              radial2p4.c_str());
-
-    // x coord is: -c/b
-    // y coord is 0.5 (texture is effectively 1D)
-    segments->fSampleCoords.printf("vec2((-%s / %s), 0.5)", cName.c_str(), bVar.c_str());
-    segments->fComplexCoord = true;
-}
-
 void gen2x2FS(int stageNum,
               GrGLShaderBuilder* segments,
               GrGLProgram::StageUniLocations* locations,
@@ -1403,10 +1243,6 @@
     GrAssert((desc.fInConfigFlags & StageDesc::kInConfigBitMask) ==
              desc.fInConfigFlags);
 
-    if (NULL != customStage) {
-        customStage->setupVariables(segments, stageNum);
-    }
-
     /// Vertex Shader Stuff
 
     // decide whether we need a matrix to transform texture coords
@@ -1432,6 +1268,11 @@
     }
     GrAssert(segments->fVaryingDims > 0);
 
+    // Must setup variables after computing segments->fVaryingDims
+    if (NULL != customStage) {
+        customStage->setupVariables(segments, stageNum);
+    }
+
     GrStringBuilder samplerName;
     sampler_name(stageNum, &samplerName);
     const GrGLShaderVar* sampler = &segments->addUniform(
@@ -1465,18 +1306,6 @@
                                   vector_all_coords(segments->fVaryingDims));
     }
 
-    const GrGLShaderVar* radial2Params = NULL;
-    const char* radial2VaryingVSName = NULL;
-    const char* radial2VaryingFSName = NULL;
-
-    if (isRadialMapping((StageDesc::CoordMapping) desc.fCoordMapping)) {
-        radial2Params = genRadialVS(stageNum, segments,
-                                    locations,
-                                    &radial2VaryingVSName,
-                                    &radial2VaryingFSName,
-                                    varyingVSName);
-    }
-
     GrGLShaderVar* kernel = NULL;
     const char* imageIncrementName = NULL;
     if (NULL != customStage) {
@@ -1495,46 +1324,19 @@
     if (desc.fOptFlags & (StageDesc::kIdentityMatrix_OptFlagBit |
                           StageDesc::kNoPerspective_OptFlagBit)) {
         sampleMode = GrGLShaderBuilder::kDefault_SamplerMode;
-    } else if (StageDesc::kIdentity_CoordMapping == desc.fCoordMapping &&
+    } else if (NULL == customStage &&
                StageDesc::kSingle_FetchMode == desc.fFetchMode) {
         sampleMode = GrGLShaderBuilder::kProj_SamplerMode;
     }
     segments->setupTextureAccess(sampleMode, stageNum);
 
-    // NOTE: GrGLProgramStages will soon responsible for mapping
-    //if (NULL == customStage) {
-        switch (desc.fCoordMapping) {
-        case StageDesc::kIdentity_CoordMapping:
-            // Do nothing
-            break;
-        case StageDesc::kSweepGradient_CoordMapping:
-            segments->fSampleCoords.printf("vec2(atan(- %s.y, - %s.x) * 0.1591549430918 + 0.5, 0.5)", segments->fSampleCoords.c_str(), segments->fSampleCoords.c_str());
-            segments->fComplexCoord = true;
-            break;
-        case StageDesc::kRadialGradient_CoordMapping:
-            segments->fSampleCoords.printf("vec2(length(%s.xy), 0.5)", segments->fSampleCoords.c_str());
-            segments->fComplexCoord = true;
-            break;
-        case StageDesc::kRadial2Gradient_CoordMapping:
-            genRadial2GradientCoordMapping(
-                               stageNum, segments,
-                               radial2VaryingFSName, radial2Params);
-            break;
-        case StageDesc::kRadial2GradientDegenerate_CoordMapping:
-            genRadial2GradientDegenerateCoordMapping(
-                               stageNum, segments,
-                               radial2VaryingFSName, radial2Params);
-            break;
-        }
-    //}
+    segments->computeSwizzle(desc.fInConfigFlags);
+    segments->computeModulate(fsInColor);
 
     static const uint32_t kMulByAlphaMask =
         (StageDesc::kMulRGBByAlpha_RoundUp_InConfigFlag |
          StageDesc::kMulRGBByAlpha_RoundDown_InConfigFlag);
 
-    segments->computeSwizzle(desc.fInConfigFlags);
-    segments->computeModulate(fsInColor);
-
     if (desc.fOptFlags & StageDesc::kCustomTextureDomain_OptFlagBit) {
         GrStringBuilder texDomainName;
         tex_domain_name(stageNum, &texDomainName);