Determine whether we can tweakAlphaForCoverage during Pipeline/XP creation.

BUG=skia:

Review URL: https://codereview.chromium.org/927623002
diff --git a/include/gpu/GrInvariantOutput.h b/include/gpu/GrInvariantOutput.h
index 269748a..4977333 100644
--- a/include/gpu/GrInvariantOutput.h
+++ b/include/gpu/GrInvariantOutput.h
@@ -210,6 +210,7 @@
     bool willUseInputColor() const { return fWillUseInputColor; }
     void resetWillUseInputColor() { fWillUseInputColor = true; }
 
+    bool allStagesMulInput() const { return !fNonMulStageFound; }
     void resetNonMulStageFound() { fNonMulStageFound = false; }
 
     bool isLCDCoverage() const { return fIsLCDCoverage; }
diff --git a/include/gpu/GrXferProcessor.h b/include/gpu/GrXferProcessor.h
index f748797..312e769 100644
--- a/include/gpu/GrXferProcessor.h
+++ b/include/gpu/GrXferProcessor.h
@@ -73,6 +73,10 @@
          * Set CoverageDrawing_StateBit
          */
         kSetCoverageDrawing_OptFlag       = 0x10,
+        /**
+         * Can tweak alpha for coverage. Currently this flag should only be used by a batch
+         */
+        kCanTweakAlphaForCoverage_OptFlag = 0x20,
     };
 
     GR_DECL_BITFIELD_OPS_FRIENDS(OptFlags);
diff --git a/src/gpu/GrPipeline.cpp b/src/gpu/GrPipeline.cpp
index 3ccc72b..6146246 100644
--- a/src/gpu/GrPipeline.cpp
+++ b/src/gpu/GrPipeline.cpp
@@ -102,6 +102,8 @@
     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 a088d38..45668e9 100644
--- a/src/gpu/GrPrimitiveProcessor.h
+++ b/src/gpu/GrPrimitiveProcessor.h
@@ -83,6 +83,7 @@
     bool fCoverageIgnored;
     GrColor fOverrideColor;
     bool fUsesLocalCoords;
+    bool fCanTweakAlphaForCoverage;
 };
 
 /*
diff --git a/src/gpu/GrProcOptInfo.h b/src/gpu/GrProcOptInfo.h
index 6e8f615..059bca4 100644
--- a/src/gpu/GrProcOptInfo.h
+++ b/src/gpu/GrProcOptInfo.h
@@ -45,6 +45,7 @@
     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 6f2b63f..428b76a 100644
--- a/src/gpu/effects/GrPorterDuffXferProcessor.cpp
+++ b/src/gpu/effects/GrPorterDuffXferProcessor.cpp
@@ -330,7 +330,13 @@
         // 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 @@
                 // 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;
         }
     }