diff options
author | 2015-05-08 12:48:35 -0700 | |
---|---|---|
committer | 2015-05-08 12:48:35 -0700 | |
commit | 7dfc27ca42795dd5e9dc779c10b1afda8440d492 (patch) | |
tree | d2fa2fa23146c89e8b0fc8fea6f56a2ff239aa75 /src/gpu/effects/GrPorterDuffXferProcessor.cpp | |
parent | f36cca8a61e0aa0730dea5e35ea781ac8ae59014 (diff) |
Remove coverage multiplies when it is known to be fully opaque.
BUG=skia:
Review URL: https://codereview.chromium.org/1132883002
Diffstat (limited to 'src/gpu/effects/GrPorterDuffXferProcessor.cpp')
-rw-r--r-- | src/gpu/effects/GrPorterDuffXferProcessor.cpp | 78 |
1 files changed, 40 insertions, 38 deletions
diff --git a/src/gpu/effects/GrPorterDuffXferProcessor.cpp b/src/gpu/effects/GrPorterDuffXferProcessor.cpp index 506383a29e..73d58245c0 100644 --- a/src/gpu/effects/GrPorterDuffXferProcessor.cpp +++ b/src/gpu/effects/GrPorterDuffXferProcessor.cpp @@ -406,7 +406,8 @@ PorterDuffXferProcessor::internalGetOptimizations(const GrProcOptInfo& colorPOI, // if there is no coverage and coeffs are (1,0) then we // won't need to read the dst at all, it gets replaced by src fDstBlend = kZero_GrBlendCoeff; - return GrXferProcessor::kNone_Opt; + return GrXferProcessor::kNone_Opt | + GrXferProcessor::kIgnoreCoverage_OptFlag; } else if (kZero_GrBlendCoeff == fSrcBlend) { // if the op is "clear" then we don't need to emit a color // or blend, just write transparent black into the dst. @@ -416,53 +417,54 @@ PorterDuffXferProcessor::internalGetOptimizations(const GrProcOptInfo& colorPOI, GrXferProcessor::kIgnoreCoverage_OptFlag; } } - } else { - // check whether coverage can be safely rolled into alpha - // of if we can skip color computation and just emit coverage - if (can_tweak_alpha_for_coverage(fDstBlend)) { - if (colorPOI.allStagesMultiplyInput()) { - return GrXferProcessor::kSetCoverageDrawing_OptFlag | - GrXferProcessor::kCanTweakAlphaForCoverage_OptFlag; - } else { - return GrXferProcessor::kSetCoverageDrawing_OptFlag; + return GrXferProcessor::kIgnoreCoverage_OptFlag; + } + + // check whether coverage can be safely rolled into alpha + // of if we can skip color computation and just emit coverage + if (can_tweak_alpha_for_coverage(fDstBlend)) { + if (colorPOI.allStagesMultiplyInput()) { + return GrXferProcessor::kSetCoverageDrawing_OptFlag | + GrXferProcessor::kCanTweakAlphaForCoverage_OptFlag; + } else { + return GrXferProcessor::kSetCoverageDrawing_OptFlag; - } } - if (dstCoeffIsZero) { - if (kZero_GrBlendCoeff == fSrcBlend) { - // the source color is not included in the blend - // the dst coeff is effectively zero so blend works out to: - // (c)(0)D + (1-c)D = (1-c)D. - fDstBlend = kISA_GrBlendCoeff; - return GrXferProcessor::kIgnoreColor_OptFlag | - GrXferProcessor::kSetCoverageDrawing_OptFlag; - } else if (srcAIsOne) { - // the dst coeff is effectively zero so blend works out to: - // cS + (c)(0)D + (1-c)D = cS + (1-c)D. - // If Sa is 1 then we can replace Sa with c - // and set dst coeff to 1-Sa. - fDstBlend = kISA_GrBlendCoeff; - if (colorPOI.allStagesMultiplyInput()) { - return GrXferProcessor::kSetCoverageDrawing_OptFlag | - GrXferProcessor::kCanTweakAlphaForCoverage_OptFlag; - } else { - return GrXferProcessor::kSetCoverageDrawing_OptFlag; - - } - } - } else if (dstCoeffIsOne) { - // the dst coeff is effectively one so blend works out to: - // cS + (c)(1)D + (1-c)D = cS + D. - fDstBlend = kOne_GrBlendCoeff; + } + if (dstCoeffIsZero) { + if (kZero_GrBlendCoeff == fSrcBlend) { + // the source color is not included in the blend + // the dst coeff is effectively zero so blend works out to: + // (c)(0)D + (1-c)D = (1-c)D. + fDstBlend = kISA_GrBlendCoeff; + return GrXferProcessor::kIgnoreColor_OptFlag | + GrXferProcessor::kSetCoverageDrawing_OptFlag; + } else if (srcAIsOne) { + // the dst coeff is effectively zero so blend works out to: + // cS + (c)(0)D + (1-c)D = cS + (1-c)D. + // If Sa is 1 then we can replace Sa with c + // and set dst coeff to 1-Sa. + fDstBlend = kISA_GrBlendCoeff; if (colorPOI.allStagesMultiplyInput()) { return GrXferProcessor::kSetCoverageDrawing_OptFlag | - GrXferProcessor::kCanTweakAlphaForCoverage_OptFlag; + GrXferProcessor::kCanTweakAlphaForCoverage_OptFlag; } else { return GrXferProcessor::kSetCoverageDrawing_OptFlag; } + } + } else if (dstCoeffIsOne) { + // the dst coeff is effectively one so blend works out to: + // cS + (c)(1)D + (1-c)D = cS + D. + fDstBlend = kOne_GrBlendCoeff; + if (colorPOI.allStagesMultiplyInput()) { + return GrXferProcessor::kSetCoverageDrawing_OptFlag | + GrXferProcessor::kCanTweakAlphaForCoverage_OptFlag; + } else { return GrXferProcessor::kSetCoverageDrawing_OptFlag; + } + return GrXferProcessor::kSetCoverageDrawing_OptFlag; } return GrXferProcessor::kNone_Opt; |