Revert "Revert "Make it possible to query GrXPFactory for dst texture without GrPipelineAnalysis.""

This reverts commit 3329cceab5feca230df1caee16be045249228dc1.

Reason for revert: Bot failures are unrelated to the original change.

Change-Id: I21b5927dc4384a25930bdefe16e57bcc9276ffa4
Reviewed-on: https://skia-review.googlesource.com/7347
Commit-Queue: Brian Salomon <bsalomon@google.com>
Reviewed-by: Brian Salomon <bsalomon@google.com>
diff --git a/src/gpu/GrXferProcessor.cpp b/src/gpu/GrXferProcessor.cpp
index 7de0d77..d88259d 100644
--- a/src/gpu/GrXferProcessor.cpp
+++ b/src/gpu/GrXferProcessor.cpp
@@ -180,6 +180,40 @@
 
 ///////////////////////////////////////////////////////////////////////////////
 
+using ColorType = GrXPFactory::ColorType;
+using CoverageType = GrXPFactory::CoverageType;
+
+ColorType analysis_color_type(const GrPipelineAnalysis& analysis) {
+    if (analysis.fColorPOI.validFlags() == kRGBA_GrColorComponentFlags) {
+        return GrColorIsOpaque(analysis.fColorPOI.color()) ? ColorType::kOpaqueConstant
+                                                           : ColorType::kConstant;
+    }
+    if ((analysis.fColorPOI.validFlags() & kA_GrColorComponentFlag) &&
+        GrColorIsOpaque(analysis.fColorPOI.color())) {
+        return ColorType::kOpaque;
+    }
+    return ColorType::kUnknown;
+}
+
+CoverageType analysis_coverage_type(const GrPipelineAnalysis& analysis) {
+    if (analysis.fCoveragePOI.isSolidWhite()) {
+        return CoverageType::kNone;
+    }
+    if (analysis.fCoveragePOI.isLCDCoverage()) {
+        return CoverageType::kLCD;
+    }
+    return CoverageType::kSingleChannel;
+}
+
+bool GrXPFactory::willReadDstColor(const GrCaps& caps, const GrPipelineAnalysis& analysis) const {
+    if (analysis.fUsesPLSDstRead) {
+        return true;
+    }
+    ColorType colorType = analysis_color_type(analysis);
+    CoverageType coverageType = analysis_coverage_type(analysis);
+    return this->willReadDstColor(caps, colorType, coverageType);
+}
+
 GrXferProcessor* GrXPFactory::createXferProcessor(const GrPipelineAnalysis& analysis,
                                                   bool hasMixedSamples,
                                                   const DstTexture* dstTexture,
@@ -200,9 +234,6 @@
 }
 
 bool GrXPFactory::willNeedDstTexture(const GrCaps& caps, const GrPipelineAnalysis& analysis) const {
-    return (this->willReadDstColor(caps, analysis) && !caps.shaderCaps()->dstReadInShaderSupport());
-}
-
-bool GrXPFactory::willReadDstColor(const GrCaps& caps, const GrPipelineAnalysis& analysis) const {
-    return analysis.fUsesPLSDstRead || this->onWillReadDstColor(caps, analysis);
+    return !analysis.fUsesPLSDstRead && !caps.shaderCaps()->dstReadInShaderSupport() &&
+           this->willReadDstColor(caps, analysis);
 }