remove 4x4 downsample filter mode

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



git-svn-id: http://skia.googlecode.com/svn/trunk@4149 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/include/gpu/GrSamplerState.h b/include/gpu/GrSamplerState.h
index f52775d..f8ad1c0 100644
--- a/include/gpu/GrSamplerState.h
+++ b/include/gpu/GrSamplerState.h
@@ -26,15 +26,6 @@
          * Blend between closest 4 src texels to sample position (tent filter)
          */
         kBilinear_Filter,
-        /**
-         * Average of 4 bilinear filterings spaced +/- 1 texel from sample
-         * position in x and y. Intended for averaging 16 texels in a downsample
-         * pass. (rasterizing such that texture samples fall exactly halfway
-         * between texels in x and y spaced 4 texels apart.) Only supported
-         * on shader backends.
-         */
-        k4x4Downsample_Filter,
-
         kDefault_Filter = kNearest_Filter
     };
 
diff --git a/src/gpu/gl/GrGLProgram.cpp b/src/gpu/gl/GrGLProgram.cpp
index 2512ba0..4f5ea65 100644
--- a/src/gpu/gl/GrGLProgram.cpp
+++ b/src/gpu/gl/GrGLProgram.cpp
@@ -80,11 +80,6 @@
     s->appendS32(stage);
 }
 
-inline void normalized_texel_size_name(int stage, GrStringBuilder* s) {
-    *s = "uTexelSize";
-    s->appendS32(stage);
-}
-
 inline void sampler_name(int stage, GrStringBuilder* s) {
     *s = "uSampler";
     s->appendS32(stage);
@@ -1150,14 +1145,6 @@
                 GrAssert(kUnusedUniform != locations.fSamplerUni);
             }
 
