Index: src/gpu/gl/GrGLProgram.cpp |
=================================================================== |
--- src/gpu/gl/GrGLProgram.cpp (revision 8756) |
+++ src/gpu/gl/GrGLProgram.cpp (working copy) |
@@ -96,18 +96,22 @@ |
void GrGLProgram::overrideBlend(GrBlendCoeff* srcCoeff, |
GrBlendCoeff* dstCoeff) const { |
- switch (fDesc.fDualSrcOutput) { |
- case GrGLProgramDesc::kNone_DualSrcOutput: |
+ switch (fDesc.fCoverageOutput) { |
+ case GrGLProgramDesc::kModulate_CoverageOutput: |
break; |
- // the prog will write a coverage value to the secondary |
+ // The prog will write a coverage value to the secondary |
// output and the dst is blended by one minus that value. |
- case GrGLProgramDesc::kCoverage_DualSrcOutput: |
- case GrGLProgramDesc::kCoverageISA_DualSrcOutput: |
- case GrGLProgramDesc::kCoverageISC_DualSrcOutput: |
- *dstCoeff = (GrBlendCoeff)GrGpu::kIS2C_GrBlendCoeff; |
- break; |
+ case GrGLProgramDesc::kSecondaryCoverage_CoverageOutput: |
+ case GrGLProgramDesc::kSecondaryCoverageISA_CoverageOutput: |
+ case GrGLProgramDesc::kSecondaryCoverageISC_CoverageOutput: |
+ *dstCoeff = (GrBlendCoeff)GrGpu::kIS2C_GrBlendCoeff; |
+ break; |
+ case GrGLProgramDesc::kCombineWithDst_CoverageOutput: |
robertphillips
2013/04/18 22:02:03
rm trailing /?
bsalomon
2013/04/19 13:14:49
Done.
|
+ // We should only have set this if the blend was specified as (1, 0)/ |
+ GrAssert(kOne_GrBlendCoeff == *srcCoeff && kZero_GrBlendCoeff == *dstCoeff); |
+ break; |
default: |
- GrCrash("Unexpected dual source blend output"); |
+ GrCrash("Unexpected coverage output"); |
break; |
} |
} |
@@ -418,6 +422,20 @@ |
return true; |
} |
robertphillips
2013/04/18 22:02:03
move into above namespace?
bsalomon
2013/04/19 13:14:49
Done.
|
+void expand_known_value4f(SkString* string, GrSLConstantVec vec) { |
+ GrAssert(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; |
+ } |
+} |
+ |
bool GrGLProgram::genProgram(const GrEffectStage* stages[]) { |
GrAssert(0 == fProgramID); |
@@ -564,14 +582,16 @@ |
} |
} |
- if (GrGLProgramDesc::kNone_DualSrcOutput != fDesc.fDualSrcOutput) { |
+ GrGLProgramDesc::CoverageOutput coverageOutput = |
+ static_cast<GrGLProgramDesc::CoverageOutput>(fDesc.fCoverageOutput); |
+ if (GrGLProgramDesc::CoverageOutputUsesSecondaryOutput(coverageOutput)) { |
builder.fFSOutputs.push_back().set(kVec4f_GrSLType, |
GrGLShaderVar::kOut_TypeModifier, |
dual_source_output_name()); |
// default coeff to ones for kCoverage_DualSrcOutput |
SkString coeff; |
GrSLConstantVec knownCoeffValue = kOnes_GrSLConstantVec; |
robertphillips
2013/04/18 22:02:03
Why not use coverageOutput here rather than fDesc.
|
- if (GrGLProgramDesc::kCoverageISA_DualSrcOutput == fDesc.fDualSrcOutput) { |
+ if (GrGLProgramDesc::kSecondaryCoverageISA_CoverageOutput == fDesc.fCoverageOutput) { |
// Get (1-A) into coeff |
SkString inColorAlpha; |
GrGLSLGetComponent4f(&inColorAlpha, |
@@ -585,7 +605,7 @@ |
kOnes_GrSLConstantVec, |
knownColorValue, |
true); |
- } else if (GrGLProgramDesc::kCoverageISC_DualSrcOutput == fDesc.fDualSrcOutput) { |
+ } else if (GrGLProgramDesc::kSecondaryCoverageISC_CoverageOutput == coverageOutput) { |
// Get (1-RGBA) into coeff |
knownCoeffValue = GrGLSLSubtractf<4>(&coeff, |
NULL, |
@@ -609,15 +629,42 @@ |
/////////////////////////////////////////////////////////////////////////// |
// combine color and coverage as frag color |
robertphillips
2013/04/18 22:02:03
Add quotes ... "color * coverage"?
bsalomon
2013/04/19 13:14:49
Done.
|
- // Get color * coverage into modulate and write that to frag shader's output. |
- SkString modulate; |
- GrGLSLModulatef<4>(&modulate, |
- inColor.c_str(), |
- inCoverage.c_str(), |
- knownColorValue, |
- knownCoverageValue, |
- false); |
- builder.fsCodeAppendf("\t%s = %s;\n", colorOutput.getName().c_str(), modulate.c_str()); |
+ // Get color * coverage into fragColor |
+ SkString fragColor; |
+ GrSLConstantVec knownFragColorValue = GrGLSLModulatef<4>(&fragColor, |
+ inColor.c_str(), |
+ inCoverage.c_str(), |
+ knownColorValue, |
+ knownCoverageValue, |
+ true); |
robertphillips
2013/04/18 22:02:03
"+(1-coverage)dst"?
bsalomon
2013/04/19 13:14:49
Done.
|
+ // Now tack on +(1-coverage)dst onto the frag color if we were asked to do so. |
+ if (GrGLProgramDesc::kCombineWithDst_CoverageOutput == coverageOutput) { |
+ SkString dstCoeff; |
+ GrSLConstantVec knownDstCoeffValue = GrGLSLSubtractf<4>(&dstCoeff, |
+ NULL, |
+ inCoverage.c_str(), |
+ kOnes_GrSLConstantVec, |
+ knownCoverageValue, |
robertphillips
2013/04/18 22:02:03
indent on true?
bsalomon
2013/04/19 13:14:49
Done.
|
+ 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); |
+ } |
+ builder.fsCodeAppendf("\t%s = %s;\n", colorOutput.getName().c_str(), fragColor.c_str()); |
/////////////////////////////////////////////////////////////////////////// |
// insert GS |