Index: src/gpu/gl/GrGLProgram.cpp |
diff --git a/src/gpu/gl/GrGLProgram.cpp b/src/gpu/gl/GrGLProgram.cpp |
index 691cac5433f4fda824dd00474951cf3f55603ddc..e55ebce023bb615287d06d1ffe9942727ff7ab24 100644 |
--- a/src/gpu/gl/GrGLProgram.cpp |
+++ b/src/gpu/gl/GrGLProgram.cpp |
@@ -48,7 +48,6 @@ GrGLProgram::GrGLProgram(GrGpuGL* gpu, |
fDstCopyTexUnit = -1; |
fColor = GrColor_ILLEGAL; |
- fColorFilterColor = GrColor_ILLEGAL; |
if (fDesc.getHeader().fHasVertexCode || |
!fGpu->glCaps().fixedFunctionSupport() || |
@@ -99,117 +98,6 @@ void GrGLProgram::overrideBlend(GrBlendCoeff* srcCoeff, |
} |
} |
-namespace { |
-// given two blend coefficients determine whether the src |
-// and/or dst computation can be omitted. |
-inline void need_blend_inputs(SkXfermode::Coeff srcCoeff, |
- SkXfermode::Coeff dstCoeff, |
- bool* needSrcValue, |
- bool* needDstValue) { |
- if (SkXfermode::kZero_Coeff == srcCoeff) { |
- switch (dstCoeff) { |
- // these all read the src |
- case SkXfermode::kSC_Coeff: |
- case SkXfermode::kISC_Coeff: |
- case SkXfermode::kSA_Coeff: |
- case SkXfermode::kISA_Coeff: |
- *needSrcValue = true; |
- break; |
- default: |
- *needSrcValue = false; |
- break; |
- } |
- } else { |
- *needSrcValue = true; |
- } |
- if (SkXfermode::kZero_Coeff == dstCoeff) { |
- switch (srcCoeff) { |
- // these all read the dst |
- case SkXfermode::kDC_Coeff: |
- case SkXfermode::kIDC_Coeff: |
- case SkXfermode::kDA_Coeff: |
- case SkXfermode::kIDA_Coeff: |
- *needDstValue = true; |
- break; |
- default: |
- *needDstValue = false; |
- break; |
- } |
- } else { |
- *needDstValue = true; |
- } |
-} |
- |
-/** |
- * Create a blend_coeff * value string to be used in shader code. Sets empty |
- * string if result is trivially zero. |
- */ |
-inline void blend_term_string(SkString* str, SkXfermode::Coeff coeff, |
- const char* src, const char* dst, |
- const char* value) { |
- switch (coeff) { |
- case SkXfermode::kZero_Coeff: /** 0 */ |
- *str = ""; |
- break; |
- case SkXfermode::kOne_Coeff: /** 1 */ |
- *str = value; |
- break; |
- case SkXfermode::kSC_Coeff: |
- str->printf("(%s * %s)", src, value); |
- break; |
- case SkXfermode::kISC_Coeff: |
- str->printf("((vec4(1) - %s) * %s)", src, value); |
- break; |
- case SkXfermode::kDC_Coeff: |
- str->printf("(%s * %s)", dst, value); |
- break; |
- case SkXfermode::kIDC_Coeff: |
- str->printf("((vec4(1) - %s) * %s)", dst, value); |
- break; |
- case SkXfermode::kSA_Coeff: /** src alpha */ |
- str->printf("(%s.a * %s)", src, value); |
- break; |
- case SkXfermode::kISA_Coeff: /** inverse src alpha (i.e. 1 - sa) */ |
- str->printf("((1.0 - %s.a) * %s)", src, value); |
- break; |
- case SkXfermode::kDA_Coeff: /** dst alpha */ |
- str->printf("(%s.a * %s)", dst, value); |
- break; |
- case SkXfermode::kIDA_Coeff: /** inverse dst alpha (i.e. 1 - da) */ |
- str->printf("((1.0 - %s.a) * %s)", dst, value); |
- break; |
- default: |
- GrCrash("Unexpected xfer coeff."); |
- break; |
- } |
-} |
-/** |
- * Adds a line to the fragment shader code which modifies the color by |
- * the specified color filter. |
- */ |
-void add_color_filter(GrGLShaderBuilder* builder, |
- const char * outputVar, |
- SkXfermode::Coeff uniformCoeff, |
- SkXfermode::Coeff colorCoeff, |
- const char* filterColor, |
- const char* inColor) { |
- SkString colorStr, constStr; |
- blend_term_string(&colorStr, colorCoeff, filterColor, inColor, inColor); |
- blend_term_string(&constStr, uniformCoeff, filterColor, inColor, filterColor); |
- GrGLSLExpr<4> sum; |
- if (colorStr.isEmpty() && constStr.isEmpty()) { |
- sum = GrGLSLExpr<4>(0); |
- } else if (colorStr.isEmpty()) { |
- sum = constStr; |
- } else if (constStr.isEmpty()) { |
- sum = colorStr; |
- } else { |
- sum = GrGLSLExpr<4>(colorStr) + GrGLSLExpr<4>(constStr); |
- } |
- builder->fsCodeAppendf("\t%s = %s;\n", outputVar, sum.c_str()); |
-} |
-} |
- |
bool GrGLProgram::genProgram(GrGLShaderBuilder* builder, |
const GrEffectStage* colorStages[], |
const GrEffectStage* coverageStages[]) { |
@@ -220,35 +108,12 @@ bool GrGLProgram::genProgram(GrGLShaderBuilder* builder, |
// incoming color to current stage being processed. |
GrGLSLExpr<4> inColor = builder->getInputColor(); |
- // Get the coeffs for the Mode-based color filter, determine if color is needed. |
- SkXfermode::Coeff colorCoeff; |
- SkXfermode::Coeff filterColorCoeff; |
- SkAssertResult( |
- SkXfermode::ModeAsCoeff(header.fColorFilterXfermode, |
- &filterColorCoeff, |
- &colorCoeff)); |
- bool needColor, needFilterColor; |
- need_blend_inputs(filterColorCoeff, colorCoeff, &needFilterColor, &needColor); |
- |
fColorEffects.reset( |
builder->createAndEmitEffects(colorStages, |
fDesc.effectKeys(), |
- needColor ? fDesc.numColorEffects() : 0, |
+ fDesc.numColorEffects(), |
&inColor)); |
- // Insert the color filter. This will soon be replaced by a color effect. |
- if (SkXfermode::kDst_Mode != header.fColorFilterXfermode) { |
- const char* colorFilterColorUniName = NULL; |
- fUniformHandles.fColorFilterUni = builder->addUniform(GrGLShaderBuilder::kFragment_Visibility, |
- kVec4f_GrSLType, "FilterColor", |
- &colorFilterColorUniName); |
- |
- builder->fsCodeAppend("\tvec4 filteredColor;\n"); |
- add_color_filter(builder, "filteredColor", filterColorCoeff, |
- colorCoeff, colorFilterColorUniName, inColor.c_str()); |
- inColor = "filteredColor"; |
- } |
- |
/////////////////////////////////////////////////////////////////////////// |
// compute the partial coverage |
GrGLSLExpr<4> inCoverage = builder->getInputCoverage(); |
@@ -354,15 +219,6 @@ void GrGLProgram::setData(GrDrawState::BlendOptFlags blendOpts, |
this->setCoverage(drawState, coverage, sharedState); |
this->setMatrixAndRenderTargetHeight(drawState); |
- // Setup the SkXfermode::Mode-based colorfilter uniform if necessary |
- if (fUniformHandles.fColorFilterUni.isValid() && |
- fColorFilterColor != drawState.getColorFilterColor()) { |
- GrGLfloat c[4]; |
- GrColorToRGBAFloat(drawState.getColorFilterColor(), c); |
- fUniformManager.set4fv(fUniformHandles.fColorFilterUni, 0, 1, c); |
- fColorFilterColor = drawState.getColorFilterColor(); |
- } |
- |
if (NULL != dstCopy) { |
if (fUniformHandles.fDstCopyTopLeftUni.isValid()) { |
fUniformManager.set2f(fUniformHandles.fDstCopyTopLeftUni, |
@@ -411,7 +267,7 @@ void GrGLProgram::setColor(const GrDrawState& drawState, |
} |
break; |
case GrGLProgramDesc::kUniform_ColorInput: |
- if (fColor != color) { |
+ if (fColor != color && fUniformHandles.fColorUni.isValid()) { |
// OpenGL ES doesn't support unsigned byte varieties of glUniform |
GrGLfloat c[4]; |
GrColorToRGBAFloat(color, c); |