-            if (kUseUniform == locations.fNormalizedTexelSizeUni) {
-                GrStringBuilder texelSizeName;
-                normalized_texel_size_name(s, &texelSizeName);
-                GL_CALL_RET(locations.fNormalizedTexelSizeUni,
-                            GetUniformLocation(progID, texelSizeName.c_str()));
-                GrAssert(kUnusedUniform != locations.fNormalizedTexelSizeUni);
-            }
-
             if (kUseUniform == locations.fTexDomUni) {
                 GrStringBuilder texDomName;
                 tex_domain_name(s, &texDomName);
@@ -1198,38 +1185,6 @@
 // Stage code generation
 //============================================================================
 
-namespace {
-
-void gen2x2FS(int stageNum,
-              GrGLShaderBuilder* segments,
-              GrGLProgram::StageUniLocations* locations,
-              const char* samplerName,
-              const char* texelSizeName,
-              const char* fsOutColor,
-              GrStringBuilder& texFunc) {
-    locations->fNormalizedTexelSizeUni = kUseUniform;
-    if (segments->fComplexCoord) {
-        // assign the coord to a var rather than compute 4x.
-        GrStringBuilder coordVar("tCoord");
-        coordVar.appendS32(stageNum);
-        segments->fFSCode.appendf("\t%s %s = %s;\n",
-                            float_vector_type_str(segments->fCoordDims),
-                            coordVar.c_str(), segments->fSampleCoords.c_str());
-        segments->fSampleCoords = coordVar;
-    }
-    GrAssert(2 == segments->fCoordDims);
-    GrStringBuilder accumVar("accum");
-    accumVar.appendS32(stageNum);
-    segments->fFSCode.appendf("\tvec4 %s  = %s(%s, %s + vec2(-%s.x,-%s.y))%s;\n", accumVar.c_str(), texFunc.c_str(), samplerName, segments->fSampleCoords.c_str(), texelSizeName, texelSizeName, segments->fSwizzle.c_str());
-    segments->fFSCode.appendf("\t%s += %s(%s, %s + vec2(+%s.x,-%s.y))%s;\n", accumVar.c_str(), texFunc.c_str(), samplerName, segments->fSampleCoords.c_str(), texelSizeName, texelSizeName, segments->fSwizzle.c_str());
-    segments->fFSCode.appendf("\t%s += %s(%s, %s + vec2(-%s.x,+%s.y))%s;\n", accumVar.c_str(), texFunc.c_str(), samplerName, segments->fSampleCoords.c_str(), texelSizeName, texelSizeName, segments->fSwizzle.c_str());
-    segments->fFSCode.appendf("\t%s += %s(%s, %s + vec2(+%s.x,+%s.y))%s;\n", accumVar.c_str(), texFunc.c_str(), samplerName, segments->fSampleCoords.c_str(), texelSizeName, texelSizeName, segments->fSwizzle.c_str());
-    segments->fFSCode.appendf("\t%s = .25 * %s%s;\n", fsOutColor, accumVar.c_str(), segments->fModulate.c_str());
-
-}
-
-}
-
 void GrGLProgram::genStageCode(const GrGLContextInfo& gl,
                                int stageNum,
                                const GrGLProgram::StageDesc& desc,
@@ -1281,15 +1236,6 @@
         samplerName.c_str());
     locations->fSamplerUni = kUseUniform;
 
-    const char* texelSizeName = NULL;
-    if (StageDesc::k2x2_FetchMode == desc.fFetchMode) {
-        GrStringBuilder ntsName;
-        normalized_texel_size_name(stageNum, &ntsName);
-        texelSizeName = segments->addUniform(
-            GrGLShaderBuilder::kFragment_VariableLifetime,
-            kVec2f_GrSLType, ntsName.c_str()).getName().c_str();
-    }
-
     const char *varyingVSName, *varyingFSName;
     segments->addVarying(GrSLFloatVectorType(segments->fVaryingDims),
                          "Stage",
@@ -1325,8 +1271,7 @@
     if (desc.fOptFlags & (StageDesc::kIdentityMatrix_OptFlagBit |
                           StageDesc::kNoPerspective_OptFlagBit)) {
         sampleMode = GrGLShaderBuilder::kDefault_SamplerMode;
-    } else if (NULL == customStage &&
-               StageDesc::kSingle_FetchMode == desc.fFetchMode) {
+    } else if (NULL == customStage) {
         sampleMode = GrGLShaderBuilder::kProj_SamplerMode;
     }
     segments->setupTextureAccess(sampleMode, stageNum);
@@ -1358,40 +1303,31 @@
 
     // NOTE: GrGLProgramStages are now responsible for fetching
     if (NULL == customStage) {
-        switch (desc.fFetchMode) {
-        case StageDesc::k2x2_FetchMode:
-            GrAssert(!(desc.fInConfigFlags & kMulByAlphaMask));
-            gen2x2FS(stageNum, segments, locations,
-                samplerName.c_str(), texelSizeName, fsOutColor,
-                segments->fTexFunc);
-            break;
-        default:
-            if (desc.fInConfigFlags & kMulByAlphaMask) {
-                // only one of the mul by alpha flags should be set
-                GrAssert(GrIsPow2(kMulByAlphaMask & desc.fInConfigFlags));
-                GrAssert(!(desc.fInConfigFlags & 
-                           StageDesc::kSmearAlpha_InConfigFlag));
-                GrAssert(!(desc.fInConfigFlags & 
-                           StageDesc::kSmearRed_InConfigFlag));
-                segments->fFSCode.appendf("\t%s = %s(%s, %s)%s;\n",
-                                          fsOutColor,
-                                          segments->fTexFunc.c_str(), 
-                                          samplerName.c_str(),
-                                          segments->fSampleCoords.c_str(),
-                                          segments->fSwizzle.c_str());
-                if (desc.fInConfigFlags &
-                    StageDesc::kMulRGBByAlpha_RoundUp_InConfigFlag) {
-                    segments->fFSCode.appendf("\t%s = vec4(ceil(%s.rgb*%s.a*255.0)/255.0,%s.a)%s;\n",
-                                              fsOutColor, fsOutColor, fsOutColor,
-                                              fsOutColor, segments->fModulate.c_str());
-                } else {
-                    segments->fFSCode.appendf("\t%s = vec4(floor(%s.rgb*%s.a*255.0)/255.0,%s.a)%s;\n",
-                                              fsOutColor, fsOutColor, fsOutColor,
-                                              fsOutColor, segments->fModulate.c_str());
-                }
+        if (desc.fInConfigFlags & kMulByAlphaMask) {
+            // only one of the mul by alpha flags should be set
+            GrAssert(GrIsPow2(kMulByAlphaMask & desc.fInConfigFlags));
+            GrAssert(!(desc.fInConfigFlags & 
+                       StageDesc::kSmearAlpha_InConfigFlag));
+            GrAssert(!(desc.fInConfigFlags & 
+                       StageDesc::kSmearRed_InConfigFlag));
+            segments->fFSCode.appendf("\t%s = %s(%s, %s)%s;\n",
+                                      fsOutColor,
+                                      segments->fTexFunc.c_str(), 
+                                      samplerName.c_str(),
+                                      segments->fSampleCoords.c_str(),
+                                      segments->fSwizzle.c_str());
+            if (desc.fInConfigFlags &
+                StageDesc::kMulRGBByAlpha_RoundUp_InConfigFlag) {
+                segments->fFSCode.appendf("\t%s = vec4(ceil(%s.rgb*%s.a*255.0)/255.0,%s.a)%s;\n",
+                                          fsOutColor, fsOutColor, fsOutColor,
+                                          fsOutColor, segments->fModulate.c_str());
             } else {
-                segments->emitDefaultFetch(fsOutColor, samplerName.c_str());
+                segments->fFSCode.appendf("\t%s = vec4(floor(%s.rgb*%s.a*255.0)/255.0,%s.a)%s;\n",
+                                          fsOutColor, fsOutColor, fsOutColor,
+                                          fsOutColor, segments->fModulate.c_str());
             }
+        } else {
+            segments->emitDefaultFetch(fsOutColor, samplerName.c_str());
         }
     }
 
diff --git a/src/gpu/gl/GrGLProgram.h b/src/gpu/gl/GrGLProgram.h
index be154b0..026a854 100644
--- a/src/gpu/gl/GrGLProgram.h
+++ b/src/gpu/gl/GrGLProgram.h
@@ -108,12 +108,6 @@
                 kIsEnabled_OptFlagBit           = 1 << 7
             };
 
-            enum FetchMode {
-                kSingle_FetchMode,
-                k2x2_FetchMode,
-
-                kFetchModeCnt,
-            };
             /**
               Flags set based on a src texture's pixel config. The operations
               described are performed after reading a texel.
@@ -148,7 +142,7 @@
 
                 /**
                  Multiply r,g,b by a after texture reads. This flag incompatible
-                 with kSmearAlpha and may only be used with FetchMode kSingle.
+                 with kSmearAlpha.
 
                  It is assumed the src texture has 8bit color components. After
                  reading the texture one version rounds up to the next multiple
@@ -165,7 +159,6 @@
 
             uint8_t fOptFlags;
             uint8_t fInConfigFlags; // bitfield of InConfigFlags values
-            uint8_t fFetchMode;     // casts to enum FetchMode
 
             /** Non-zero if user-supplied code will write the stage's
                 contribution to the fragment shader. */
@@ -250,12 +243,10 @@
 
     struct StageUniLocations {
         GrGLint fTextureMatrixUni;
-        GrGLint fNormalizedTexelSizeUni;
         GrGLint fSamplerUni;
         GrGLint fTexDomUni;
         void reset() {
             fTextureMatrixUni = kUnusedUniform;
-            fNormalizedTexelSizeUni = kUnusedUniform;
             fSamplerUni = kUnusedUniform;
             fTexDomUni = kUnusedUniform;
         }
diff --git a/src/gpu/gl/GrGpuGL.cpp b/src/gpu/gl/GrGpuGL.cpp
index 379d40d..a1cd1e0 100644
--- a/src/gpu/gl/GrGpuGL.cpp
+++ b/src/gpu/gl/GrGpuGL.cpp
@@ -2064,7 +2064,6 @@
 unsigned gr_to_gl_filter(GrSamplerState::Filter filter) {
     switch (filter) {
         case GrSamplerState::kBilinear_Filter:
-        case GrSamplerState::k4x4Downsample_Filter:
             return GR_GL_LINEAR;
         case GrSamplerState::kNearest_Filter:
             return GR_GL_NEAREST;
diff --git a/src/gpu/gl/GrGpuGL.h b/src/gpu/gl/GrGpuGL.h
index 3fab9ee..f19981a 100644
--- a/src/gpu/gl/GrGpuGL.h
+++ b/src/gpu/gl/GrGpuGL.h
@@ -250,9 +250,6 @@
     // flushes the parameters for convolution
     void flushConvolution(int stage);
 
-    // flushes the normalized texel size
-    void flushTexelSize(int stage);
-
     // flushes the color matrix
     void flushColorMatrix();
 
diff --git a/src/gpu/gl/GrGpuGL_program.cpp b/src/gpu/gl/GrGpuGL_program.cpp
index 30c5422..99847db 100644
--- a/src/gpu/gl/GrGpuGL_program.cpp
+++ b/src/gpu/gl/GrGpuGL_program.cpp
@@ -247,22 +247,6 @@
     }
 }
 
-void GrGpuGL::flushTexelSize(int s) {
-    const int& uni = fProgramData->fUniLocations.fStages[s].fNormalizedTexelSizeUni;
-    if (GrGLProgram::kUnusedUniform != uni) {
-        const GrGLTexture* texture =
-            static_cast<const GrGLTexture*>(this->getDrawState().getTexture(s));
-        if (texture->width() != fProgramData->fTextureWidth[s] ||
-            texture->height() != fProgramData->fTextureHeight[s]) {
-
-            float texelSize[] = {1.f / texture->width(),
-                                 1.f / texture->height()};
-            GL_CALL(Uniform2fv(uni, 1, texelSize));
-            fProgramData->fTextureWidth[s] = texture->width();
-            fProgramData->fTextureHeight[s] = texture->height();
-        }
-    }
-}
 
 void GrGpuGL::flushColorMatrix() {
     const ProgramDesc& desc = fCurrentProgram.getDesc();
@@ -452,8 +436,6 @@
 
             this->flushTextureMatrixAndDomain(s);
 
-            this->flushTexelSize(s);
-
             if (NULL != fProgramData->fCustomStage[s]) {
                 const GrSamplerState& sampler =
                     this->getDrawState().getSampler(s);
@@ -761,21 +743,6 @@
                 stage.fOptFlags |= StageDesc::kNoPerspective_OptFlagBit;
             }
 
-            switch (sampler.getFilter()) {
-                // these both can use a regular texture2D()
-                case GrSamplerState::kNearest_Filter:
-                case GrSamplerState::kBilinear_Filter:
-                    stage.fFetchMode = StageDesc::kSingle_FetchMode;
-                    break;
-                // performs 4 texture2D()s
-                case GrSamplerState::k4x4Downsample_Filter:
-                    stage.fFetchMode = StageDesc::k2x2_FetchMode;
-                    break;
-                default:
-                    GrCrash("Unexpected filter!");
-                    break;
-            }
-
             if (sampler.hasTextureDomain()) {
                 GrAssert(GrSamplerState::kClamp_WrapMode ==
                             sampler.getWrapX() &&
@@ -823,7 +790,6 @@
         } else {
             stage.fOptFlags         = 0;
             stage.fInConfigFlags    = 0;
-            stage.fFetchMode        = (StageDesc::FetchMode) 0;
             stage.fCustomStageKey   = 0;
             customStages[s] = NULL;
         }
diff --git a/src/gpu/gl/GrGpuGL_unittest.cpp b/src/gpu/gl/GrGpuGL_unittest.cpp
index 498823d..3543830 100644
--- a/src/gpu/gl/GrGpuGL_unittest.cpp
+++ b/src/gpu/gl/GrGpuGL_unittest.cpp
@@ -205,16 +205,11 @@
 
             stage.fOptFlags = STAGE_OPTS[random_int(&random, GR_ARRAY_COUNT(STAGE_OPTS))];
             stage.fInConfigFlags = IN_CONFIG_FLAGS[random_int(&random, GR_ARRAY_COUNT(IN_CONFIG_FLAGS))];
-            stage.fFetchMode = random_int(&random, StageDesc::kFetchModeCnt);
             stage.setEnabled(VertexUsesStage(s, pdesc.fVertexLayout));
             static const uint32_t kMulByAlphaMask =
                 StageDesc::kMulRGBByAlpha_RoundUp_InConfigFlag |
                 StageDesc::kMulRGBByAlpha_RoundDown_InConfigFlag;
 
-            if (StageDesc::k2x2_FetchMode == stage.fFetchMode) {
-                stage.fInConfigFlags &= ~kMulByAlphaMask;
-            }
-
             bool useCustomEffect = random_bool(&random);
             if (useCustomEffect) {
                 customStages[s].reset(create_random_effect(&stage, &random));