| 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
|
|
|