Revert "Revert "Create GrXferProcessor while doing GrProcessorSet analysis.""

This reverts commit 5dac9b3b5bf7e9c06c207cb92e257535c7d9ec95.

Bug: skia:
Change-Id: I3db2ec6776eb10c1f863b3992a2c8048c54b130f
Reviewed-on: https://skia-review.googlesource.com/12620
Reviewed-by: Brian Salomon <bsalomon@google.com>
Commit-Queue: Brian Salomon <bsalomon@google.com>
diff --git a/src/gpu/GrRenderTargetContext.cpp b/src/gpu/GrRenderTargetContext.cpp
index a4b7731..b0a1b6d 100644
--- a/src/gpu/GrRenderTargetContext.cpp
+++ b/src/gpu/GrRenderTargetContext.cpp
@@ -1688,30 +1688,33 @@
     }
 
     GrResourceProvider* resourceProvider = fContext->resourceProvider();
-    if (pipelineBuilder.hasUserStencilSettings() || appliedClip.hasStencilClip()) {
+    bool usesStencil = pipelineBuilder.hasUserStencilSettings() || appliedClip.hasStencilClip();
+    if (usesStencil) {
         if (!resourceProvider->attachStencilAttachment(this->accessRenderTarget())) {
             SkDebugf("ERROR creating stencil attachment. Draw skipped.\n");
             return SK_InvalidUniqueID;
         }
     }
 
-    GrProcessorSet::Analysis analysis;
-    op->analyzeProcessors(&analysis, &pipelineBuilder, &appliedClip, *this->caps());
+    bool isMixedSamples = fRenderTargetProxy->isMixedSampled() &&
+                          (pipelineBuilder.isHWAntialias() || usesStencil);
+
+    GrColor overrideColor;
+    GrProcessorSet::Analysis analysis = op->analyzeUpdateAndRecordProcessors(
+            &pipelineBuilder, &appliedClip, isMixedSamples, *this->caps(), &overrideColor);
 
     GrPipeline::InitArgs args;
     pipelineBuilder.getPipelineInitArgs(&args);
     args.fAppliedClip = &appliedClip;
     args.fRenderTarget = rt;
     args.fCaps = this->caps();
-    args.fXPInputColor = analysis.outputColor();
-    args.fXPInputCoverage = analysis.outputCoverage();
 
     if (analysis.requiresDstTexture()) {
         if (!this->setupDstTexture(fRenderTargetProxy.get(), clip, bounds, &args.fDstTexture)) {
             return SK_InvalidUniqueID;
         }
     }
-    op->initPipeline(args, analysis);
+    op->initPipeline(args, analysis, overrideColor);
     // TODO: We need to add pipeline dependencies on textures, etc before recording this op.
     op->setClippedBounds(bounds);
     return this->getOpList()->addOp(std::move(op), this);