| Index: src/gpu/gl/GrGLProgram.cpp
|
| diff --git a/src/gpu/gl/GrGLProgram.cpp b/src/gpu/gl/GrGLProgram.cpp
|
| index c1b3a31218f7af5082a755346539724c8fe7f20e..7ddd8613f19b571f606ac6000682bb4fc1b8c3e9 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->shouldUseFixedFunctionTexturing()) {
|
| @@ -97,117 +96,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[]) {
|
| @@ -216,40 +104,17 @@ bool GrGLProgram::genProgram(GrGLShaderBuilder* builder,
|
| const GrGLProgramDesc::KeyHeader& header = fDesc.getHeader();
|
|
|
| // 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);
|
| + GrGLSLExpr4 inColor = builder->getInputColor();
|
|
|
| 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();
|
| + GrGLSLExpr4 inCoverage = builder->getInputCoverage();
|
|
|
| fCoverageEffects.reset(
|
| builder->createAndEmitEffects(coverageStages,
|
| @@ -272,13 +137,13 @@ bool GrGLProgram::genProgram(GrGLShaderBuilder* builder,
|
| const char* secondaryOutputName = builder->enableSecondaryOutput();
|
|
|
| // default coeff to ones for kCoverage_DualSrcOutput
|
| - GrGLSLExpr<4> coeff(1);
|
| + GrGLSLExpr4 coeff(1);
|
| if (GrGLProgramDesc::kSecondaryCoverageISA_CoverageOutput == header.fCoverageOutput) {
|
| // Get (1-A) into coeff
|
| - coeff = GrGLSLExprCast4(GrGLSLExpr<1>(1) - GrGLSLExprExtractAlpha(inColor));
|
| + coeff = GrGLSLExpr4::VectorCast(GrGLSLExpr1(1) - inColor.a());
|
| } else if (GrGLProgramDesc::kSecondaryCoverageISC_CoverageOutput == header.fCoverageOutput) {
|
| // Get (1-RGBA) into coeff
|
| - coeff = GrGLSLExpr<4>(1) - inColor;
|
| + coeff = GrGLSLExpr4(1) - inColor;
|
| }
|
| // Get coeff * coverage into modulate and then write that to the dual source output.
|
| builder->fsCodeAppendf("\t%s = %s;\n", secondaryOutputName, (coeff * inCoverage).c_str());
|
| @@ -288,12 +153,12 @@ bool GrGLProgram::genProgram(GrGLShaderBuilder* builder,
|
| // combine color and coverage as frag color
|
|
|
| // Get "color * coverage" into fragColor
|
| - GrGLSLExpr<4> fragColor = inColor * inCoverage;
|
| + GrGLSLExpr4 fragColor = inColor * inCoverage;
|
| // Now tack on "+(1-coverage)dst onto the frag color if we were asked to do so.
|
| if (GrGLProgramDesc::kCombineWithDst_CoverageOutput == header.fCoverageOutput) {
|
| - GrGLSLExpr<4> dstCoeff = GrGLSLExpr<4>(1) - inCoverage;
|
| + GrGLSLExpr4 dstCoeff = GrGLSLExpr4(1) - inCoverage;
|
|
|
| - GrGLSLExpr<4> dstContribution = dstCoeff * GrGLSLExpr<4>(builder->dstColor());
|
| + GrGLSLExpr4 dstContribution = dstCoeff * GrGLSLExpr4(builder->dstColor());
|
|
|
| fragColor = fragColor + dstContribution;
|
| }
|
| @@ -352,15 +217,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,
|
| @@ -409,7 +265,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);
|
|
|