| Index: src/gpu/gl/GrGLProgram.cpp
|
| diff --git a/src/gpu/gl/GrGLProgram.cpp b/src/gpu/gl/GrGLProgram.cpp
|
| index 1ca61e374883b1d3f9292ae8a4c34c5aea96e2ef..691cac5433f4fda824dd00474951cf3f55603ddc 100644
|
| --- a/src/gpu/gl/GrGLProgram.cpp
|
| +++ b/src/gpu/gl/GrGLProgram.cpp
|
| @@ -158,13 +158,13 @@ inline void blend_term_string(SkString* str, SkXfermode::Coeff coeff,
|
| str->printf("(%s * %s)", src, value);
|
| break;
|
| case SkXfermode::kISC_Coeff:
|
| - str->printf("((%s - %s) * %s)", GrGLSLOnesVecf(4), src, value);
|
| + 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("((%s - %s) * %s)", GrGLSLOnesVecf(4), dst, value);
|
| + str->printf("((vec4(1) - %s) * %s)", dst, value);
|
| break;
|
| case SkXfermode::kSA_Coeff: /** src alpha */
|
| str->printf("(%s.a * %s)", src, value);
|
| @@ -196,29 +196,18 @@ void add_color_filter(GrGLShaderBuilder* builder,
|
| SkString colorStr, constStr;
|
| blend_term_string(&colorStr, colorCoeff, filterColor, inColor, inColor);
|
| blend_term_string(&constStr, uniformCoeff, filterColor, inColor, filterColor);
|
| -
|
| - SkString sum;
|
| - GrGLSLAddf<4>(&sum, colorStr.c_str(), constStr.c_str());
|
| - builder->fsCodeAppendf("\t%s = %s;\n", outputVar, sum.c_str());
|
| -}
|
| -}
|
| -
|
| -namespace {
|
| -
|
| -void expand_known_value4f(SkString* string, GrSLConstantVec vec) {
|
| - SkASSERT(string->isEmpty() == (vec != kNone_GrSLConstantVec));
|
| - switch (vec) {
|
| - case kNone_GrSLConstantVec:
|
| - break;
|
| - case kZeros_GrSLConstantVec:
|
| - *string = GrGLSLZerosVecf(4);
|
| - break;
|
| - case kOnes_GrSLConstantVec:
|
| - *string = GrGLSLOnesVecf(4);
|
| - break;
|
| + 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,
|
| @@ -229,8 +218,7 @@ bool GrGLProgram::genProgram(GrGLShaderBuilder* builder,
|
| const GrGLProgramDesc::KeyHeader& header = fDesc.getHeader();
|
|
|
| // incoming color to current stage being processed.
|
| - SkString inColor = builder->getInputColor();
|
| - GrSLConstantVec knownColorValue = builder->getKnownColorValue();
|
| + GrGLSLExpr<4> inColor = builder->getInputColor();
|
|
|
| // Get the coeffs for the Mode-based color filter, determine if color is needed.
|
| SkXfermode::Coeff colorCoeff;
|
| @@ -246,8 +234,7 @@ bool GrGLProgram::genProgram(GrGLShaderBuilder* builder,
|
| builder->createAndEmitEffects(colorStages,
|
| fDesc.effectKeys(),
|
| needColor ? fDesc.numColorEffects() : 0,
|
| - &inColor,
|
| - &knownColorValue));
|
| + &inColor));
|
|
|
| // Insert the color filter. This will soon be replaced by a color effect.
|
| if (SkXfermode::kDst_Mode != header.fColorFilterXfermode) {
|
| @@ -257,35 +244,24 @@ bool GrGLProgram::genProgram(GrGLShaderBuilder* builder,
|
| &colorFilterColorUniName);
|
|
|
| builder->fsCodeAppend("\tvec4 filteredColor;\n");
|
| - const char* color;
|
| - // add_color_filter requires a real input string.
|
| - if (knownColorValue == kOnes_GrSLConstantVec) {
|
| - color = GrGLSLOnesVecf(4);
|
| - } else if (knownColorValue == kZeros_GrSLConstantVec) {
|
| - color = GrGLSLZerosVecf(4);
|
| - } else {
|
| - color = inColor.c_str();
|
| - }
|
| add_color_filter(builder, "filteredColor", filterColorCoeff,
|
| - colorCoeff, colorFilterColorUniName, color);
|
| + colorCoeff, colorFilterColorUniName, inColor.c_str());
|
| inColor = "filteredColor";
|
| }
|
|
|
| ///////////////////////////////////////////////////////////////////////////
|
| // compute the partial coverage
|
| - SkString inCoverage = builder->getInputCoverage();
|
| - GrSLConstantVec knownCoverageValue = builder->getKnownCoverageValue();
|
| + GrGLSLExpr<4> inCoverage = builder->getInputCoverage();
|
|
|
| fCoverageEffects.reset(
|
| builder->createAndEmitEffects(coverageStages,
|
| fDesc.getEffectKeys() + fDesc.numColorEffects(),
|
| fDesc.numCoverageEffects(),
|
| - &inCoverage,
|
| - &knownCoverageValue));
|
| + &inCoverage));
|
|
|
| // discard if coverage is zero
|
| - if (header.fDiscardIfZeroCoverage && kOnes_GrSLConstantVec != knownCoverageValue) {
|
| - if (kZeros_GrSLConstantVec == knownCoverageValue) {
|
| + if (header.fDiscardIfZeroCoverage && !inCoverage.isOnes()) {
|
| + if (inCoverage.isZeros()) {
|
| // This is unfortunate.
|
| builder->fsCodeAppend("\tdiscard;\n");
|
| } else {
|
| @@ -298,79 +274,30 @@ bool GrGLProgram::genProgram(GrGLShaderBuilder* builder,
|
| const char* secondaryOutputName = builder->enableSecondaryOutput();
|
|
|
| // default coeff to ones for kCoverage_DualSrcOutput
|
| - SkString coeff;
|
| - GrSLConstantVec knownCoeffValue = kOnes_GrSLConstantVec;
|
| + GrGLSLExpr<4> coeff(1);
|
| if (GrGLProgramDesc::kSecondaryCoverageISA_CoverageOutput == header.fCoverageOutput) {
|
| // Get (1-A) into coeff
|
| - SkString inColorAlpha;
|
| - GrGLSLGetComponent4f(&inColorAlpha,
|
| - inColor.c_str(),
|
| - kA_GrColorComponentFlag,
|
| - knownColorValue,
|
| - true);
|
| - knownCoeffValue = GrGLSLSubtractf<1>(&coeff,
|
| - NULL,
|
| - inColorAlpha.c_str(),
|
| - kOnes_GrSLConstantVec,
|
| - knownColorValue,
|
| - true);
|
| + coeff = GrGLSLExprCast4(1 - GrGLSLExprExtractAlpha(inColor));
|
| } else if (GrGLProgramDesc::kSecondaryCoverageISC_CoverageOutput == header.fCoverageOutput) {
|
| // Get (1-RGBA) into coeff
|
| - knownCoeffValue = GrGLSLSubtractf<4>(&coeff,
|
| - NULL,
|
| - inColor.c_str(),
|
| - kOnes_GrSLConstantVec,
|
| - knownColorValue,
|
| - true);
|
| + coeff = 1 - inColor;
|
| }
|
| // Get coeff * coverage into modulate and then write that to the dual source output.
|
| - SkString modulate;
|
| - GrGLSLModulatef<4>(&modulate,
|
| - coeff.c_str(),
|
| - inCoverage.c_str(),
|
| - knownCoeffValue,
|
| - knownCoverageValue,
|
| - false);
|
| - builder->fsCodeAppendf("\t%s = %s;\n", secondaryOutputName, modulate.c_str());
|
| + builder->fsCodeAppendf("\t%s = %s;\n", secondaryOutputName, (coeff * inCoverage).c_str());
|
| }
|
|
|
| ///////////////////////////////////////////////////////////////////////////
|
| // combine color and coverage as frag color
|
|
|
| // Get "color * coverage" into fragColor
|
| - SkString fragColor;
|
| - GrSLConstantVec knownFragColorValue = GrGLSLModulatef<4>(&fragColor,
|
| - inColor.c_str(),
|
| - inCoverage.c_str(),
|
| - knownColorValue,
|
| - knownCoverageValue,
|
| - true);
|
| + GrGLSLExpr<4> 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) {
|
| - SkString dstCoeff;
|
| - GrSLConstantVec knownDstCoeffValue = GrGLSLSubtractf<4>(&dstCoeff,
|
| - NULL,
|
| - inCoverage.c_str(),
|
| - kOnes_GrSLConstantVec,
|
| - knownCoverageValue,
|
| - true);
|
| - SkString dstContribution;
|
| - GrSLConstantVec knownDstContributionValue = GrGLSLModulatef<4>(&dstContribution,
|
| - dstCoeff.c_str(),
|
| - builder->dstColor(),
|
| - knownDstCoeffValue,
|
| - kNone_GrSLConstantVec,
|
| - true);
|
| - SkString oldFragColor = fragColor;
|
| - fragColor.reset();
|
| - GrGLSLAddf<4>(&fragColor,
|
| - oldFragColor.c_str(),
|
| - dstContribution.c_str(),
|
| - knownFragColorValue,
|
| - knownDstContributionValue,
|
| - false);
|
| - } else {
|
| - expand_known_value4f(&fragColor, knownFragColorValue);
|
| + GrGLSLExpr<4> dstCoeff = 1 - inCoverage;
|
| +
|
| + GrGLSLExpr<4> dstContribution = dstCoeff * GrGLSLExpr<4>(builder->dstColor());
|
| +
|
| + fragColor = fragColor + dstContribution;
|
| }
|
| builder->fsCodeAppendf("\t%s = %s;\n", builder->getColorOutputName(), fragColor.c_str());
|
|
|
|
|