Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(869)

Unified Diff: src/gpu/gl/GrGLProgram.cpp

Issue 25048002: Express (GLSL expression, possibly known value) pairs as a class (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: rebase Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/gpu/gl/GrGLProgram.cpp
diff --git a/src/gpu/gl/GrGLProgram.cpp b/src/gpu/gl/GrGLProgram.cpp
index 2f8e8076636abcfdc7e99117b5b2c532e2fe7771..8ffa472c82233cf00010861d7b2766cc0257783d 100644
--- a/src/gpu/gl/GrGLProgram.cpp
+++ b/src/gpu/gl/GrGLProgram.cpp
@@ -144,13 +144,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("((%s - %s) * %s)", GrGLSLExpr<4>(1).c_str(), 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("((%s - %s) * %s)", GrGLSLExpr<4>(1).c_str(), dst, value);
break;
case SkXfermode::kSA_Coeff: /** src alpha */
str->printf("(%s.a * %s)", src, value);
@@ -182,29 +182,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(const GrEffectStage* colorStages[],
@@ -221,8 +210,7 @@ bool GrGLProgram::genProgram(const GrEffectStage* colorStages[],
}
// 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;
@@ -249,7 +237,6 @@ bool GrGLProgram::genProgram(const GrEffectStage* colorStages[],
fDesc.effectKeys(),
fDesc.numColorEffects(),
&inColor,
- &knownColorValue,
effectUniformArrays.get(),
glEffects.get());
@@ -266,24 +253,14 @@ bool GrGLProgram::genProgram(const GrEffectStage* colorStages[],
&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();
for (int e = 0; e < fDesc.numCoverageEffects(); ++e) {
effectUniformArrays[e] = &fCoverageEffects[e].fSamplerUnis;
@@ -293,7 +270,6 @@ bool GrGLProgram::genProgram(const GrEffectStage* colorStages[],
fDesc.getEffectKeys() + fDesc.numColorEffects(),
fDesc.numCoverageEffects(),
&inCoverage,
- &knownCoverageValue,
effectUniformArrays.get(),
glEffects.get());
for (int e = 0; e < fDesc.numCoverageEffects(); ++e) {
@@ -301,8 +277,8 @@ bool GrGLProgram::genProgram(const GrEffectStage* colorStages[],
}
// 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 {
@@ -315,79 +291,30 @@ bool GrGLProgram::genProgram(const GrEffectStage* colorStages[],
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 = GrGLSLExpr<4>::VectorCast(1 - inColor.a());
bsalomon 2013/10/02 15:18:04 This line looks a bit odd to me. Does the 1 get ca
Kimmo Kinnunen 2013/10/08 12:18:29 It will use the Expr<M> operator-(int, Expr<M>). T
bsalomon 2013/10/08 14:45:27 Ah-ha! I missed that operator on first read. This
Kimmo Kinnunen 2013/10/09 13:39:59 ..
bsalomon 2013/10/09 19:53:31 I'm not 100% sure that I follow the example but I
} 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());

Powered by Google App Engine
This is Rietveld 408576698