Remove hasMixedSamples() from GrPipelineBuilder

This info is unknown until after any clip has been applied to the
stencil settings, so it's misleading to include in the builder.

BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1952323002

Review-Url: https://codereview.chromium.org/1952323002
diff --git a/src/gpu/GrClipMaskManager.cpp b/src/gpu/GrClipMaskManager.cpp
index 3988e67..654b315 100644
--- a/src/gpu/GrClipMaskManager.cpp
+++ b/src/gpu/GrClipMaskManager.cpp
@@ -448,7 +448,14 @@
                                     SkIntToScalar(-clip.origin().fY) };
         // When there are multiple samples we want to do per-sample clipping, not compute a
         // fractional pixel coverage.
-        bool disallowAnalyticAA = rt->isUnifiedMultisampled() || pipelineBuilder.hasMixedSamples();
+        bool disallowAnalyticAA = rt->isStencilBufferMultisampled();
+        if (disallowAnalyticAA && !rt->numColorSamples()) {
+            // With a single color sample, any coverage info is lost from color once it hits the
+            // color buffer anyway, so we may as well use coverage AA if nothing else in the pipe
+            // is multisampled.
+            disallowAnalyticAA = pipelineBuilder.isHWAntialias() ||
+                                 !pipelineBuilder.getStencil().isDisabled();
+        }
         const GrFragmentProcessor* clipFP = nullptr;
         if (elements.isEmpty() ||
             (requiresAA &&
diff --git a/src/gpu/GrPipeline.cpp b/src/gpu/GrPipeline.cpp
index 55cbf34..8d384ef 100644
--- a/src/gpu/GrPipeline.cpp
+++ b/src/gpu/GrPipeline.cpp
@@ -21,11 +21,13 @@
     const GrPipelineBuilder& builder = *args.fPipelineBuilder;
 
     // Create XferProcessor from DS's XPFactory
+    bool hasMixedSamples = builder.getRenderTarget()->hasMixedSamples() &&
+                           (builder.isHWAntialias() || !builder.getStencil().isDisabled());
     const GrXPFactory* xpFactory = builder.getXPFactory();
     SkAutoTUnref<GrXferProcessor> xferProcessor;
     if (xpFactory) {
         xferProcessor.reset(xpFactory->createXferProcessor(args.fOpts,
-                                                           builder.hasMixedSamples(),
+                                                           hasMixedSamples,
                                                            &args.fDstTexture,
                                                            *args.fCaps));
         if (!xferProcessor) {
@@ -36,10 +38,10 @@
         xferProcessor.reset(GrPorterDuffXPFactory::CreateSrcOverXferProcessor(
                                                                         *args.fCaps,
                                                                         args.fOpts,
-                                                                        builder.hasMixedSamples(),
+                                                                        hasMixedSamples,
                                                                         &args.fDstTexture));
     }
-   GrColor overrideColor = GrColor_ILLEGAL;
+    GrColor overrideColor = GrColor_ILLEGAL;
     if (args.fOpts.fColorPOI.firstEffectiveProcessorIndex() != 0) {
         overrideColor = args.fOpts.fColorPOI.inputColorToFirstEffectiveProccesor();
     }
diff --git a/src/gpu/GrPipelineBuilder.cpp b/src/gpu/GrPipelineBuilder.cpp
index 252c265..1fd568e 100644
--- a/src/gpu/GrPipelineBuilder.cpp
+++ b/src/gpu/GrPipelineBuilder.cpp
@@ -55,11 +55,9 @@
 bool GrPipelineBuilder::willXPNeedDstTexture(const GrCaps& caps,
                                              const GrPipelineOptimizations& optimizations) const {
     if (this->getXPFactory()) {
-        return this->getXPFactory()->willNeedDstTexture(caps, optimizations,
-                                                        this->hasMixedSamples());
+        return this->getXPFactory()->willNeedDstTexture(caps, optimizations);
     }
-    return GrPorterDuffXPFactory::SrcOverWillNeedDstTexture(caps, optimizations,
-                                                            this->hasMixedSamples());
+    return GrPorterDuffXPFactory::SrcOverWillNeedDstTexture(caps, optimizations);
 }
 
 void GrPipelineBuilder::AutoRestoreFragmentProcessorState::set(
diff --git a/src/gpu/GrPipelineBuilder.h b/src/gpu/GrPipelineBuilder.h
index 08ac5db..2f78fc5 100644
--- a/src/gpu/GrPipelineBuilder.h
+++ b/src/gpu/GrPipelineBuilder.h
@@ -193,15 +193,6 @@
      */
     void setRenderTarget(GrRenderTarget* target) { fRenderTarget.reset(SkSafeRef(target)); }
 
-    /**
-     * Returns whether the rasterizer and stencil test (if any) will run at a higher sample rate
-     * than the color buffer. In is scenario, the higher sample rate is resolved during blending.
-     */
-    bool hasMixedSamples() const {
-        return fRenderTarget->hasMixedSamples() &&
-               (this->isHWAntialias() || !fStencilSettings.isDisabled());
-    }
-
     /// @}
 
     ///////////////////////////////////////////////////////////////////////////
diff --git a/src/gpu/GrXferProcessor.cpp b/src/gpu/GrXferProcessor.cpp
index 3e2ffaa..910b873 100644
--- a/src/gpu/GrXferProcessor.cpp
+++ b/src/gpu/GrXferProcessor.cpp
@@ -197,7 +197,7 @@
                                                   const DstTexture* dstTexture,
                                                   const GrCaps& caps) const {
 #ifdef SK_DEBUG
-    if (this->willReadDstColor(caps, optimizations, hasMixedSamples)) {
+    if (this->willReadDstColor(caps, optimizations)) {
         if (!caps.shaderCaps()->dstReadInShaderSupport()) {
             SkASSERT(dstTexture && dstTexture->texture());
         } else {
@@ -212,15 +212,12 @@
 }
 
 bool GrXPFactory::willNeedDstTexture(const GrCaps& caps,
-                                     const GrPipelineOptimizations& optimizations,
-                                     bool hasMixedSamples) const {
-    return (this->willReadDstColor(caps, optimizations, hasMixedSamples) &&
+                                     const GrPipelineOptimizations& optimizations) const {
+    return (this->willReadDstColor(caps, optimizations) &&
             !caps.shaderCaps()->dstReadInShaderSupport());
 }
 
 bool GrXPFactory::willReadDstColor(const GrCaps& caps,
-                                   const GrPipelineOptimizations& optimizations,
-                                   bool hasMixedSamples) const {
-    return optimizations.fOverrides.fUsePLSDstRead || this->onWillReadDstColor(caps, optimizations,
-                                                                               hasMixedSamples);
+                                   const GrPipelineOptimizations& optimizations) const {
+    return optimizations.fOverrides.fUsePLSDstRead || this->onWillReadDstColor(caps, optimizations);
 }
diff --git a/src/gpu/effects/GrCustomXfermode.cpp b/src/gpu/effects/GrCustomXfermode.cpp
index dccec0c..50fe5cb 100644
--- a/src/gpu/effects/GrCustomXfermode.cpp
+++ b/src/gpu/effects/GrCustomXfermode.cpp
@@ -337,9 +337,7 @@
                                            bool hasMixedSamples,
                                            const DstTexture*) const override;
 
-    bool onWillReadDstColor(const GrCaps& caps,
-                          const GrPipelineOptimizations& optimizations,
-                          bool hasMixedSamples) const override;
+    bool onWillReadDstColor(const GrCaps&, const GrPipelineOptimizations&) const override;
 
     bool onIsEqual(const GrXPFactory& xpfBase) const override {
         const CustomXPFactory& xpf = xpfBase.cast<CustomXPFactory>();
@@ -373,8 +371,7 @@
 }
 
 bool CustomXPFactory::onWillReadDstColor(const GrCaps& caps,
-                                         const GrPipelineOptimizations& optimizations,
-                                         bool hasMixedSamples) const {
+                                         const GrPipelineOptimizations& optimizations) const {
     return !can_use_hw_blend_equation(fHWBlendEquation, optimizations, caps);
 }
 
diff --git a/src/gpu/effects/GrDisableColorXP.h b/src/gpu/effects/GrDisableColorXP.h
index 3182eef6..5584954 100644
--- a/src/gpu/effects/GrDisableColorXP.h
+++ b/src/gpu/effects/GrDisableColorXP.h
@@ -31,9 +31,7 @@
                                            bool hasMixedSamples,
                                            const DstTexture* dstTexture) const override;
 
-    bool onWillReadDstColor(const GrCaps& caps,
-                            const GrPipelineOptimizations& optimizations,
-                            bool hasMixedSamples) const override {
+    bool onWillReadDstColor(const GrCaps&, const GrPipelineOptimizations&) const override {
         return false;
     }
 
diff --git a/src/gpu/effects/GrPorterDuffXferProcessor.cpp b/src/gpu/effects/GrPorterDuffXferProcessor.cpp
index 733e552..8168de6 100644
--- a/src/gpu/effects/GrPorterDuffXferProcessor.cpp
+++ b/src/gpu/effects/GrPorterDuffXferProcessor.cpp
@@ -799,8 +799,7 @@
 }
 
 bool GrPorterDuffXPFactory::onWillReadDstColor(const GrCaps& caps,
-                                               const GrPipelineOptimizations& optimizations,
-                                               bool hasMixedSamples) const {
+                                               const GrPipelineOptimizations& optimizations) const {
     if (caps.shaderCaps()->dualSourceBlendingSupport()) {
         return false;
     }
@@ -816,9 +815,12 @@
         }
         return get_lcd_blend_formula(optimizations.fCoveragePOI, fXfermode).hasSecondaryOutput();
     }
+
     // We fallback on the shader XP when the blend formula would use dual source blending but we
     // don't have support for it.
-    return get_blend_formula(optimizations.fColorPOI, optimizations.fCoveragePOI, hasMixedSamples,
+    static const bool kHasMixedSamples = false;
+    SkASSERT(!caps.usesMixedSamples()); // We never use mixed samples without dual source blending.
+    return get_blend_formula(optimizations.fColorPOI, optimizations.fCoveragePOI, kHasMixedSamples,
                              fXfermode).hasSecondaryOutput();
 }
 
@@ -897,8 +899,7 @@
 }
 
 bool GrPorterDuffXPFactory::SrcOverWillNeedDstTexture(const GrCaps& caps,
-                                                      const GrPipelineOptimizations& optimizations,
-                                                      bool hasMixedSamples) {
+                                                     const GrPipelineOptimizations& optimizations) {
     if (caps.shaderCaps()->dstReadInShaderSupport() ||
         caps.shaderCaps()->dualSourceBlendingSupport()) {
         return false;
@@ -915,8 +916,11 @@
         return get_lcd_blend_formula(optimizations.fCoveragePOI,
                                      SkXfermode::kSrcOver_Mode).hasSecondaryOutput();
     }
+
     // We fallback on the shader XP when the blend formula would use dual source blending but we
     // don't have support for it.
+    static const bool kHasMixedSamples = false;
+    SkASSERT(!caps.usesMixedSamples()); // We never use mixed samples without dual source blending.
     return get_blend_formula(optimizations.fColorPOI, optimizations.fCoveragePOI,
-                             hasMixedSamples, SkXfermode::kSrcOver_Mode).hasSecondaryOutput();
+                             kHasMixedSamples, SkXfermode::kSrcOver_Mode).hasSecondaryOutput();
 }