| Index: src/gpu/effects/GrPorterDuffXferProcessor.cpp
|
| diff --git a/src/gpu/effects/GrPorterDuffXferProcessor.cpp b/src/gpu/effects/GrPorterDuffXferProcessor.cpp
|
| index 506383a29ea9ce969ab103dd0d5333d4f78e8037..73d58245c00766ee117c04dd3c97d13cfaa078ab 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;
|
|
|