Move GrProcessorSet into GrPipeline

Change-Id: Ibfa5e1adda3c32140590aa62a31d35654cef79dd
Reviewed-on: https://skia-review.googlesource.com/28187
Commit-Queue: Brian Salomon <bsalomon@google.com>
Reviewed-by: Robert Phillips <robertphillips@google.com>
diff --git a/src/gpu/GrOpFlushState.h b/src/gpu/GrOpFlushState.h
index 4d16856..2c860f9 100644
--- a/src/gpu/GrOpFlushState.h
+++ b/src/gpu/GrOpFlushState.h
@@ -113,7 +113,7 @@
     }
 
     template <typename... Args>
-    GrPipeline* allocPipeline(Args... args) {
+    GrPipeline* allocPipeline(Args&&... args) {
         return fPipelines.make<GrPipeline>(std::forward<Args>(args)...);
     }
 
@@ -244,7 +244,7 @@
     }
 
     template <typename... Args>
-    GrPipeline* allocPipeline(Args... args) {
+    GrPipeline* allocPipeline(Args&&... args) {
         return this->state()->allocPipeline(std::forward<Args>(args)...);
     }
 
@@ -252,16 +252,15 @@
      * Helper that makes a pipeline targeting the op's render target that incorporates the op's
      * GrAppliedClip.
      * */
-    GrPipeline* makePipeline(uint32_t pipelineFlags, const GrProcessorSet* processorSet) {
+    GrPipeline* makePipeline(uint32_t pipelineFlags, GrProcessorSet&& processorSet) {
         GrPipeline::InitArgs pipelineArgs;
         pipelineArgs.fFlags = pipelineFlags;
-        pipelineArgs.fProcessors = processorSet;
         pipelineArgs.fProxy = this->proxy();
         pipelineArgs.fAppliedClip = this->clip();
         pipelineArgs.fDstProxy = this->dstProxy();
         pipelineArgs.fCaps = &this->caps();
         pipelineArgs.fResourceProvider = this->resourceProvider();
-        return this->allocPipeline(pipelineArgs);
+        return this->allocPipeline(pipelineArgs, std::move(processorSet));
     }
 
 private:
diff --git a/src/gpu/GrPipeline.cpp b/src/gpu/GrPipeline.cpp
index 8e91d81..f684896 100644
--- a/src/gpu/GrPipeline.cpp
+++ b/src/gpu/GrPipeline.cpp
@@ -17,10 +17,9 @@
 
 #include "ops/GrOp.h"
 
-GrPipeline::GrPipeline(const InitArgs& args) {
+GrPipeline::GrPipeline(const InitArgs& args, GrProcessorSet&& processors) {
     SkASSERT(args.fProxy);
-    SkASSERT(args.fProcessors);
-    SkASSERT(args.fProcessors->isFinalized());
+    SkASSERT(processors.isFinalized());
 
     fProxy.reset(args.fProxy);
 
@@ -38,7 +37,7 @@
 
     fUserStencilSettings = args.fUserStencil;
 
-    fXferProcessor = args.fProcessors->refXferProcessor();
+    fXferProcessor = processors.refXferProcessor();
 
     if (args.fDstProxy.proxy()) {
         if (!args.fDstProxy.proxy()->instantiate(args.fResourceProvider)) {
@@ -50,24 +49,24 @@
     }
 
     // Copy GrFragmentProcessors from GrProcessorSet to Pipeline
-    fNumColorProcessors = args.fProcessors->numColorFragmentProcessors();
+    fNumColorProcessors = processors.numColorFragmentProcessors();
     int numTotalProcessors =
-            fNumColorProcessors + args.fProcessors->numCoverageFragmentProcessors();
+            fNumColorProcessors + processors.numCoverageFragmentProcessors();
     if (args.fAppliedClip && args.fAppliedClip->clipCoverageFragmentProcessor()) {
         ++numTotalProcessors;
     }
     fFragmentProcessors.reset(numTotalProcessors);
     int currFPIdx = 0;
-    for (int i = 0; i < args.fProcessors->numColorFragmentProcessors(); ++i, ++currFPIdx) {
-        const GrFragmentProcessor* fp = args.fProcessors->colorFragmentProcessor(i);
+    for (int i = 0; i < processors.numColorFragmentProcessors(); ++i, ++currFPIdx) {
+        const GrFragmentProcessor* fp = processors.colorFragmentProcessor(i);
         fFragmentProcessors[currFPIdx].reset(fp);
         if (!fp->instantiate(args.fResourceProvider)) {
             this->markAsBad();
         }
     }
 
-    for (int i = 0; i < args.fProcessors->numCoverageFragmentProcessors(); ++i, ++currFPIdx) {
-        const GrFragmentProcessor* fp = args.fProcessors->coverageFragmentProcessor(i);
+    for (int i = 0; i < processors.numCoverageFragmentProcessors(); ++i, ++currFPIdx) {
+        const GrFragmentProcessor* fp = processors.coverageFragmentProcessor(i);
         fFragmentProcessors[currFPIdx].reset(fp);
         if (!fp->instantiate(args.fResourceProvider)) {
             this->markAsBad();
diff --git a/src/gpu/GrPipeline.h b/src/gpu/GrPipeline.h
index 075f09c..c4c7599 100644
--- a/src/gpu/GrPipeline.h
+++ b/src/gpu/GrPipeline.h
@@ -76,7 +76,6 @@
 
     struct InitArgs {
         uint32_t fFlags = 0;
-        const GrProcessorSet* fProcessors = nullptr;  // Must be finalized
         const GrUserStencilSettings* fUserStencil = &GrUserStencilSettings::kUnused;
         const GrAppliedClip* fAppliedClip = nullptr;
         GrRenderTargetProxy* fProxy = nullptr;
@@ -102,7 +101,7 @@
      **/
     GrPipeline(GrRenderTargetProxy*, ScissorState, SkBlendMode);
 
-    GrPipeline(const InitArgs& args);
+    GrPipeline(const InitArgs& args, GrProcessorSet&& processors);
 
     GrPipeline(const GrPipeline&) = delete;
     GrPipeline& operator=(const GrPipeline&) = delete;
diff --git a/src/gpu/GrProcessorSet.cpp b/src/gpu/GrProcessorSet.cpp
index 21e5fc3..20d6745 100644
--- a/src/gpu/GrProcessorSet.cpp
+++ b/src/gpu/GrProcessorSet.cpp
@@ -13,10 +13,14 @@
 #include "effects/GrPorterDuffXferProcessor.h"
 
 const GrProcessorSet& GrProcessorSet::EmptySet() {
-    static const GrProcessorSet gEmpty(GrProcessorSet::Empty::kEmpty);
+    static GrProcessorSet gEmpty(GrProcessorSet::Empty::kEmpty);
     return gEmpty;
 }
 
+GrProcessorSet GrProcessorSet::MakeEmptySet() {
+    return GrProcessorSet(GrProcessorSet::Empty::kEmpty);
+}
+
 GrProcessorSet::GrProcessorSet(GrPaint&& paint) : fXP(paint.getXPFactory()) {
     fFlags = 0;
     if (paint.numColorFragmentProcessors() <= kMaxColorProcessors) {
@@ -53,6 +57,19 @@
     fFragmentProcessors[0] = colorFP.release();
 }
 
+GrProcessorSet::GrProcessorSet(GrProcessorSet&& that)
+        : fXP(std::move(that.fXP))
+        , fColorFragmentProcessorCnt(that.fColorFragmentProcessorCnt)
+        , fFragmentProcessorOffset(0)
+        , fFlags(that.fFlags) {
+    fFragmentProcessors.reset(that.fFragmentProcessors.count() - that.fFragmentProcessorOffset);
+    for (int i = 0; i < fFragmentProcessors.count(); ++i) {
+        fFragmentProcessors[i] = that.fFragmentProcessors[i + that.fFragmentProcessorOffset];
+    }
+    that.fColorFragmentProcessorCnt = 0;
+    that.fFragmentProcessors.reset(0);
+}
+
 GrProcessorSet::~GrProcessorSet() {
     for (int i = fFragmentProcessorOffset; i < fFragmentProcessors.count(); ++i) {
         if (this->isFinalized()) {
diff --git a/src/gpu/GrProcessorSet.h b/src/gpu/GrProcessorSet.h
index e3fe4c6..d3aaf6d 100644
--- a/src/gpu/GrProcessorSet.h
+++ b/src/gpu/GrProcessorSet.h
@@ -17,15 +17,18 @@
 class GrAppliedClip;
 class GrXPFactory;
 
-class GrProcessorSet : private SkNoncopyable {
+class GrProcessorSet {
 private:
     // Arbitrary constructor arg for empty set and analysis
     enum class Empty { kEmpty };
 
 public:
-    GrProcessorSet(GrPaint&& paint);
-    GrProcessorSet(SkBlendMode mode);
+    GrProcessorSet(GrPaint&&);
+    GrProcessorSet(SkBlendMode);
     GrProcessorSet(sk_sp<GrFragmentProcessor> colorFP);
+    GrProcessorSet(GrProcessorSet&&);
+    GrProcessorSet(const GrProcessorSet&) = delete;
+    GrProcessorSet& operator=(const GrProcessorSet&) = delete;
 
     ~GrProcessorSet();
 
@@ -136,6 +139,7 @@
 
     /** These are valid only for non-LCD coverage. */
     static const GrProcessorSet& EmptySet();
+    static GrProcessorSet MakeEmptySet();
     static constexpr const Analysis EmptySetAnalysis() { return Analysis(Empty::kEmpty); }
 
     SkString dumpProcessors() const;
@@ -151,6 +155,10 @@
     union XP {
         XP(const GrXPFactory* factory) : fFactory(factory) {}
         XP(const GrXferProcessor* processor) : fProcessor(processor) {}
+        explicit XP(XP&& that) : fProcessor(that.fProcessor) {
+            SkASSERT(fProcessor == that.fProcessor);
+            that.fProcessor = nullptr;
+        }
         const GrXPFactory* fFactory;
         const GrXferProcessor* fProcessor;
     };
diff --git a/src/gpu/ccpr/GrCoverageCountingPathRenderer.cpp b/src/gpu/ccpr/GrCoverageCountingPathRenderer.cpp
index 78d8347..c067e3a 100644
--- a/src/gpu/ccpr/GrCoverageCountingPathRenderer.cpp
+++ b/src/gpu/ccpr/GrCoverageCountingPathRenderer.cpp
@@ -295,11 +295,10 @@
     GrPipeline::InitArgs args;
     args.fAppliedClip = flushState->drawOpArgs().fAppliedClip;
     args.fCaps = &flushState->caps();
-    args.fProcessors = &fProcessors;
     args.fFlags = fSRGBFlags;
     args.fProxy = flushState->drawOpArgs().fProxy;
     args.fDstProxy = flushState->drawOpArgs().fDstProxy;
-    GrPipeline pipeline(args);
+    GrPipeline pipeline(args, std::move(fProcessors));
 
     int baseInstance = fBaseInstance;
 
diff --git a/src/gpu/instanced/InstancedOp.cpp b/src/gpu/instanced/InstancedOp.cpp
index 229a144..f13a1dc 100644
--- a/src/gpu/instanced/InstancedOp.cpp
+++ b/src/gpu/instanced/InstancedOp.cpp
@@ -229,7 +229,6 @@
     args.fAppliedClip = state->drawOpArgs().fAppliedClip;
     args.fCaps = &state->caps();
     args.fResourceProvider = state->resourceProvider();
-    args.fProcessors = &fProcessors;
     args.fFlags = GrAATypeIsHW(fInfo.aaType()) ? GrPipeline::kHWAntialias_Flag : 0;
     if (fAllowsSRGBInputs) {
         args.fFlags |= GrPipeline::kAllowSRGBInputs_Flag;
@@ -239,7 +238,7 @@
     }
     args.fProxy = state->drawOpArgs().fProxy;
     args.fDstProxy = state->drawOpArgs().fDstProxy;
-    GrPipeline pipeline(args);
+    GrPipeline pipeline(args, std::move(fProcessors));
 
     if (GrXferBarrierType barrierType = pipeline.xferBarrierType(*state->gpu()->caps())) {
         state->gpu()->xferBarrier(pipeline.renderTarget(), barrierType);
diff --git a/src/gpu/ops/GrAAConvexPathRenderer.cpp b/src/gpu/ops/GrAAConvexPathRenderer.cpp
index 22b2b59..af32a14 100644
--- a/src/gpu/ops/GrAAConvexPathRenderer.cpp
+++ b/src/gpu/ops/GrAAConvexPathRenderer.cpp
@@ -762,7 +762,7 @@
     }
 
 private:
-    void prepareLinesOnlyDraws(Target* target) const {
+    void prepareLinesOnlyDraws(Target* target) {
         // Setup GrGeometryProcessor
         sk_sp<GrGeometryProcessor> gp(make_lines_only_gp(fHelper.compatibleWithAlphaAsCoverage(),
                                                          fPaths.back().fViewMatrix,
@@ -821,7 +821,7 @@
         }
     }
 
-    void onPrepareDraws(Target* target) const override {
+    void onPrepareDraws(Target* target) override {
 #ifndef SK_IGNORE_LINEONLY_AA_CONVEX_PATH_OPTS
         if (fLinesOnly) {
             this->prepareLinesOnlyDraws(target);
diff --git a/src/gpu/ops/GrAAFillRectOp.cpp b/src/gpu/ops/GrAAFillRectOp.cpp
index 9d328c9..d0976a0 100644
--- a/src/gpu/ops/GrAAFillRectOp.cpp
+++ b/src/gpu/ops/GrAAFillRectOp.cpp
@@ -228,7 +228,7 @@
     }
 
 private:
-    void onPrepareDraws(Target* target) const override {
+    void onPrepareDraws(Target* target) override {
         using namespace GrDefaultGeoProcFactory;
 
         Color color(Color::kPremulGrColorAttribute_Type);
diff --git a/src/gpu/ops/GrAAHairLinePathRenderer.cpp b/src/gpu/ops/GrAAHairLinePathRenderer.cpp
index 5d12fdf..c5479b7 100644
--- a/src/gpu/ops/GrAAHairLinePathRenderer.cpp
+++ b/src/gpu/ops/GrAAHairLinePathRenderer.cpp
@@ -801,7 +801,7 @@
     }
 
 private:
-    void onPrepareDraws(Target*) const override;
+    void onPrepareDraws(Target*) override;
 
     typedef SkTArray<SkPoint, true> PtArray;
     typedef SkTArray<int, true> IntArray;
@@ -865,7 +865,7 @@
 
 }  // anonymous namespace
 
-void AAHairlineOp::onPrepareDraws(Target* target) const {
+void AAHairlineOp::onPrepareDraws(Target* target) {
     // Setup the viewmatrix and localmatrix for the GrGeometryProcessor.
     SkMatrix invert;
     if (!this->viewMatrix().invert(&invert)) {
diff --git a/src/gpu/ops/GrAALinearizingConvexPathRenderer.cpp b/src/gpu/ops/GrAALinearizingConvexPathRenderer.cpp
index 356c7ac..c1fd4f7 100644
--- a/src/gpu/ops/GrAALinearizingConvexPathRenderer.cpp
+++ b/src/gpu/ops/GrAALinearizingConvexPathRenderer.cpp
@@ -221,7 +221,7 @@
         target->draw(gp, pipeline, mesh);
     }
 
-    void onPrepareDraws(Target* target) const override {
+    void onPrepareDraws(Target* target) override {
         const GrPipeline* pipeline = fHelper.makePipeline(target);
 
         // Setup GrGeometryProcessor
diff --git a/src/gpu/ops/GrAAStrokeRectOp.cpp b/src/gpu/ops/GrAAStrokeRectOp.cpp
index e3e2b23..07d8f30 100644
--- a/src/gpu/ops/GrAAStrokeRectOp.cpp
+++ b/src/gpu/ops/GrAAStrokeRectOp.cpp
@@ -197,7 +197,7 @@
     }
 
 private:
-    void onPrepareDraws(Target*) const override;
+    void onPrepareDraws(Target*) override;
 
     static const int kMiterIndexCnt = 3 * 24;
     static const int kMiterVertexCnt = 16;
@@ -246,7 +246,7 @@
 
 }  // anonymous namespace
 
-void AAStrokeRectOp::onPrepareDraws(Target* target) const {
+void AAStrokeRectOp::onPrepareDraws(Target* target) {
     sk_sp<GrGeometryProcessor> gp(create_stroke_rect_gp(fHelper.compatibleWithAlphaAsCoverage(),
                                                         this->viewMatrix(),
                                                         fHelper.usesLocalCoords()));
diff --git a/src/gpu/ops/GrAtlasTextOp.cpp b/src/gpu/ops/GrAtlasTextOp.cpp
index 8c49e6d..e8d3caf 100644
--- a/src/gpu/ops/GrAtlasTextOp.cpp
+++ b/src/gpu/ops/GrAtlasTextOp.cpp
@@ -75,7 +75,7 @@
     return analysis.requiresDstTexture() ? RequiresDstTexture::kYes : RequiresDstTexture::kNo;
 }
 
-void GrAtlasTextOp::onPrepareDraws(Target* target) const {
+void GrAtlasTextOp::onPrepareDraws(Target* target) {
     // if we have RGB, then we won't have any SkShaders so no need to use a localmatrix.
     // TODO actually only invert if we don't have RGBA
     SkMatrix localMatrix;
@@ -93,7 +93,7 @@
     GrMaskFormat maskFormat = this->maskFormat();
 
     FlushInfo flushInfo;
-    flushInfo.fPipeline = target->makePipeline(fSRGBFlags, &fProcessors);
+    flushInfo.fPipeline = target->makePipeline(fSRGBFlags, std::move(fProcessors));
     if (this->usesDistanceFields()) {
         flushInfo.fGeometryProcessor =
                 this->setupDfProcessor(this->viewMatrix(),
diff --git a/src/gpu/ops/GrAtlasTextOp.h b/src/gpu/ops/GrAtlasTextOp.h
index 3456fe0..5c37d45 100644
--- a/src/gpu/ops/GrAtlasTextOp.h
+++ b/src/gpu/ops/GrAtlasTextOp.h
@@ -119,7 +119,7 @@
         int fVertexOffset;
     };
 
-    void onPrepareDraws(Target* target) const override;
+    void onPrepareDraws(Target*) override;
 
     GrMaskFormat maskFormat() const {
         switch (fMaskType) {
diff --git a/src/gpu/ops/GrDashOp.cpp b/src/gpu/ops/GrDashOp.cpp
index 7a23b5a..6ca55b0 100644
--- a/src/gpu/ops/GrDashOp.cpp
+++ b/src/gpu/ops/GrDashOp.cpp
@@ -356,7 +356,7 @@
         bool fHasEndRect;
     };
 
-    void onPrepareDraws(Target* target) const override {
+    void onPrepareDraws(Target* target) override {
         int instanceCount = fLines.count();
         SkPaint::Cap cap = this->cap();
         bool isRoundCap = SkPaint::kRound_Cap == cap;
@@ -662,7 +662,7 @@
         if (fAllowsSRGBInputs) {
             pipelineFlags |= GrPipeline::kAllowSRGBInputs_Flag;
         }
-        const GrPipeline* pipeline = target->makePipeline(pipelineFlags, &fProcessorSet);
+        const GrPipeline* pipeline = target->makePipeline(pipelineFlags, std::move(fProcessorSet));
         helper.recordDraw(target, gp.get(), pipeline);
     }
 
diff --git a/src/gpu/ops/GrDefaultPathRenderer.cpp b/src/gpu/ops/GrDefaultPathRenderer.cpp
index 891c5a5..fb72085 100644
--- a/src/gpu/ops/GrDefaultPathRenderer.cpp
+++ b/src/gpu/ops/GrDefaultPathRenderer.cpp
@@ -380,7 +380,7 @@
     }
 
 private:
-    void onPrepareDraws(Target* target) const override {
+    void onPrepareDraws(Target* target) override {
         sk_sp<GrGeometryProcessor> gp;
         {
             using namespace GrDefaultGeoProcFactory;
diff --git a/src/gpu/ops/GrDrawAtlasOp.cpp b/src/gpu/ops/GrDrawAtlasOp.cpp
index f5d636c..6659c6a 100644
--- a/src/gpu/ops/GrDrawAtlasOp.cpp
+++ b/src/gpu/ops/GrDrawAtlasOp.cpp
@@ -117,7 +117,7 @@
     return string;
 }
 
-void GrDrawAtlasOp::onPrepareDraws(Target* target) const {
+void GrDrawAtlasOp::onPrepareDraws(Target* target) {
     // Setup geometry processor
     sk_sp<GrGeometryProcessor> gp(make_gp(this->hasColors(), this->color(), this->viewMatrix()));
 
diff --git a/src/gpu/ops/GrDrawAtlasOp.h b/src/gpu/ops/GrDrawAtlasOp.h
index bec2eb1..7c3bceb 100644
--- a/src/gpu/ops/GrDrawAtlasOp.h
+++ b/src/gpu/ops/GrDrawAtlasOp.h
@@ -40,7 +40,7 @@
     RequiresDstTexture finalize(const GrCaps& caps, const GrAppliedClip* clip) override;
 
 private:
-    void onPrepareDraws(Target*) const override;
+    void onPrepareDraws(Target*) override;
 
     GrColor color() const { return fColor; }
     const SkMatrix& viewMatrix() const { return fViewMatrix; }
diff --git a/src/gpu/ops/GrDrawPathOp.cpp b/src/gpu/ops/GrDrawPathOp.cpp
index fa7fc15..9cf6116 100644
--- a/src/gpu/ops/GrDrawPathOp.cpp
+++ b/src/gpu/ops/GrDrawPathOp.cpp
@@ -39,7 +39,6 @@
                     0xffff>()
     };
     GrPipeline::InitArgs args;
-    args.fProcessors = &this->processors();
     args.fFlags = fPipelineSRGBFlags;
     if (GrAATypeIsHW(fAAType)) {
         args.fFlags |= GrPipeline::kHWAntialias_Flag;
@@ -66,7 +65,7 @@
 //////////////////////////////////////////////////////////////////////////////
 
 void GrDrawPathOp::onExecute(GrOpFlushState* state) {
-    GrPipeline pipeline(this->pipelineInitArgs(*state));
+    GrPipeline pipeline(this->pipelineInitArgs(*state), this->detachProcessors());
     sk_sp<GrPathProcessor> pathProc(GrPathProcessor::Create(this->color(), this->viewMatrix()));
 
     GrStencilSettings stencil;
@@ -178,7 +177,7 @@
     sk_sp<GrPathProcessor> pathProc(
             GrPathProcessor::Create(this->color(), drawMatrix, localMatrix));
 
-    GrPipeline pipeline(this->pipelineInitArgs(*state));
+    GrPipeline pipeline(this->pipelineInitArgs(*state), this->detachProcessors());
     GrStencilSettings stencil;
     init_stencil_pass_settings(*state, this->fillType(), &stencil);
     if (fDraws.count() == 1) {
diff --git a/src/gpu/ops/GrDrawPathOp.h b/src/gpu/ops/GrDrawPathOp.h
index dcd8997..2df5f34 100644
--- a/src/gpu/ops/GrDrawPathOp.h
+++ b/src/gpu/ops/GrDrawPathOp.h
@@ -40,6 +40,7 @@
     GrColor color() const { return fInputColor; }
     GrPathRendering::FillType fillType() const { return fFillType; }
     const GrProcessorSet& processors() const { return fProcessorSet; }
+    GrProcessorSet detachProcessors() { return std::move(fProcessorSet); }
     uint32_t pipelineSRGBFlags() const { return fPipelineSRGBFlags; }
     inline GrPipeline::InitArgs pipelineInitArgs(const GrOpFlushState&);
     const GrProcessorSet::Analysis& doProcessorAnalysis(const GrCaps& caps,
diff --git a/src/gpu/ops/GrDrawVerticesOp.cpp b/src/gpu/ops/GrDrawVerticesOp.cpp
index 771bd4f..f00a8c2 100644
--- a/src/gpu/ops/GrDrawVerticesOp.cpp
+++ b/src/gpu/ops/GrDrawVerticesOp.cpp
@@ -138,7 +138,7 @@
     return GrDefaultGeoProcFactory::Make(color, Coverage::kSolid_Type, localCoordsType, vm);
 }
 
-void GrDrawVerticesOp::onPrepareDraws(Target* target) const {
+void GrDrawVerticesOp::onPrepareDraws(Target* target) {
     bool hasColorAttribute;
     bool hasLocalCoordsAttribute;
     sk_sp<GrGeometryProcessor> gp = this->makeGP(&hasColorAttribute, &hasLocalCoordsAttribute);
diff --git a/src/gpu/ops/GrDrawVerticesOp.h b/src/gpu/ops/GrDrawVerticesOp.h
index 1242ffe..4e12d2d 100644
--- a/src/gpu/ops/GrDrawVerticesOp.h
+++ b/src/gpu/ops/GrDrawVerticesOp.h
@@ -58,7 +58,7 @@
         kSkColor,
     };
 
-    void onPrepareDraws(Target*) const override;
+    void onPrepareDraws(Target*) override;
 
     sk_sp<GrGeometryProcessor> makeGP(bool* hasColorAttribute, bool* hasLocalCoordAttribute) const;
 
diff --git a/src/gpu/ops/GrLatticeOp.cpp b/src/gpu/ops/GrLatticeOp.cpp
index fce1f97..ba4733d 100644
--- a/src/gpu/ops/GrLatticeOp.cpp
+++ b/src/gpu/ops/GrLatticeOp.cpp
@@ -82,7 +82,7 @@
     }
 
 private:
-    void onPrepareDraws(Target* target) const override {
+    void onPrepareDraws(Target* target) override {
         sk_sp<GrGeometryProcessor> gp(create_gp());
         if (!gp) {
             SkDebugf("Couldn't create GrGeometryProcessor\n");
diff --git a/src/gpu/ops/GrMSAAPathRenderer.cpp b/src/gpu/ops/GrMSAAPathRenderer.cpp
index f1503fc..425e675 100644
--- a/src/gpu/ops/GrMSAAPathRenderer.cpp
+++ b/src/gpu/ops/GrMSAAPathRenderer.cpp
@@ -329,7 +329,7 @@
         *outQuadPointCount = quadPointCount;
     }
 
-    void onPrepareDraws(Target* target) const override {
+    void onPrepareDraws(Target* target) override {
         if (fMaxLineVertices == 0) {
             SkASSERT(fMaxQuadVertices == 0);
             return;
diff --git a/src/gpu/ops/GrMeshDrawOp.h b/src/gpu/ops/GrMeshDrawOp.h
index 916806c..dc09e0c 100644
--- a/src/gpu/ops/GrMeshDrawOp.h
+++ b/src/gpu/ops/GrMeshDrawOp.h
@@ -67,7 +67,7 @@
     void onPrepare(GrOpFlushState* state) final;
     void onExecute(GrOpFlushState* state) final;
 
-    virtual void onPrepareDraws(Target*) const = 0;
+    virtual void onPrepareDraws(Target*) = 0;
 
     // A set of contiguous draws that share a draw token and primitive processor. The draws all use
     // the op's pipeline. The meshes for the draw are stored in the fMeshes array and each
diff --git a/src/gpu/ops/GrNonAAFillRectOp.cpp b/src/gpu/ops/GrNonAAFillRectOp.cpp
index 1f61e0c..07994aa 100644
--- a/src/gpu/ops/GrNonAAFillRectOp.cpp
+++ b/src/gpu/ops/GrNonAAFillRectOp.cpp
@@ -164,7 +164,7 @@
     DEFINE_OP_CLASS_ID
 
 private:
-    void onPrepareDraws(Target* target) const override {
+    void onPrepareDraws(Target* target) override {
         sk_sp<GrGeometryProcessor> gp = make_gp();
         if (!gp) {
             SkDebugf("Couldn't create GrGeometryProcessor\n");
@@ -282,7 +282,7 @@
     DEFINE_OP_CLASS_ID
 
 private:
-    void onPrepareDraws(Target* target) const override {
+    void onPrepareDraws(Target* target) override {
         sk_sp<GrGeometryProcessor> gp = make_perspective_gp(
                 fViewMatrix, fHasLocalRect, fHasLocalMatrix ? &fLocalMatrix : nullptr);
         if (!gp) {
diff --git a/src/gpu/ops/GrNonAAStrokeRectOp.cpp b/src/gpu/ops/GrNonAAStrokeRectOp.cpp
index cf533a1..badcf07 100644
--- a/src/gpu/ops/GrNonAAStrokeRectOp.cpp
+++ b/src/gpu/ops/GrNonAAStrokeRectOp.cpp
@@ -131,7 +131,7 @@
     }
 
 private:
-    void onPrepareDraws(Target* target) const override {
+    void onPrepareDraws(Target* target) override {
         sk_sp<GrGeometryProcessor> gp;
         {
             using namespace GrDefaultGeoProcFactory;
diff --git a/src/gpu/ops/GrOvalOpFactory.cpp b/src/gpu/ops/GrOvalOpFactory.cpp
index 770a54f..b175786 100644
--- a/src/gpu/ops/GrOvalOpFactory.cpp
+++ b/src/gpu/ops/GrOvalOpFactory.cpp
@@ -809,7 +809,7 @@
     FixedFunctionFlags fixedFunctionFlags() const override { return fHelper.fixedFunctionFlags(); }
 
 private:
-    void onPrepareDraws(Target* target) const override {
+    void onPrepareDraws(Target* target) override {
         SkMatrix localMatrix;
         if (!fViewMatrixIfUsingLocalCoords.invert(&localMatrix)) {
             return;
@@ -1272,7 +1272,7 @@
     FixedFunctionFlags fixedFunctionFlags() const override { return fHelper.fixedFunctionFlags(); }
 
 private:
-    void onPrepareDraws(Target* target) const override {
+    void onPrepareDraws(Target* target) override {
         SkMatrix localMatrix;
         if (!fViewMatrixIfUsingLocalCoords.invert(&localMatrix)) {
             return;
@@ -1498,7 +1498,7 @@
     FixedFunctionFlags fixedFunctionFlags() const override { return fHelper.fixedFunctionFlags(); }
 
 private:
-    void onPrepareDraws(Target* target) const override {
+    void onPrepareDraws(Target* target) override {
         // Setup geometry processor
         sk_sp<GrGeometryProcessor> gp(
                 new DIEllipseGeometryProcessor(this->viewMatrix(), this->style()));
@@ -1886,7 +1886,7 @@
         (*verts)++;
     }
 
-    void onPrepareDraws(Target* target) const override {
+    void onPrepareDraws(Target* target) override {
         // Invert the view matrix as a local matrix (if any other processors require coords).
         SkMatrix localMatrix;
         if (!fViewMatrixIfUsingLocalCoords.invert(&localMatrix)) {
@@ -2165,7 +2165,7 @@
     FixedFunctionFlags fixedFunctionFlags() const override { return fHelper.fixedFunctionFlags(); }
 
 private:
-    void onPrepareDraws(Target* target) const override {
+    void onPrepareDraws(Target* target) override {
         SkMatrix localMatrix;
         if (!fViewMatrixIfUsingLocalCoords.invert(&localMatrix)) {
             return;
diff --git a/src/gpu/ops/GrRegionOp.cpp b/src/gpu/ops/GrRegionOp.cpp
index 7e2879c..f9cc61f 100644
--- a/src/gpu/ops/GrRegionOp.cpp
+++ b/src/gpu/ops/GrRegionOp.cpp
@@ -100,7 +100,7 @@
     }
 
 private:
-    void onPrepareDraws(Target* target) const override {
+    void onPrepareDraws(Target* target) override {
         sk_sp<GrGeometryProcessor> gp = make_gp(fViewMatrix);
         if (!gp) {
             SkDebugf("Couldn't create GrGeometryProcessor\n");
diff --git a/src/gpu/ops/GrShadowRRectOp.cpp b/src/gpu/ops/GrShadowRRectOp.cpp
index 07281f2..0032329 100644
--- a/src/gpu/ops/GrShadowRRectOp.cpp
+++ b/src/gpu/ops/GrShadowRRectOp.cpp
@@ -558,7 +558,7 @@
 
     }
 
-    void onPrepareDraws(Target* target) const override {
+    void onPrepareDraws(Target* target) override {
         // Setup geometry processor
         sk_sp<GrGeometryProcessor> gp = GrRRectShadowGeoProc::Make();
 
@@ -614,7 +614,7 @@
 
         static const uint32_t kPipelineFlags = 0;
         const GrPipeline* pipeline =
-                target->makePipeline(kPipelineFlags, &GrProcessorSet::EmptySet());
+                target->makePipeline(kPipelineFlags, GrProcessorSet::MakeEmptySet());
 
         GrMesh mesh(GrPrimitiveType::kTriangles);
         mesh.setIndexed(indexBuffer, fIndexCount, firstIndex, 0, fVertCount - 1);
diff --git a/src/gpu/ops/GrSimpleMeshDrawOpHelper.cpp b/src/gpu/ops/GrSimpleMeshDrawOpHelper.cpp
index ee59a8e..f6a005b 100644
--- a/src/gpu/ops/GrSimpleMeshDrawOpHelper.cpp
+++ b/src/gpu/ops/GrSimpleMeshDrawOpHelper.cpp
@@ -101,7 +101,8 @@
 }
 
 SkString GrSimpleMeshDrawOpHelper::dumpInfo() const {
-    SkString result = this->processors().dumpProcessors();
+    const GrProcessorSet& processors = fProcessors ? *fProcessors : GrProcessorSet::EmptySet();
+    SkString result = processors.dumpProcessors();
     result.append("AA Type: ");
     switch (this->aaType()) {
         case GrAAType::kNone:
@@ -125,7 +126,6 @@
         GrMeshDrawOp::Target* target) const {
     GrPipeline::InitArgs args;
     args.fFlags = this->pipelineFlags();
-    args.fProcessors = &this->processors();
     args.fProxy = target->proxy();
     args.fAppliedClip = target->clip();
     args.fDstProxy = target->dstProxy();
@@ -134,6 +134,15 @@
     return args;
 }
 
+GrPipeline* GrSimpleMeshDrawOpHelper::internalMakePipeline(GrMeshDrawOp::Target* target,
+                                                           const GrPipeline::InitArgs& args) {
+    if (fProcessors) {
+        return target->allocPipeline(args, std::move(*fProcessors));
+    } else {
+        return target->allocPipeline(args, GrProcessorSet::MakeEmptySet());
+    }
+}
+
 GrSimpleMeshDrawOpHelperWithStencil::GrSimpleMeshDrawOpHelperWithStencil(
         const MakeArgs& args, GrAAType aaType, const GrUserStencilSettings* stencilSettings,
         Flags flags)
@@ -156,10 +165,10 @@
 }
 
 const GrPipeline* GrSimpleMeshDrawOpHelperWithStencil::makePipeline(
-        GrMeshDrawOp::Target* target) const {
+        GrMeshDrawOp::Target* target) {
     auto args = INHERITED::pipelineInitArgs(target);
     args.fUserStencil = fStencilSettings;
-    return target->allocPipeline(args);
+    return this->internalMakePipeline(target, args);
 }
 
 SkString GrSimpleMeshDrawOpHelperWithStencil::dumpInfo() const {
diff --git a/src/gpu/ops/GrSimpleMeshDrawOpHelper.h b/src/gpu/ops/GrSimpleMeshDrawOpHelper.h
index 2efd57c..7dfd130 100644
--- a/src/gpu/ops/GrSimpleMeshDrawOpHelper.h
+++ b/src/gpu/ops/GrSimpleMeshDrawOpHelper.h
@@ -82,8 +82,8 @@
 
     bool compatibleWithAlphaAsCoverage() const { return fCompatibleWithAlphaAsCoveage; }
 
-    GrPipeline* makePipeline(GrMeshDrawOp::Target* target) const {
-        return target->allocPipeline(this->pipelineInitArgs(target));
+    GrPipeline* makePipeline(GrMeshDrawOp::Target* target) {
+        return this->internalMakePipeline(target, this->pipelineInitArgs(target));
     }
 
     struct MakeArgs {
@@ -101,12 +101,11 @@
 protected:
     GrAAType aaType() const { return static_cast<GrAAType>(fAAType); }
     uint32_t pipelineFlags() const { return fPipelineFlags; }
-    const GrProcessorSet& processors() const {
-        return fProcessors ? *fProcessors : GrProcessorSet::EmptySet();
-    }
 
     GrPipeline::InitArgs pipelineInitArgs(GrMeshDrawOp::Target* target) const;
 
+    GrPipeline* internalMakePipeline(GrMeshDrawOp::Target*, const GrPipeline::InitArgs&);
+
 private:
     GrProcessorSet* fProcessors;
     unsigned fPipelineFlags : 8;
@@ -146,7 +145,7 @@
     bool isCompatible(const GrSimpleMeshDrawOpHelperWithStencil& that, const GrCaps&,
                       const SkRect& thisBounds, const SkRect& thatBounds) const;
 
-    const GrPipeline* makePipeline(GrMeshDrawOp::Target*) const;
+    const GrPipeline* makePipeline(GrMeshDrawOp::Target*);
 
     SkString dumpInfo() const;
 
diff --git a/src/gpu/ops/GrSmallPathRenderer.cpp b/src/gpu/ops/GrSmallPathRenderer.cpp
index ddb2848..d39e458 100644
--- a/src/gpu/ops/GrSmallPathRenderer.cpp
+++ b/src/gpu/ops/GrSmallPathRenderer.cpp
@@ -217,7 +217,7 @@
         int fInstancesToFlush;
     };
 
-    void onPrepareDraws(Target* target) const override {
+    void onPrepareDraws(Target* target) override {
         int instanceCount = fShapes.count();
         const SkMatrix& ctm = this->viewMatrix();
 
diff --git a/src/gpu/ops/GrTessellatingPathRenderer.cpp b/src/gpu/ops/GrTessellatingPathRenderer.cpp
index d65e57e..641a037 100644
--- a/src/gpu/ops/GrTessellatingPathRenderer.cpp
+++ b/src/gpu/ops/GrTessellatingPathRenderer.cpp
@@ -225,7 +225,7 @@
         return path;
     }
 
-    void draw(Target* target, const GrGeometryProcessor* gp) const {
+    void draw(Target* target, const GrGeometryProcessor* gp) {
         SkASSERT(!fAntiAlias);
         GrResourceProvider* rp = target->resourceProvider();
         bool inverseFill = fShape.inverseFilled();
@@ -276,7 +276,7 @@
         rp->assignUniqueKeyToResource(key, allocator.vertexBuffer());
     }
 
-    void drawAA(Target* target, const GrGeometryProcessor* gp) const {
+    void drawAA(Target* target, const GrGeometryProcessor* gp) {
         SkASSERT(fAntiAlias);
         SkPath path = getPath();
         if (path.isEmpty()) {
@@ -293,10 +293,10 @@
         if (count == 0) {
             return;
         }
-        drawVertices(target, gp, allocator.vertexBuffer(), allocator.firstVertex(), count);
+        this->drawVertices(target, gp, allocator.vertexBuffer(), allocator.firstVertex(), count);
     }
 
-    void onPrepareDraws(Target* target) const override {
+    void onPrepareDraws(Target* target) override {
         sk_sp<GrGeometryProcessor> gp;
         {
             using namespace GrDefaultGeoProcFactory;
@@ -335,7 +335,7 @@
     }
 
     void drawVertices(Target* target, const GrGeometryProcessor* gp, const GrBuffer* vb,
-                      int firstVertex, int count) const {
+                      int firstVertex, int count) {
         GrMesh mesh(TESSELLATOR_WIREFRAME ? GrPrimitiveType::kLines : GrPrimitiveType::kTriangles);
         mesh.setNonIndexedNonInstanced(count);
         mesh.setVertexData(vb, firstVertex);