Implement morphology as a custom effect

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



git-svn-id: http://skia.googlecode.com/svn/trunk@4102 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/gpu/gl/GrGLProgram.cpp b/src/gpu/gl/GrGLProgram.cpp
index 9a78a6e..a49aa61 100644
--- a/src/gpu/gl/GrGLProgram.cpp
+++ b/src/gpu/gl/GrGLProgram.cpp
@@ -95,18 +95,6 @@
     s->appendS32(stage);
 }
 
-inline void convolve_param_names(int stage, GrStringBuilder* k, GrStringBuilder* i) {
-    *k = "uKernel";
-    k->appendS32(stage);
-    *i = "uImageIncrement";
-    i->appendS32(stage);
-}
-
-inline void image_increment_param_name(int stage, GrStringBuilder* i) {
-    *i = "uImageIncrement";
-    i->appendS32(stage);
-}
-
 inline void tex_domain_name(int stage, GrStringBuilder* s) {
     *s = "uTexDom";
     s->appendS32(stage);
@@ -629,7 +617,7 @@
                     const GrProgramStageFactory& factory =
                         customStages[s]->getFactory();
                     programData->fCustomStage[s] =
-                        factory.createGLInstance(customStages[s]);
+                        factory.createGLInstance(*customStages[s]);
                 }
                 this->genStageCode(gl,
                                    s,
@@ -752,7 +740,7 @@
                         const GrProgramStageFactory& factory =
                             customStages[s]->getFactory();
                         programData->fCustomStage[s] =
-                            factory.createGLInstance(customStages[s]);
+                            factory.createGLInstance(*customStages[s]);
                     }
                     this->genStageCode(gl, s,
                         fProgramDesc.fStages[s],
@@ -1186,21 +1174,6 @@
                 GrAssert(kUnusedUniform != locations.fTexDomUni);
             }
 
-            GrStringBuilder kernelName, imageIncrementName;
-            convolve_param_names(s, &kernelName, &imageIncrementName);
-            if (kUseUniform == locations.fKernelUni) {
-                GL_CALL_RET(locations.fKernelUni,
-                            GetUniformLocation(progID, kernelName.c_str()));
-                GrAssert(kUnusedUniform != locations.fKernelUni);
-            }
-
-            if (kUseUniform == locations.fImageIncrementUni) {
-                GL_CALL_RET(locations.fImageIncrementUni, 
-                            GetUniformLocation(progID, 
-                                               imageIncrementName.c_str()));
-                GrAssert(kUnusedUniform != locations.fImageIncrementUni);
-            }
-
             if (NULL != programData->fCustomStage[s]) {
                 programData->fCustomStage[s]->
                     initUniforms(gl.interface(), progID);
@@ -1411,65 +1384,6 @@
 
 }
 
-void genMorphologyVS(int stageNum,
-                     const StageDesc& desc,
-                     GrGLShaderBuilder* segments,
-                     GrGLProgram::StageUniLocations* locations,
-                     const char** imageIncrementName,
-                     const char* varyingVSName) {
-
-    GrStringBuilder iiName;
-    image_increment_param_name(stageNum, &iiName);
-    const GrGLShaderVar* imgInc =
-        &segments->addUniform(
-            GrGLShaderBuilder::kBoth_VariableLifetime, kVec2f_GrSLType, 
-            iiName.c_str());
-    *imageIncrementName = imgInc->getName().c_str();
-
-    locations->fImageIncrementUni = kUseUniform;
-    segments->fVSCode.appendf("\t%s -= vec2(%d, %d) * %s;\n",
-                                  varyingVSName, desc.fKernelWidth,
-                                  desc.fKernelWidth, *imageIncrementName);
-}
- 
-void genMorphologyFS(int stageNum,
-                     const StageDesc& desc,
-                     GrGLShaderBuilder* segments,
-                     const char* samplerName,
-                     const char* imageIncrementName,
-                     const char* fsOutColor,
-                     GrStringBuilder& texFunc) {
-    GrStringBuilder valueVar("value");
-    valueVar.appendS32(stageNum);
-    GrStringBuilder coordVar("coord");
-    coordVar.appendS32(stageNum);
-    bool isDilate = StageDesc::kDilate_FetchMode == desc.fFetchMode;
-
-   if (isDilate) {
-        segments->fFSCode.appendf("\tvec4 %s = vec4(0, 0, 0, 0);\n",
-                                  valueVar.c_str());
-    } else {
-        segments->fFSCode.appendf("\tvec4 %s = vec4(1, 1, 1, 1);\n",
-                                  valueVar.c_str());
-    }
-    segments->fFSCode.appendf("\tvec2 %s = %s;\n", 
-                              coordVar.c_str(),
-                              segments->fSampleCoords.c_str());
-    segments->fFSCode.appendf("\tfor (int i = 0; i < %d; i++) {\n",
-                              desc.fKernelWidth * 2 + 1);
-    segments->fFSCode.appendf("\t\t%s = %s(%s, %s(%s, %s)%s);\n",
-                              valueVar.c_str(), isDilate ? "max" : "min",
-                              valueVar.c_str(), texFunc.c_str(),
-                              samplerName, coordVar.c_str(),
-                              segments->fSwizzle.c_str());
-    segments->fFSCode.appendf("\t\t%s += %s;\n",
-                              coordVar.c_str(),
-                              imageIncrementName);
-    segments->fFSCode.appendf("\t}\n");
-    segments->fFSCode.appendf("\t%s = %s%s;\n", fsOutColor,
-                              valueVar.c_str(), segments->fModulate.c_str());
-}
-
 }
 
 void GrGLProgram::genStageCode(const GrGLContextInfo& gl,
@@ -1562,12 +1476,6 @@
 
     GrGLShaderVar* kernel = NULL;
     const char* imageIncrementName = NULL;
-    if (StageDesc::kDilate_FetchMode == desc.fFetchMode ||
-               StageDesc::kErode_FetchMode == desc.fFetchMode) {
-        genMorphologyVS(stageNum, desc, segments, locations,
-                        &imageIncrementName, varyingVSName);
-    }
-
     if (NULL != customStage) {
         segments->fVSCode.appendf("\t{ // stage %d %s\n",
                                   stageNum, customStage->name());
@@ -1677,15 +1585,6 @@
             gen2x2FS(stageNum, segments, locations,
                 samplerName.c_str(), texelSizeName, fsOutColor, texFunc);
             break;
-        case StageDesc::kConvolution_FetchMode:
-            GrAssert(!(desc.fInConfigFlags & kMulByAlphaMask));
-            break;
-        case StageDesc::kDilate_FetchMode:
-        case StageDesc::kErode_FetchMode:
-            GrAssert(!(desc.fInConfigFlags & kMulByAlphaMask));
-            genMorphologyFS(stageNum, desc, segments,
-                samplerName.c_str(), imageIncrementName, fsOutColor, texFunc);
-            break;
         default:
             if (desc.fInConfigFlags & kMulByAlphaMask) {
                 // only one of the mul by alpha flags should be set