diff options
author | Brian Salomon <bsalomon@google.com> | 2017-08-09 16:02:19 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-08-09 20:42:45 +0000 |
commit | 91326c34ee1f1531d62caa153746821b58e6e55d (patch) | |
tree | 0d5ca763efa6807b1f352d9ae9bc0537f9ed12f1 | |
parent | 6a14edc8d8762a54a174c2df1bee5715fc0a0526 (diff) |
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>
39 files changed, 116 insertions, 87 deletions
diff --git a/gm/beziereffects.cpp b/gm/beziereffects.cpp index 77f86c5ea4..b4225db0b4 100644 --- a/gm/beziereffects.cpp +++ b/gm/beziereffects.cpp @@ -43,8 +43,8 @@ protected: this->setBounds(rect, HasAABloat::kYes, IsZeroArea::kNo); } - const GrPipeline* makePipeline(Target* target) const { - return target->makePipeline(0, &fProcessorSet); + const GrPipeline* makePipeline(Target* target) { + return target->makePipeline(0, std::move(fProcessorSet)); } const GrGeometryProcessor* gp() const { return fGeometryProcessor.get(); } @@ -78,7 +78,7 @@ private: BezierCubicTestOp(sk_sp<GrGeometryProcessor> gp, const SkRect& rect, GrColor color) : INHERITED(std::move(gp), rect, color, ClassID()) {} - void onPrepareDraws(Target* target) const override { + void onPrepareDraws(Target* target) override { QuadHelper helper; size_t vertexStride = this->gp()->getVertexStride(); SkASSERT(vertexStride == sizeof(SkPoint)); @@ -253,7 +253,7 @@ private: float fKLM[4]; // The last value is ignored. The effect expects a vec4f. }; - void onPrepareDraws(Target* target) const override { + void onPrepareDraws(Target* target) override { QuadHelper helper; size_t vertexStride = this->gp()->getVertexStride(); SkASSERT(vertexStride == sizeof(Vertex)); @@ -467,7 +467,7 @@ private: float fKLM[4]; // The last value is ignored. The effect expects a vec4f. }; - void onPrepareDraws(Target* target) const override { + void onPrepareDraws(Target* target) override { QuadHelper helper; size_t vertexStride = this->gp()->getVertexStride(); SkASSERT(vertexStride == sizeof(Vertex)); diff --git a/gm/convexpolyeffect.cpp b/gm/convexpolyeffect.cpp index 0d05d10487..9c437e2ffa 100644 --- a/gm/convexpolyeffect.cpp +++ b/gm/convexpolyeffect.cpp @@ -65,7 +65,7 @@ private: this->setBounds(sorted_rect(fRect), HasAABloat::kNo, IsZeroArea::kNo); } - void onPrepareDraws(Target* target) const override { + void onPrepareDraws(Target* target) override { using namespace GrDefaultGeoProcFactory; Color color(fColor); @@ -82,7 +82,7 @@ private: fRect.toQuad(verts); - helper.recordDraw(target, gp.get(), target->makePipeline(0, &fProcessors)); + helper.recordDraw(target, gp.get(), target->makePipeline(0, std::move(fProcessors))); } bool onCombineIfPossible(GrOp* op, const GrCaps& caps) override { return false; } diff --git a/src/gpu/GrOpFlushState.h b/src/gpu/GrOpFlushState.h index 4d1685638f..2c860f9b81 100644 --- a/src/gpu/GrOpFlushState.h +++ b/src/gpu/GrOpFlushState.h @@ -113,7 +113,7 @@ public: } template <typename... Args> - GrPipeline* allocPipeline(Args... args) { + GrPipeline* allocPipeline(Args&&... args) { return fPipelines.make<GrPipeline>(std::forward<Args>(args)...); } @@ -244,7 +244,7 @@ public: } template <typename... Args> - GrPipeline* allocPipeline(Args... args) { + GrPipeline* allocPipeline(Args&&... args) { return this->state()->allocPipeline(std::forward<Args>(args)...); } @@ -252,16 +252,15 @@ public: * 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 8e91d8133b..f6848962b8 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 @@ GrPipeline::GrPipeline(const InitArgs& args) { 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 @@ GrPipeline::GrPipeline(const InitArgs& args) { } // 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 075f09cf63..c4c7599527 100644 --- a/src/gpu/GrPipeline.h +++ b/src/gpu/GrPipeline.h @@ -76,7 +76,6 @@ public: 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 @@ public: **/ 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 21e5fc3391..20d6745cad 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 @@ GrProcessorSet::GrProcessorSet(sk_sp<GrFragmentProcessor> colorFP) 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 e3fe4c64b2..d3aaf6dd61 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 @@ public: /** 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 @@ private: 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 78d8347709..c067e3a34e 100644 --- a/src/gpu/ccpr/GrCoverageCountingPathRenderer.cpp +++ b/src/gpu/ccpr/GrCoverageCountingPathRenderer.cpp @@ -295,11 +295,10 @@ void DrawPathsOp::onExecute(GrOpFlushState* flushState) { 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 229a144f07..f13a1dc47b 100644 --- a/src/gpu/instanced/InstancedOp.cpp +++ b/src/gpu/instanced/InstancedOp.cpp @@ -229,7 +229,6 @@ void InstancedOp::onExecute(GrOpFlushState* state) { 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 @@ void InstancedOp::onExecute(GrOpFlushState* state) { } 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 22b2b5980f..af32a14bd5 100644 --- a/src/gpu/ops/GrAAConvexPathRenderer.cpp +++ b/src/gpu/ops/GrAAConvexPathRenderer.cpp @@ -762,7 +762,7 @@ public: } 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 @@ private: } } - 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 9d328c92f2..d0976a0b21 100644 --- a/src/gpu/ops/GrAAFillRectOp.cpp +++ b/src/gpu/ops/GrAAFillRectOp.cpp @@ -228,7 +228,7 @@ public: } 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 5d12fdfdbf..c5479b7849 100644 --- a/src/gpu/ops/GrAAHairLinePathRenderer.cpp +++ b/src/gpu/ops/GrAAHairLinePathRenderer.cpp @@ -801,7 +801,7 @@ public: } private: - void onPrepareDraws(Target*) const override; + void onPrepareDraws(Target*) override; typedef SkTArray<SkPoint, true> PtArray; typedef SkTArray<int, true> IntArray; @@ -865,7 +865,7 @@ private: } // 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 356c7ac4aa..c1fd4f7e65 100644 --- a/src/gpu/ops/GrAALinearizingConvexPathRenderer.cpp +++ b/src/gpu/ops/GrAALinearizingConvexPathRenderer.cpp @@ -221,7 +221,7 @@ private: 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 e3e2b23b37..07d8f30e62 100644 --- a/src/gpu/ops/GrAAStrokeRectOp.cpp +++ b/src/gpu/ops/GrAAStrokeRectOp.cpp @@ -197,7 +197,7 @@ public: } 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 @@ private: } // 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 8c49e6dd19..e8d3caf7d6 100644 --- a/src/gpu/ops/GrAtlasTextOp.cpp +++ b/src/gpu/ops/GrAtlasTextOp.cpp @@ -75,7 +75,7 @@ GrDrawOp::RequiresDstTexture GrAtlasTextOp::finalize(const GrCaps& caps, 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 @@ void GrAtlasTextOp::onPrepareDraws(Target* target) const { 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 3456fe0dcc..5c37d45ea2 100644 --- a/src/gpu/ops/GrAtlasTextOp.h +++ b/src/gpu/ops/GrAtlasTextOp.h @@ -119,7 +119,7 @@ private: 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 7a23b5ac32..6ca55b0058 100644 --- a/src/gpu/ops/GrDashOp.cpp +++ b/src/gpu/ops/GrDashOp.cpp @@ -356,7 +356,7 @@ private: 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 @@ private: 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 891c5a5a1e..fb720850c0 100644 --- a/src/gpu/ops/GrDefaultPathRenderer.cpp +++ b/src/gpu/ops/GrDefaultPathRenderer.cpp @@ -380,7 +380,7 @@ public: } 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 f5d636cf9d..6659c6a633 100644 --- a/src/gpu/ops/GrDrawAtlasOp.cpp +++ b/src/gpu/ops/GrDrawAtlasOp.cpp @@ -117,7 +117,7 @@ SkString GrDrawAtlasOp::dumpInfo() const { 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 bec2eb1541..7c3bceb1e0 100644 --- a/src/gpu/ops/GrDrawAtlasOp.h +++ b/src/gpu/ops/GrDrawAtlasOp.h @@ -40,7 +40,7 @@ public: 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 fa7fc157d0..9cf6116b99 100644 --- a/src/gpu/ops/GrDrawPathOp.cpp +++ b/src/gpu/ops/GrDrawPathOp.cpp @@ -39,7 +39,6 @@ GrPipeline::InitArgs GrDrawPathOpBase::pipelineInitArgs(const GrOpFlushState& st 0xffff>() }; GrPipeline::InitArgs args; - args.fProcessors = &this->processors(); args.fFlags = fPipelineSRGBFlags; if (GrAATypeIsHW(fAAType)) { args.fFlags |= GrPipeline::kHWAntialias_Flag; @@ -66,7 +65,7 @@ void init_stencil_pass_settings(const GrOpFlushState& flushState, ////////////////////////////////////////////////////////////////////////////// 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 @@ void GrDrawPathRangeOp::onExecute(GrOpFlushState* state) { 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 dcd8997f97..2df5f3482e 100644 --- a/src/gpu/ops/GrDrawPathOp.h +++ b/src/gpu/ops/GrDrawPathOp.h @@ -40,6 +40,7 @@ protected: 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 771bd4ffb0..f00a8c2a79 100644 --- a/src/gpu/ops/GrDrawVerticesOp.cpp +++ b/src/gpu/ops/GrDrawVerticesOp.cpp @@ -138,7 +138,7 @@ sk_sp<GrGeometryProcessor> GrDrawVerticesOp::makeGP(bool* hasColorAttribute, 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 1242ffe4d0..4e12d2d50d 100644 --- a/src/gpu/ops/GrDrawVerticesOp.h +++ b/src/gpu/ops/GrDrawVerticesOp.h @@ -58,7 +58,7 @@ private: 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 fce1f972dd..ba4733d04e 100644 --- a/src/gpu/ops/GrLatticeOp.cpp +++ b/src/gpu/ops/GrLatticeOp.cpp @@ -82,7 +82,7 @@ public: } 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 f1503fcd9f..425e675e89 100644 --- a/src/gpu/ops/GrMSAAPathRenderer.cpp +++ b/src/gpu/ops/GrMSAAPathRenderer.cpp @@ -329,7 +329,7 @@ private: *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 916806ce74..dc09e0c765 100644 --- a/src/gpu/ops/GrMeshDrawOp.h +++ b/src/gpu/ops/GrMeshDrawOp.h @@ -67,7 +67,7 @@ private: 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 1f61e0c68c..07994aa510 100644 --- a/src/gpu/ops/GrNonAAFillRectOp.cpp +++ b/src/gpu/ops/GrNonAAFillRectOp.cpp @@ -164,7 +164,7 @@ public: 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 @@ public: 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 cf533a19c1..badcf070f4 100644 --- a/src/gpu/ops/GrNonAAStrokeRectOp.cpp +++ b/src/gpu/ops/GrNonAAStrokeRectOp.cpp @@ -131,7 +131,7 @@ public: } 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 770a54f512..b175786177 100644 --- a/src/gpu/ops/GrOvalOpFactory.cpp +++ b/src/gpu/ops/GrOvalOpFactory.cpp @@ -809,7 +809,7 @@ public: 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 @@ public: 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 @@ public: 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 @@ private: (*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 @@ public: 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 7e2879c01d..f9cc61fc9b 100644 --- a/src/gpu/ops/GrRegionOp.cpp +++ b/src/gpu/ops/GrRegionOp.cpp @@ -100,7 +100,7 @@ public: } 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 07281f2389..0032329df0 100644 --- a/src/gpu/ops/GrShadowRRectOp.cpp +++ b/src/gpu/ops/GrShadowRRectOp.cpp @@ -558,7 +558,7 @@ private: } - void onPrepareDraws(Target* target) const override { + void onPrepareDraws(Target* target) override { // Setup geometry processor sk_sp<GrGeometryProcessor> gp = GrRRectShadowGeoProc::Make(); @@ -614,7 +614,7 @@ private: 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 ee59a8e26b..f6a005bece 100644 --- a/src/gpu/ops/GrSimpleMeshDrawOpHelper.cpp +++ b/src/gpu/ops/GrSimpleMeshDrawOpHelper.cpp @@ -101,7 +101,8 @@ GrDrawOp::RequiresDstTexture GrSimpleMeshDrawOpHelper::xpRequiresDstTexture( } 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 @@ GrPipeline::InitArgs GrSimpleMeshDrawOpHelper::pipelineInitArgs( 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 @@ GrPipeline::InitArgs GrSimpleMeshDrawOpHelper::pipelineInitArgs( 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 @@ bool GrSimpleMeshDrawOpHelperWithStencil::isCompatible( } 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 2efd57c76e..7dfd130c86 100644 --- a/src/gpu/ops/GrSimpleMeshDrawOpHelper.h +++ b/src/gpu/ops/GrSimpleMeshDrawOpHelper.h @@ -82,8 +82,8 @@ public: 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 @@ public: 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 @@ public: 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 ddb28488a4..d39e458cf3 100644 --- a/src/gpu/ops/GrSmallPathRenderer.cpp +++ b/src/gpu/ops/GrSmallPathRenderer.cpp @@ -217,7 +217,7 @@ private: 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 d65e57e374..641a037bbe 100644 --- a/src/gpu/ops/GrTessellatingPathRenderer.cpp +++ b/src/gpu/ops/GrTessellatingPathRenderer.cpp @@ -225,7 +225,7 @@ private: 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 @@ private: 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 @@ private: 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 @@ private: } 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); diff --git a/tests/OnFlushCallbackTest.cpp b/tests/OnFlushCallbackTest.cpp index e5dc4cc32f..388f770150 100644 --- a/tests/OnFlushCallbackTest.cpp +++ b/tests/OnFlushCallbackTest.cpp @@ -78,7 +78,7 @@ protected: private: bool onCombineIfPossible(GrOp*, const GrCaps&) override { return false; } - void onPrepareDraws(Target* target) const override { + void onPrepareDraws(Target* target) override { using namespace GrDefaultGeoProcFactory; // The vertex attrib order is always pos, color, local coords. diff --git a/tests/PrimitiveProcessorTest.cpp b/tests/PrimitiveProcessorTest.cpp index d2e851d9d1..83aa3516eb 100644 --- a/tests/PrimitiveProcessorTest.cpp +++ b/tests/PrimitiveProcessorTest.cpp @@ -49,7 +49,7 @@ private: bool onCombineIfPossible(GrOp*, const GrCaps&) override { return false; } - void onPrepareDraws(Target* target) const override { + void onPrepareDraws(Target* target) override { class GP : public GrGeometryProcessor { public: GP(int numAttribs) { @@ -94,7 +94,8 @@ private: size_t vertexStride = gp->getVertexStride(); SkPoint* vertices = reinterpret_cast<SkPoint*>(helper.init(target, vertexStride, 1)); vertices->setRectFan(0.f, 0.f, 1.f, 1.f, vertexStride); - helper.recordDraw(target, gp.get(), target->makePipeline(0, &GrProcessorSet::EmptySet())); + helper.recordDraw(target, gp.get(), + target->makePipeline(0, GrProcessorSet::MakeEmptySet())); } int fNumAttribs; diff --git a/tests/ProcessorTest.cpp b/tests/ProcessorTest.cpp index 8354225ce7..4cc7780d06 100644 --- a/tests/ProcessorTest.cpp +++ b/tests/ProcessorTest.cpp @@ -46,7 +46,7 @@ private: this->setBounds(SkRect::MakeWH(100, 100), HasAABloat::kNo, IsZeroArea::kNo); } - void onPrepareDraws(Target* target) const override { return; } + void onPrepareDraws(Target* target) override { return; } bool onCombineIfPossible(GrOp* op, const GrCaps& caps) override { return false; } |