Index: src/gpu/effects/GrPorterDuffXferProcessor.cpp |
diff --git a/src/gpu/effects/GrPorterDuffXferProcessor.cpp b/src/gpu/effects/GrPorterDuffXferProcessor.cpp |
index 6255e4a9138773db51495591f9d7244c270f3727..8557bd2745f9358572ea9abe26523304df6747c9 100644 |
--- a/src/gpu/effects/GrPorterDuffXferProcessor.cpp |
+++ b/src/gpu/effects/GrPorterDuffXferProcessor.cpp |
@@ -66,11 +66,28 @@ public: |
} |
} |
- fsBuilder->codeAppendf("%s = %s * %s;", args.fOutputPrimary, args.fInputColor, |
- args.fInputCoverage); |
- if (GrPorterDuffXferProcessor::kCombineWithDst_PrimaryOutputType == xp.primaryOutputType()){ |
- fsBuilder->codeAppendf("%s += (vec4(1.0) - %s) * %s;", args.fOutputPrimary, |
- args.fInputCoverage, fsBuilder->dstColor()); |
+ switch (xp.primaryOutputType()) { |
+ case GrPorterDuffXferProcessor::kNone_PrimaryOutputType: |
+ fsBuilder->codeAppendf("%s = vec4(0);", args.fOutputPrimary); |
+ break; |
+ case GrPorterDuffXferProcessor::kColor_PrimaryOutputType: |
+ fsBuilder->codeAppendf("%s = %s;", args.fOutputPrimary, args.fInputColor); |
+ break; |
+ case GrPorterDuffXferProcessor::kCoverage_PrimaryOutputType: |
+ fsBuilder->codeAppendf("%s = %s;", args.fOutputPrimary, args.fInputCoverage); |
+ break; |
+ case GrPorterDuffXferProcessor::kModulate_PrimaryOutputType: |
+ case GrPorterDuffXferProcessor::kCombineWithDst_PrimaryOutputType: |
+ fsBuilder->codeAppendf("%s = %s * %s;", args.fOutputPrimary, args.fInputColor, |
+ args.fInputCoverage); |
+ if (GrPorterDuffXferProcessor::kCombineWithDst_PrimaryOutputType == |
+ xp.primaryOutputType()){ |
+ fsBuilder->codeAppendf("%s += (vec4(1.0) - %s) * %s;", args.fOutputPrimary, |
+ args.fInputCoverage, fsBuilder->dstColor()); |
+ } |
+ break; |
+ default: |
+ SkFAIL("Unexpected Primary Output"); |
} |
} |
@@ -139,6 +156,19 @@ GrPorterDuffXferProcessor::getOptimizations(const GrProcOptInfo& colorPOI, |
void GrPorterDuffXferProcessor::calcOutputTypes(GrXferProcessor::OptFlags optFlags, |
const GrDrawTargetCaps& caps, |
bool hasSolidCoverage, bool readsDst) { |
+ if (optFlags & kClearColorStages_OptFlag) { |
+ if (optFlags & kClearCoverageStages_OptFlag) { |
+ fPrimaryOutputType = kNone_PrimaryOutputType; |
+ return; |
+ } else { |
+ fPrimaryOutputType = kCoverage_PrimaryOutputType; |
+ return; |
+ } |
+ } else if (optFlags & kClearCoverageStages_OptFlag) { |
+ fPrimaryOutputType = kColor_PrimaryOutputType; |
+ return; |
+ } |
+ |
// If we do have coverage determine whether it matters. Dual source blending is expensive so |
// we don't do it if we are doing coverage drawing. If we aren't then We always do dual source |
// blending if we have any effective coverage stages OR the geometry processor doesn't emits |