aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar egdaniel <egdaniel@google.com>2015-05-08 12:48:35 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2015-05-08 12:48:35 -0700
commit7dfc27ca42795dd5e9dc779c10b1afda8440d492 (patch)
treed2fa2fa23146c89e8b0fc8fea6f56a2ff239aa75 /src
parentf36cca8a61e0aa0730dea5e35ea781ac8ae59014 (diff)
Remove coverage multiplies when it is known to be fully opaque.
Diffstat (limited to 'src')
-rw-r--r--src/gpu/GrDefaultGeoProcFactory.cpp11
-rw-r--r--src/gpu/effects/GrPorterDuffXferProcessor.cpp78
2 files changed, 45 insertions, 44 deletions
diff --git a/src/gpu/GrDefaultGeoProcFactory.cpp b/src/gpu/GrDefaultGeoProcFactory.cpp
index 0349af6480..1996d77d79 100644
--- a/src/gpu/GrDefaultGeoProcFactory.cpp
+++ b/src/gpu/GrDefaultGeoProcFactory.cpp
@@ -49,18 +49,17 @@ public:
bool hasVertexCoverage = SkToBool(fInCoverage) && !init.fCoverageIgnored;
bool covIsSolidWhite = !hasVertexCoverage && 0xff == this->coverage();
- if (covIsSolidWhite) {
+ if (init.fCoverageIgnored) {
+ local->fInputCoverageType = kIgnored_GrGPInput;
+ } else if (covIsSolidWhite) {
local->fInputCoverageType = kAllOnes_GrGPInput;
- } else if (!hasVertexCoverage) {
- local->fInputCoverageType = kUniform_GrGPInput;
- local->fCoverage = this->coverage();
} else if (hasVertexCoverage) {
SkASSERT(fInCoverage);
local->fInputCoverageType = kAttribute_GrGPInput;
} else {
- local->fInputCoverageType = kIgnored_GrGPInput;
+ local->fInputCoverageType = kUniform_GrGPInput;
+ local->fCoverage = this->coverage();
}
-
local->fUsesLocalCoords = init.fUsesLocalCoords;
}
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;