Index: src/gpu/effects/GrPorterDuffXferProcessor.cpp |
diff --git a/src/gpu/effects/GrPorterDuffXferProcessor.cpp b/src/gpu/effects/GrPorterDuffXferProcessor.cpp |
index bf48379bda19f6e6de86f1226e77c8de3f6dbfe1..a091a48b08e21faf3dc94e524f93163fd0508939 100644 |
--- a/src/gpu/effects/GrPorterDuffXferProcessor.cpp |
+++ b/src/gpu/effects/GrPorterDuffXferProcessor.cpp |
@@ -8,17 +8,17 @@ |
#include "effects/GrPorterDuffXferProcessor.h" |
#include "GrBlend.h" |
-#include "GrDrawState.h" |
#include "GrDrawTargetCaps.h" |
#include "GrInvariantOutput.h" |
#include "GrProcessor.h" |
+#include "GrProcOptInfo.h" |
#include "GrTypes.h" |
#include "GrXferProcessor.h" |
#include "gl/GrGLXferProcessor.h" |
#include "gl/builders/GrGLFragmentShaderBuilder.h" |
#include "gl/builders/GrGLProgramBuilder.h" |
-static bool can_tweak_alpha_for_coverage(GrBlendCoeff dstCoeff, bool isCoverageDrawing) { |
+static bool can_tweak_alpha_for_coverage(GrBlendCoeff dstCoeff) { |
/* |
The fractional coverage is f. |
The src and dst coeffs are Cs and Cd. |
@@ -27,14 +27,10 @@ static bool can_tweak_alpha_for_coverage(GrBlendCoeff dstCoeff, bool isCoverageD |
we're replacing S with S'=fS. It's obvious that that first term will always be ok. The second |
term can be rearranged as [1-(1-Cd)f]D. By substituting in the various possibilities for Cd we |
find that only 1, ISA, and ISC produce the correct destination when applied to S' and D. |
- Also, if we're directly rendering coverage (isCoverageDrawing) then coverage is treated as |
- color by definition. |
*/ |
- // TODO: Once we have a CoverageDrawing XP, we don't need to check is CoverageDrawing here |
return kOne_GrBlendCoeff == dstCoeff || |
kISA_GrBlendCoeff == dstCoeff || |
- kISC_GrBlendCoeff == dstCoeff || |
- isCoverageDrawing; |
+ kISC_GrBlendCoeff == dstCoeff; |
} |
class GrGLPorterDuffXferProcessor : public GrGLXferProcessor { |
@@ -128,14 +124,9 @@ GrGLXferProcessor* GrPorterDuffXferProcessor::createGLInstance() const { |
return SkNEW_ARGS(GrGLPorterDuffXferProcessor, (*this)); |
} |
-void GrPorterDuffXferProcessor::onComputeInvariantOutput(GrInvariantOutput* inout) const { |
- inout->setToUnknown(GrInvariantOutput::kWill_ReadInput); |
-} |
- |
GrXferProcessor::OptFlags |
GrPorterDuffXferProcessor::getOptimizations(const GrProcOptInfo& colorPOI, |
const GrProcOptInfo& coveragePOI, |
- bool isCoverageDrawing, |
bool colorWriteDisabled, |
bool doesStencilWrite, |
GrColor* overrideColor, |
@@ -153,11 +144,10 @@ GrPorterDuffXferProcessor::getOptimizations(const GrProcOptInfo& colorPOI, |
} else { |
optFlags = this->internalGetOptimizations(colorPOI, |
coveragePOI, |
- isCoverageDrawing, |
colorWriteDisabled, |
doesStencilWrite); |
} |
- this->calcOutputTypes(optFlags, caps, isCoverageDrawing || coveragePOI.isSolidWhite(), |
+ this->calcOutputTypes(optFlags, caps, coveragePOI.isSolidWhite(), |
colorPOI.readsDst() || coveragePOI.readsDst()); |
return optFlags; |
} |
@@ -208,7 +198,6 @@ void GrPorterDuffXferProcessor::calcOutputTypes(GrXferProcessor::OptFlags optFla |
GrXferProcessor::OptFlags |
GrPorterDuffXferProcessor::internalGetOptimizations(const GrProcOptInfo& colorPOI, |
const GrProcOptInfo& coveragePOI, |
- bool isCoverageDrawing, |
bool colorWriteDisabled, |
bool doesStencilWrite) { |
if (colorWriteDisabled) { |
@@ -218,13 +207,9 @@ GrPorterDuffXferProcessor::internalGetOptimizations(const GrProcOptInfo& colorPO |
bool srcAIsOne; |
bool hasCoverage; |
- if (isCoverageDrawing) { |
- srcAIsOne = colorPOI.isOpaque() && coveragePOI.isOpaque(); |
- hasCoverage = false; |
- } else { |
- srcAIsOne = colorPOI.isOpaque(); |
- hasCoverage = !coveragePOI.isSolidWhite(); |
- } |
+ |
+ srcAIsOne = colorPOI.isOpaque(); |
+ hasCoverage = !coveragePOI.isSolidWhite(); |
bool dstCoeffIsOne = kOne_GrBlendCoeff == fDstBlend || |
(kSA_GrBlendCoeff == fDstBlend && srcAIsOne); |
@@ -262,13 +247,10 @@ GrPorterDuffXferProcessor::internalGetOptimizations(const GrProcOptInfo& colorPO |
GrXferProcessor::kIgnoreCoverage_OptFlag; |
} |
} |
- } else if (isCoverageDrawing) { |
- // we have coverage but we aren't distinguishing it from alpha by request. |
- return GrXferProcessor::kSetCoverageDrawing_OptFlag; |
- } else { |
+ } 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, isCoverageDrawing)) { |
+ if (can_tweak_alpha_for_coverage(fDstBlend)) { |
return GrXferProcessor::kSetCoverageDrawing_OptFlag; |
} |
if (dstCoeffIsZero) { |
@@ -418,9 +400,8 @@ bool GrPorterDuffXPFactory::supportsRGBCoverage(GrColor /*knownColor*/, |
bool GrPorterDuffXPFactory::canApplyCoverage(const GrProcOptInfo& colorPOI, |
const GrProcOptInfo& coveragePOI, |
- bool isCoverageDrawing, |
bool colorWriteDisabled) const { |
- bool srcAIsOne = colorPOI.isOpaque() && (!isCoverageDrawing || coveragePOI.isOpaque()); |
+ bool srcAIsOne = colorPOI.isOpaque(); |
if (colorWriteDisabled) { |
return true; |
@@ -437,24 +418,19 @@ bool GrPorterDuffXPFactory::canApplyCoverage(const GrProcOptInfo& colorPOI, |
// if we don't have coverage we can check whether the dst |
// has to read at all. |
- if (isCoverageDrawing) { |
- // we have coverage but we aren't distinguishing it from alpha by request. |
+ // check whether coverage can be safely rolled into alpha |
+ // of if we can skip color computation and just emit coverage |
+ if (this->canTweakAlphaForCoverage()) { |
return true; |
- } else { |
- // check whether coverage can be safely rolled into alpha |
- // of if we can skip color computation and just emit coverage |
- if (this->canTweakAlphaForCoverage(isCoverageDrawing)) { |
- return true; |
- } |
- if (dstCoeffIsZero) { |
- if (kZero_GrBlendCoeff == fSrcCoeff) { |
- return true; |
- } else if (srcAIsOne) { |
- return true; |
- } |
- } else if (dstCoeffIsOne) { |
+ } |
+ if (dstCoeffIsZero) { |
+ if (kZero_GrBlendCoeff == fSrcCoeff) { |
return true; |
+ } else if (srcAIsOne) { |
+ return true; |
} |
+ } else if (dstCoeffIsOne) { |
+ return true; |
} |
// TODO: once all SkXferEffects are XP's then we will never reads dst here since only XP's |
@@ -469,9 +445,8 @@ bool GrPorterDuffXPFactory::canApplyCoverage(const GrProcOptInfo& colorPOI, |
bool GrPorterDuffXPFactory::willBlendWithDst(const GrProcOptInfo& colorPOI, |
const GrProcOptInfo& coveragePOI, |
- bool isCoverageDrawing, |
bool colorWriteDisabled) const { |
- if (!(isCoverageDrawing || coveragePOI.isSolidWhite())) { |
+ if (!coveragePOI.isSolidWhite()) { |
return true; |
} |
@@ -485,7 +460,7 @@ bool GrPorterDuffXPFactory::willBlendWithDst(const GrProcOptInfo& colorPOI, |
return true; |
} |
- bool srcAIsOne = colorPOI.isOpaque() && (!isCoverageDrawing || coveragePOI.isOpaque()); |
+ bool srcAIsOne = colorPOI.isOpaque(); |
if (!(kZero_GrBlendCoeff == fDstCoeff || |
(kISA_GrBlendCoeff == fDstCoeff && srcAIsOne))) { |
@@ -495,8 +470,8 @@ bool GrPorterDuffXPFactory::willBlendWithDst(const GrProcOptInfo& colorPOI, |
return false; |
} |
-bool GrPorterDuffXPFactory::canTweakAlphaForCoverage(bool isCoverageDrawing) const { |
- return can_tweak_alpha_for_coverage(fDstCoeff, isCoverageDrawing); |
+bool GrPorterDuffXPFactory::canTweakAlphaForCoverage() const { |
+ return can_tweak_alpha_for_coverage(fDstCoeff); |
} |
bool GrPorterDuffXPFactory::getOpaqueAndKnownColor(const GrProcOptInfo& colorPOI, |