aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar bsalomon@google.com <bsalomon@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2012-06-04 20:06:02 +0000
committerGravatar bsalomon@google.com <bsalomon@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2012-06-04 20:06:02 +0000
commitd2ae1fad78bbd37d77bd437ea14fb7df22c672d8 (patch)
treee04b10a51ceef7edfcf802d9071a58c183245bbc
parenta1e5795279bd085496fa04c59e588f440bf30457 (diff)
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
-rw-r--r--include/gpu/GrSamplerState.h9
-rw-r--r--src/gpu/gl/GrGLProgram.cpp112
-rw-r--r--src/gpu/gl/GrGLProgram.h11
-rw-r--r--src/gpu/gl/GrGpuGL.cpp1
-rw-r--r--src/gpu/gl/GrGpuGL.h3
-rw-r--r--src/gpu/gl/GrGpuGL_program.cpp34
-rw-r--r--src/gpu/gl/GrGpuGL_unittest.cpp5
7 files changed, 25 insertions, 150 deletions
diff --git a/include/gpu/GrSamplerState.h b/include/gpu/GrSamplerState.h
index f52775de74..f8ad1c0715 100644
--- a/include/gpu/GrSamplerState.h
+++ b/include/gpu/GrSamplerState.h
@@ -26,15 +26,6 @@ public:
* 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 2512ba0408..4f5ea65e2d 100644
--- a/src/gpu/gl/GrGLProgram.cpp
+++ b/src/gpu/gl/GrGLProgram.cpp
@@ -80,11 +80,6 @@ inline void tex_matrix_name(int stage, GrStringBuilder* s) {
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 @@ void GrGLProgram::getUniformLocationsAndInitCache(const GrGLContextInfo& gl,
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 @@ void GrGLProgram::getUniformLocationsAndInitCache(const GrGLContextInfo& gl,
// 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 @@ void GrGLProgram::genStageCode(const GrGLContextInfo& gl,
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 @@ void GrGLProgram::genStageCode(const GrGLContextInfo& gl,
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 @@ void GrGLProgram::genStageCode(const GrGLContextInfo& gl,
// 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 be154b0160..026a8548a1 100644
--- a/src/gpu/gl/GrGLProgram.h
+++ b/src/gpu/gl/GrGLProgram.h
@@ -108,12 +108,6 @@ public:
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 @@ public:
/**
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 @@ public:
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 @@ public:
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 379d40dff8..a1cd1e08f6 100644
--- a/src/gpu/gl/GrGpuGL.cpp
+++ b/src/gpu/gl/GrGpuGL.cpp
@@ -2064,7 +2064,6 @@ namespace {
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 3fab9eea53..f19981a8e6 100644
--- a/src/gpu/gl/GrGpuGL.h
+++ b/src/gpu/gl/GrGpuGL.h
@@ -250,9 +250,6 @@ private:
// 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 30c542232f..99847db14a 100644
--- a/src/gpu/gl/GrGpuGL_program.cpp
+++ b/src/gpu/gl/GrGpuGL_program.cpp
@@ -247,22 +247,6 @@ void GrGpuGL::flushTextureMatrixAndDomain(int s) {
}
}
-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 @@ bool GrGpuGL::flushGraphicsState(GrPrimitiveType type) {
this->flushTextureMatrixAndDomain(s);
- this->flushTexelSize(s);
-
if (NULL != fProgramData->fCustomStage[s]) {
const GrSamplerState& sampler =
this->getDrawState().getSampler(s);
@@ -761,21 +743,6 @@ void GrGpuGL::buildProgram(GrPrimitiveType type,
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 @@ void GrGpuGL::buildProgram(GrPrimitiveType type,
} 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 498823df43..3543830730 100644
--- a/src/gpu/gl/GrGpuGL_unittest.cpp
+++ b/src/gpu/gl/GrGpuGL_unittest.cpp
@@ -205,16 +205,11 @@ bool GrGpuGL::programUnitTest() {
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));