aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar egdaniel <egdaniel@google.com>2015-02-13 12:11:00 -0800
committerGravatar Commit bot <commit-bot@chromium.org>2015-02-13 12:11:00 -0800
commitf7c2d558726b8d629e1453b7201a0dd6bfda7b05 (patch)
tree814ada35dd9f3246e89433febbd6981e4c1d3f96 /src
parent0ff748ace6a53f05b52268f7a8786eeef611a839 (diff)
Determine whether we can tweakAlphaForCoverage during Pipeline/XP creation.
Diffstat (limited to 'src')
-rw-r--r--src/gpu/GrPipeline.cpp2
-rw-r--r--src/gpu/GrPrimitiveProcessor.h1
-rw-r--r--src/gpu/GrProcOptInfo.h1
-rw-r--r--src/gpu/effects/GrPorterDuffXferProcessor.cpp23
4 files changed, 25 insertions, 2 deletions
diff --git a/src/gpu/GrPipeline.cpp b/src/gpu/GrPipeline.cpp
index 3ccc72b8df..61462469de 100644
--- a/src/gpu/GrPipeline.cpp
+++ b/src/gpu/GrPipeline.cpp
@@ -102,6 +102,8 @@ GrPipeline::GrPipeline(const GrPipelineBuilder& pipelineBuilder,
fInitBT.fOverrideColor = fInitBT.fColorIgnored ? GrColor_ILLEGAL : overrideColor;
fInitBT.fCoverageIgnored = SkToBool(optFlags & GrXferProcessor::kIgnoreCoverage_OptFlag);
fInitBT.fUsesLocalCoords = usesLocalCoords;
+ fInitBT.fCanTweakAlphaForCoverage =
+ SkToBool(optFlags & GrXferProcessor::kCanTweakAlphaForCoverage_OptFlag);
}
void GrPipeline::adjustProgramFromOptimizations(const GrPipelineBuilder& pipelineBuilder,
diff --git a/src/gpu/GrPrimitiveProcessor.h b/src/gpu/GrPrimitiveProcessor.h
index a088d38b61..45668e9be6 100644
--- a/src/gpu/GrPrimitiveProcessor.h
+++ b/src/gpu/GrPrimitiveProcessor.h
@@ -83,6 +83,7 @@ struct GrPipelineInfo {
bool fCoverageIgnored;
GrColor fOverrideColor;
bool fUsesLocalCoords;
+ bool fCanTweakAlphaForCoverage;
};
/*
diff --git a/src/gpu/GrProcOptInfo.h b/src/gpu/GrProcOptInfo.h
index 6e8f615d2c..059bca4dd8 100644
--- a/src/gpu/GrProcOptInfo.h
+++ b/src/gpu/GrProcOptInfo.h
@@ -45,6 +45,7 @@ public:
bool isSolidWhite() const { return fInOut.isSolidWhite(); }
bool isOpaque() const { return fInOut.isOpaque(); }
bool isSingleComponent() const { return fInOut.isSingleComponent(); }
+ bool allStagesMultiplyInput() const { return fInOut.allStagesMulInput(); }
// TODO: Once texture pixel configs quaries are updated, we no longer need this function.
// For now this function will correctly tell us if we are using LCD text or not and should only
diff --git a/src/gpu/effects/GrPorterDuffXferProcessor.cpp b/src/gpu/effects/GrPorterDuffXferProcessor.cpp
index 6f2b63f5cb..428b76a38a 100644
--- a/src/gpu/effects/GrPorterDuffXferProcessor.cpp
+++ b/src/gpu/effects/GrPorterDuffXferProcessor.cpp
@@ -330,7 +330,13 @@ PorterDuffXferProcessor::internalGetOptimizations(const GrProcOptInfo& colorPOI,
// 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)) {
- return GrXferProcessor::kSetCoverageDrawing_OptFlag;
+ if (colorPOI.allStagesMultiplyInput()) {
+ return GrXferProcessor::kSetCoverageDrawing_OptFlag |
+ GrXferProcessor::kCanTweakAlphaForCoverage_OptFlag;
+ } else {
+ return GrXferProcessor::kSetCoverageDrawing_OptFlag;
+
+ }
}
if (dstCoeffIsZero) {
if (kZero_GrBlendCoeff == fSrcBlend) {
@@ -346,12 +352,25 @@ PorterDuffXferProcessor::internalGetOptimizations(const GrProcOptInfo& colorPOI,
// If Sa is 1 then we can replace Sa with c
// and set dst coeff to 1-Sa.
fDstBlend = kISA_GrBlendCoeff;
- return GrXferProcessor::kSetCoverageDrawing_OptFlag;
+ 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 (colorPOI.allStagesMultiplyInput()) {
+ return GrXferProcessor::kSetCoverageDrawing_OptFlag |
+ GrXferProcessor::kCanTweakAlphaForCoverage_OptFlag;
+ } else {
+ return GrXferProcessor::kSetCoverageDrawing_OptFlag;
+
+ }
return GrXferProcessor::kSetCoverageDrawing_OptFlag;
}
}