Pull creation of GrPipeline explicitly into the Ops' onExecute methods
This is a first step towards pulling the creation of the GrProgramInfos explicitly into the Ops' onExecute methods. We need this behavior so programInfo creation can be moved forward to onPrePrepare.
For now, pipeline creation is a static member on GrSimpleMeshDrawOpHelper so GrPipeline creation can be bottle-neckedOps for Ops that don't use the helper. In some future world CreatePipeline could become non-static to reduce some of the duplicate code.
Bug: skia:9455
Change-Id: I2d35dd223db824e84616f5df0f1dca34c1b6e412
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/258003
Reviewed-by: Michael Ludwig <michaelludwig@google.com>
Commit-Queue: Robert Phillips <robertphillips@google.com>
diff --git a/src/gpu/ops/GrAAConvexPathRenderer.cpp b/src/gpu/ops/GrAAConvexPathRenderer.cpp
index 9efdd3a..8e66ae8 100644
--- a/src/gpu/ops/GrAAConvexPathRenderer.cpp
+++ b/src/gpu/ops/GrAAConvexPathRenderer.cpp
@@ -821,7 +821,12 @@
}
void onExecute(GrOpFlushState* flushState, const SkRect& chainBounds) override {
- fHelper.executeDrawsAndUploads(this, flushState, chainBounds);
+ auto pipeline = GrSimpleMeshDrawOpHelper::CreatePipeline(flushState,
+ fHelper.detachProcessorSet(),
+ fHelper.pipelineFlags(),
+ fHelper.stencilSettings());
+
+ flushState->executeDrawsAndUploadsForMeshDrawOp(this, chainBounds, pipeline);
}
CombineResult onCombineIfPossible(GrOp* t, const GrCaps& caps) override {
diff --git a/src/gpu/ops/GrAAHairLinePathRenderer.cpp b/src/gpu/ops/GrAAHairLinePathRenderer.cpp
index b41a968..7a6ce00 100644
--- a/src/gpu/ops/GrAAHairLinePathRenderer.cpp
+++ b/src/gpu/ops/GrAAHairLinePathRenderer.cpp
@@ -1105,7 +1105,12 @@
}
void AAHairlineOp::onExecute(GrOpFlushState* flushState, const SkRect& chainBounds) {
- fHelper.executeDrawsAndUploads(this, flushState, chainBounds);
+ auto pipeline = GrSimpleMeshDrawOpHelper::CreatePipeline(flushState,
+ fHelper.detachProcessorSet(),
+ fHelper.pipelineFlags(),
+ fHelper.stencilSettings());
+
+ flushState->executeDrawsAndUploadsForMeshDrawOp(this, chainBounds, pipeline);
}
bool GrAAHairLinePathRenderer::onDrawPath(const DrawPathArgs& args) {
diff --git a/src/gpu/ops/GrAALinearizingConvexPathRenderer.cpp b/src/gpu/ops/GrAALinearizingConvexPathRenderer.cpp
index 0f3508b..aa8d437 100644
--- a/src/gpu/ops/GrAALinearizingConvexPathRenderer.cpp
+++ b/src/gpu/ops/GrAALinearizingConvexPathRenderer.cpp
@@ -304,7 +304,12 @@
}
void onExecute(GrOpFlushState* flushState, const SkRect& chainBounds) override {
- fHelper.executeDrawsAndUploads(this, flushState, chainBounds);
+ auto pipeline = GrSimpleMeshDrawOpHelper::CreatePipeline(flushState,
+ fHelper.detachProcessorSet(),
+ fHelper.pipelineFlags(),
+ fHelper.stencilSettings());
+
+ flushState->executeDrawsAndUploadsForMeshDrawOp(this, chainBounds, pipeline);
}
CombineResult onCombineIfPossible(GrOp* t, const GrCaps& caps) override {
diff --git a/src/gpu/ops/GrAtlasTextOp.cpp b/src/gpu/ops/GrAtlasTextOp.cpp
index d425b71..a493fb6 100644
--- a/src/gpu/ops/GrAtlasTextOp.cpp
+++ b/src/gpu/ops/GrAtlasTextOp.cpp
@@ -19,6 +19,7 @@
#include "src/gpu/GrResourceProvider.h"
#include "src/gpu/effects/GrBitmapTextGeoProc.h"
#include "src/gpu/effects/GrDistanceFieldGeoProc.h"
+#include "src/gpu/ops/GrSimpleMeshDrawOpHelper.h"
#include "src/gpu/text/GrAtlasManager.h"
#include "src/gpu/text/GrStrikeCache.h"
@@ -393,8 +394,11 @@
}
void GrAtlasTextOp::onExecute(GrOpFlushState* flushState, const SkRect& chainBounds) {
- flushState->executeDrawsAndUploadsForMeshDrawOp(
- this, chainBounds, std::move(fProcessors), GrPipeline::InputFlags::kNone);
+ auto pipeline = GrSimpleMeshDrawOpHelper::CreatePipeline(flushState,
+ std::move(fProcessors),
+ GrPipeline::InputFlags::kNone);
+
+ flushState->executeDrawsAndUploadsForMeshDrawOp(this, chainBounds, pipeline);
}
void GrAtlasTextOp::flush(GrMeshDrawOp::Target* target, FlushInfo* flushInfo) const {
diff --git a/src/gpu/ops/GrDashOp.cpp b/src/gpu/ops/GrDashOp.cpp
index ecd5b16..6643f1e 100644
--- a/src/gpu/ops/GrDashOp.cpp
+++ b/src/gpu/ops/GrDashOp.cpp
@@ -30,6 +30,7 @@
#include "src/gpu/glsl/GrGLSLVertexGeoBuilder.h"
#include "src/gpu/ops/GrDashOp.h"
#include "src/gpu/ops/GrMeshDrawOp.h"
+#include "src/gpu/ops/GrSimpleMeshDrawOpHelper.h"
using AAMode = GrDashOp::AAMode;
@@ -632,8 +633,13 @@
if (AAMode::kCoverageWithMSAA == fAAMode) {
pipelineFlags |= GrPipeline::InputFlags::kHWAntialias;
}
- flushState->executeDrawsAndUploadsForMeshDrawOp(
- this, chainBounds, std::move(fProcessorSet), pipelineFlags, fStencilSettings);
+
+ auto pipeline = GrSimpleMeshDrawOpHelper::CreatePipeline(flushState,
+ std::move(fProcessorSet),
+ pipelineFlags,
+ fStencilSettings);
+
+ flushState->executeDrawsAndUploadsForMeshDrawOp(this, chainBounds, pipeline);
}
CombineResult onCombineIfPossible(GrOp* t, const GrCaps& caps) override {
diff --git a/src/gpu/ops/GrDefaultPathRenderer.cpp b/src/gpu/ops/GrDefaultPathRenderer.cpp
index 6b8e502..e860335 100644
--- a/src/gpu/ops/GrDefaultPathRenderer.cpp
+++ b/src/gpu/ops/GrDefaultPathRenderer.cpp
@@ -442,7 +442,12 @@
}
void onExecute(GrOpFlushState* flushState, const SkRect& chainBounds) override {
- fHelper.executeDrawsAndUploads(this, flushState, chainBounds);
+ auto pipeline = GrSimpleMeshDrawOpHelper::CreatePipeline(flushState,
+ fHelper.detachProcessorSet(),
+ fHelper.pipelineFlags(),
+ fHelper.stencilSettings());
+
+ flushState->executeDrawsAndUploadsForMeshDrawOp(this, chainBounds, pipeline);
}
CombineResult onCombineIfPossible(GrOp* t, const GrCaps& caps) override {
diff --git a/src/gpu/ops/GrDrawAtlasOp.cpp b/src/gpu/ops/GrDrawAtlasOp.cpp
index c8818ec..8ffe0d7 100644
--- a/src/gpu/ops/GrDrawAtlasOp.cpp
+++ b/src/gpu/ops/GrDrawAtlasOp.cpp
@@ -214,7 +214,11 @@
}
void DrawAtlasOp::onExecute(GrOpFlushState* flushState, const SkRect& chainBounds) {
- fHelper.executeDrawsAndUploads(this, flushState, chainBounds);
+ auto pipeline = GrSimpleMeshDrawOpHelper::CreatePipeline(flushState,
+ fHelper.detachProcessorSet(),
+ fHelper.pipelineFlags());
+
+ flushState->executeDrawsAndUploadsForMeshDrawOp(this, chainBounds, pipeline);
}
GrOp::CombineResult DrawAtlasOp::onCombineIfPossible(GrOp* t, const GrCaps& caps) {
diff --git a/src/gpu/ops/GrDrawPathOp.cpp b/src/gpu/ops/GrDrawPathOp.cpp
index f2fdbb2..489b7f7 100644
--- a/src/gpu/ops/GrDrawPathOp.cpp
+++ b/src/gpu/ops/GrDrawPathOp.cpp
@@ -14,6 +14,7 @@
#include "src/gpu/GrRenderTargetContext.h"
#include "src/gpu/GrRenderTargetPriv.h"
#include "src/gpu/ops/GrDrawPathOp.h"
+#include "src/gpu/ops/GrSimpleMeshDrawOpHelper.h"
static constexpr GrUserStencilSettings kCoverPass{
GrUserStencilSettings::StaticInit<
@@ -43,18 +44,6 @@
}
#endif
-GrPipeline::InitArgs GrDrawPathOpBase::pipelineInitArgs(const GrOpFlushState& state) {
- GrPipeline::InitArgs args;
- if (fDoAA) {
- args.fInputFlags |= GrPipeline::InputFlags::kHWAntialias;
- }
- args.fUserStencil = &kCoverPass;
- args.fCaps = &state.caps();
- args.fDstProxyView = state.drawOpArgs().dstProxyView();
- args.fOutputSwizzle = state.drawOpArgs().outputSwizzle();
- return args;
-}
-
const GrProcessorSet::Analysis& GrDrawPathOpBase::doProcessorAnalysis(
const GrCaps& caps, const GrAppliedClip* clip, bool hasMixedSampledCoverage,
GrClampType clampType) {
@@ -87,34 +76,42 @@
return pool->allocate<GrDrawPathOp>(viewMatrix, std::move(paint), aa, std::move(path));
}
-void GrDrawPathOp::onExecute(GrOpFlushState* state, const SkRect& chainBounds) {
- GrAppliedClip appliedClip = state->detachAppliedClip();
-
+void GrDrawPathOp::onExecute(GrOpFlushState* flushState, const SkRect& chainBounds) {
GrPipeline::FixedDynamicState* fixedDynamicState = nullptr, storage;
- if (appliedClip.scissorState().enabled()) {
- storage.fScissorRect = appliedClip.scissorState().rect();
+ const GrAppliedClip* appliedClip = flushState->appliedClip();
+ if (appliedClip && appliedClip->scissorState().enabled()) {
+ storage.fScissorRect = appliedClip->scissorState().rect();
fixedDynamicState = &storage;
}
- GrPipeline pipeline(this->pipelineInitArgs(*state), this->detachProcessors(),
- std::move(appliedClip));
+ GrPipeline::InputFlags pipelineFlags = GrPipeline::InputFlags::kNone;
+ if (this->doAA()) {
+ pipelineFlags |= GrPipeline::InputFlags::kHWAntialias;
+ }
+
+ auto pipeline = GrSimpleMeshDrawOpHelper::CreatePipeline(flushState,
+ this->detachProcessorSet(),
+ pipelineFlags,
+ &kCoverPass);
+
sk_sp<GrPathProcessor> pathProc(GrPathProcessor::Create(this->color(), this->viewMatrix()));
- GrProgramInfo programInfo(state->proxy()->numSamples(),
- state->proxy()->numStencilSamples(),
- state->proxy()->backendFormat(),
- state->view()->origin(),
- &pipeline,
+ GrRenderTargetProxy* proxy = flushState->proxy();
+ GrProgramInfo programInfo(proxy->numSamples(),
+ proxy->numStencilSamples(),
+ proxy->backendFormat(),
+ flushState->view()->origin(),
+ pipeline,
pathProc.get(),
fixedDynamicState,
nullptr, 0,
GrPrimitiveType::kPath);
GrStencilSettings stencil;
- init_stencil_pass_settings(*state, this->fillType(), &stencil);
- state->gpu()->pathRendering()->drawPath(state->drawOpArgs().proxy()->peekRenderTarget(),
- programInfo, stencil, fPath.get());
+ init_stencil_pass_settings(*flushState, this->fillType(), &stencil);
+ flushState->gpu()->pathRendering()->drawPath(proxy->peekRenderTarget(),
+ programInfo, stencil, fPath.get());
}
//////////////////////////////////////////////////////////////////////////////
diff --git a/src/gpu/ops/GrDrawPathOp.h b/src/gpu/ops/GrDrawPathOp.h
index f40c2b9..c11be49 100644
--- a/src/gpu/ops/GrDrawPathOp.h
+++ b/src/gpu/ops/GrDrawPathOp.h
@@ -43,9 +43,9 @@
const SkMatrix& viewMatrix() const { return fViewMatrix; }
const SkPMColor4f& color() const { return fInputColor; }
GrPathRendering::FillType fillType() const { return fFillType; }
+ bool doAA() const { return fDoAA; }
const GrProcessorSet& processors() const { return fProcessorSet; }
- GrProcessorSet detachProcessors() { return std::move(fProcessorSet); }
- inline GrPipeline::InitArgs pipelineInitArgs(const GrOpFlushState&);
+ GrProcessorSet detachProcessorSet() { return std::move(fProcessorSet); }
const GrProcessorSet::Analysis& doProcessorAnalysis(
const GrCaps&, const GrAppliedClip*, bool hasMixedSampledCoverage, GrClampType);
const GrProcessorSet::Analysis& processorAnalysis() const {
diff --git a/src/gpu/ops/GrDrawVerticesOp.cpp b/src/gpu/ops/GrDrawVerticesOp.cpp
index 102fa3d..f51307c 100644
--- a/src/gpu/ops/GrDrawVerticesOp.cpp
+++ b/src/gpu/ops/GrDrawVerticesOp.cpp
@@ -512,7 +512,11 @@
}
void DrawVerticesOp::onExecute(GrOpFlushState* flushState, const SkRect& chainBounds) {
- fHelper.executeDrawsAndUploads(this, flushState, chainBounds);
+ auto pipeline = GrSimpleMeshDrawOpHelper::CreatePipeline(flushState,
+ fHelper.detachProcessorSet(),
+ fHelper.pipelineFlags());
+
+ flushState->executeDrawsAndUploadsForMeshDrawOp(this, chainBounds, pipeline);
}
GrOp::CombineResult DrawVerticesOp::onCombineIfPossible(GrOp* t, const GrCaps& caps) {
diff --git a/src/gpu/ops/GrFillRectOp.cpp b/src/gpu/ops/GrFillRectOp.cpp
index ab5c833..afd8ba2 100644
--- a/src/gpu/ops/GrFillRectOp.cpp
+++ b/src/gpu/ops/GrFillRectOp.cpp
@@ -281,7 +281,12 @@
}
void onExecute(GrOpFlushState* flushState, const SkRect& chainBounds) override {
- fHelper.executeDrawsAndUploads(this, flushState, chainBounds);
+ auto pipeline = GrSimpleMeshDrawOpHelper::CreatePipeline(flushState,
+ fHelper.detachProcessorSet(),
+ fHelper.pipelineFlags(),
+ fHelper.stencilSettings());
+
+ flushState->executeDrawsAndUploadsForMeshDrawOp(this, chainBounds, pipeline);
}
CombineResult onCombineIfPossible(GrOp* t, const GrCaps& caps) override {
diff --git a/src/gpu/ops/GrLatticeOp.cpp b/src/gpu/ops/GrLatticeOp.cpp
index b1e430e..9995b77 100644
--- a/src/gpu/ops/GrLatticeOp.cpp
+++ b/src/gpu/ops/GrLatticeOp.cpp
@@ -290,7 +290,11 @@
}
void onExecute(GrOpFlushState* flushState, const SkRect& chainBounds) override {
- fHelper.executeDrawsAndUploads(this, flushState, chainBounds);
+ auto pipeline = GrSimpleMeshDrawOpHelper::CreatePipeline(flushState,
+ fHelper.detachProcessorSet(),
+ fHelper.pipelineFlags());
+
+ flushState->executeDrawsAndUploadsForMeshDrawOp(this, chainBounds, pipeline);
}
CombineResult onCombineIfPossible(GrOp* t, const GrCaps& caps) override {
diff --git a/src/gpu/ops/GrOvalOpFactory.cpp b/src/gpu/ops/GrOvalOpFactory.cpp
index 6adb970..5e32b0a 100644
--- a/src/gpu/ops/GrOvalOpFactory.cpp
+++ b/src/gpu/ops/GrOvalOpFactory.cpp
@@ -1399,7 +1399,11 @@
}
void onExecute(GrOpFlushState* flushState, const SkRect& chainBounds) override {
- fHelper.executeDrawsAndUploads(this, flushState, chainBounds);
+ auto pipeline = GrSimpleMeshDrawOpHelper::CreatePipeline(flushState,
+ fHelper.detachProcessorSet(),
+ fHelper.pipelineFlags());
+
+ flushState->executeDrawsAndUploadsForMeshDrawOp(this, chainBounds, pipeline);
}
CombineResult onCombineIfPossible(GrOp* t, const GrCaps& caps) override {
@@ -1690,7 +1694,11 @@
}
void onExecute(GrOpFlushState* flushState, const SkRect& chainBounds) override {
- fHelper.executeDrawsAndUploads(this, flushState, chainBounds);
+ auto pipeline = GrSimpleMeshDrawOpHelper::CreatePipeline(flushState,
+ fHelper.detachProcessorSet(),
+ fHelper.pipelineFlags());
+
+ flushState->executeDrawsAndUploadsForMeshDrawOp(this, chainBounds, pipeline);
}
CombineResult onCombineIfPossible(GrOp* t, const GrCaps& caps) override {
@@ -1945,7 +1953,11 @@
}
void onExecute(GrOpFlushState* flushState, const SkRect& chainBounds) override {
- fHelper.executeDrawsAndUploads(this, flushState, chainBounds);
+ auto pipeline = GrSimpleMeshDrawOpHelper::CreatePipeline(flushState,
+ fHelper.detachProcessorSet(),
+ fHelper.pipelineFlags());
+
+ flushState->executeDrawsAndUploadsForMeshDrawOp(this, chainBounds, pipeline);
}
CombineResult onCombineIfPossible(GrOp* t, const GrCaps& caps) override {
@@ -2182,7 +2194,11 @@
}
void onExecute(GrOpFlushState* flushState, const SkRect& chainBounds) override {
- fHelper.executeDrawsAndUploads(this, flushState, chainBounds);
+ auto pipeline = GrSimpleMeshDrawOpHelper::CreatePipeline(flushState,
+ fHelper.detachProcessorSet(),
+ fHelper.pipelineFlags());
+
+ flushState->executeDrawsAndUploadsForMeshDrawOp(this, chainBounds, pipeline);
}
CombineResult onCombineIfPossible(GrOp* t, const GrCaps& caps) override {
@@ -2613,7 +2629,11 @@
}
void onExecute(GrOpFlushState* flushState, const SkRect& chainBounds) override {
- fHelper.executeDrawsAndUploads(this, flushState, chainBounds);
+ auto pipeline = GrSimpleMeshDrawOpHelper::CreatePipeline(flushState,
+ fHelper.detachProcessorSet(),
+ fHelper.pipelineFlags());
+
+ flushState->executeDrawsAndUploadsForMeshDrawOp(this, chainBounds, pipeline);
}
CombineResult onCombineIfPossible(GrOp* t, const GrCaps& caps) override {
@@ -2895,7 +2915,11 @@
}
void onExecute(GrOpFlushState* flushState, const SkRect& chainBounds) override {
- fHelper.executeDrawsAndUploads(this, flushState, chainBounds);
+ auto pipeline = GrSimpleMeshDrawOpHelper::CreatePipeline(flushState,
+ fHelper.detachProcessorSet(),
+ fHelper.pipelineFlags());
+
+ flushState->executeDrawsAndUploadsForMeshDrawOp(this, chainBounds, pipeline);
}
CombineResult onCombineIfPossible(GrOp* t, const GrCaps& caps) override {
diff --git a/src/gpu/ops/GrRegionOp.cpp b/src/gpu/ops/GrRegionOp.cpp
index cc78057..e12a865 100644
--- a/src/gpu/ops/GrRegionOp.cpp
+++ b/src/gpu/ops/GrRegionOp.cpp
@@ -133,7 +133,12 @@
}
void onExecute(GrOpFlushState* flushState, const SkRect& chainBounds) override {
- fHelper.executeDrawsAndUploads(this, flushState, chainBounds);
+ auto pipeline = GrSimpleMeshDrawOpHelper::CreatePipeline(flushState,
+ fHelper.detachProcessorSet(),
+ fHelper.pipelineFlags(),
+ fHelper.stencilSettings());
+
+ flushState->executeDrawsAndUploadsForMeshDrawOp(this, chainBounds, pipeline);
}
CombineResult onCombineIfPossible(GrOp* t, const GrCaps& caps) override {
diff --git a/src/gpu/ops/GrShadowRRectOp.cpp b/src/gpu/ops/GrShadowRRectOp.cpp
index d899954..6a4bbab 100644
--- a/src/gpu/ops/GrShadowRRectOp.cpp
+++ b/src/gpu/ops/GrShadowRRectOp.cpp
@@ -15,6 +15,7 @@
#include "src/gpu/GrProxyProvider.h"
#include "src/gpu/GrRecordingContextPriv.h"
#include "src/gpu/effects/GrShadowGeoProc.h"
+#include "src/gpu/ops/GrSimpleMeshDrawOpHelper.h"
///////////////////////////////////////////////////////////////////////////////
// Circle Data
@@ -602,8 +603,11 @@
}
void onExecute(GrOpFlushState* flushState, const SkRect& chainBounds) override {
- flushState->executeDrawsAndUploadsForMeshDrawOp(
- this, chainBounds, GrProcessorSet::MakeEmptySet());
+ auto pipeline = GrSimpleMeshDrawOpHelper::CreatePipeline(flushState,
+ GrProcessorSet::MakeEmptySet(),
+ GrPipeline::InputFlags::kNone);
+
+ flushState->executeDrawsAndUploadsForMeshDrawOp(this, chainBounds, pipeline);
}
CombineResult onCombineIfPossible(GrOp* t, const GrCaps& caps) override {
diff --git a/src/gpu/ops/GrSimpleMeshDrawOpHelper.cpp b/src/gpu/ops/GrSimpleMeshDrawOpHelper.cpp
index 9654561..9b6e945 100644
--- a/src/gpu/ops/GrSimpleMeshDrawOpHelper.cpp
+++ b/src/gpu/ops/GrSimpleMeshDrawOpHelper.cpp
@@ -106,15 +106,22 @@
return analysis;
}
-void GrSimpleMeshDrawOpHelper::executeDrawsAndUploads(
- const GrOp* op, GrOpFlushState* flushState, const SkRect& chainBounds) {
- if (fProcessors) {
- flushState->executeDrawsAndUploadsForMeshDrawOp(
- op, chainBounds, std::move(*fProcessors), fPipelineFlags);
- } else {
- flushState->executeDrawsAndUploadsForMeshDrawOp(
- op, chainBounds, GrProcessorSet::MakeEmptySet(), fPipelineFlags);
- }
+const GrPipeline* GrSimpleMeshDrawOpHelper::CreatePipeline(
+ GrOpFlushState* flushState,
+ GrProcessorSet&& processorSet,
+ GrPipeline::InputFlags pipelineFlags,
+ const GrUserStencilSettings* stencilSettings) {
+ GrPipeline::InitArgs pipelineArgs;
+
+ pipelineArgs.fInputFlags = pipelineFlags;
+ pipelineArgs.fDstProxyView = flushState->dstProxyView();
+ pipelineArgs.fCaps = &flushState->caps();
+ pipelineArgs.fUserStencil = stencilSettings;
+ pipelineArgs.fOutputSwizzle = flushState->view()->swizzle();
+
+ return flushState->allocator()->make<GrPipeline>(pipelineArgs,
+ std::move(processorSet),
+ flushState->detachAppliedClip());
}
#ifdef SK_DEBUG
@@ -186,17 +193,6 @@
fStencilSettings == that.fStencilSettings;
}
-void GrSimpleMeshDrawOpHelperWithStencil::executeDrawsAndUploads(
- const GrOp* op, GrOpFlushState* flushState, const SkRect& chainBounds) {
- if (fProcessors) {
- flushState->executeDrawsAndUploadsForMeshDrawOp(
- op, chainBounds, std::move(*fProcessors), fPipelineFlags, fStencilSettings);
- } else {
- flushState->executeDrawsAndUploadsForMeshDrawOp(
- op, chainBounds, GrProcessorSet::MakeEmptySet(), fPipelineFlags, fStencilSettings);
- }
-}
-
#ifdef SK_DEBUG
SkString GrSimpleMeshDrawOpHelperWithStencil::dumpInfo() const {
SkString result = INHERITED::dumpInfo();
diff --git a/src/gpu/ops/GrSimpleMeshDrawOpHelper.h b/src/gpu/ops/GrSimpleMeshDrawOpHelper.h
index f184769..8929af6 100644
--- a/src/gpu/ops/GrSimpleMeshDrawOpHelper.h
+++ b/src/gpu/ops/GrSimpleMeshDrawOpHelper.h
@@ -122,11 +122,19 @@
fAAType = static_cast<unsigned>(aaType);
}
- void executeDrawsAndUploads(const GrOp*, GrOpFlushState*, const SkRect& chainBounds);
+ static const GrPipeline* CreatePipeline(
+ GrOpFlushState*,
+ GrProcessorSet&&,
+ GrPipeline::InputFlags fPipelineFlags,
+ const GrUserStencilSettings* = &GrUserStencilSettings::kUnused);
-protected:
+ GrProcessorSet detachProcessorSet() {
+ return fProcessors ? std::move(*fProcessors) : GrProcessorSet::MakeEmptySet();
+ }
+
GrPipeline::InputFlags pipelineFlags() const { return fPipelineFlags; }
+protected:
GrProcessorSet::Analysis finalizeProcessors(
const GrCaps& caps, const GrAppliedClip*, const GrUserStencilSettings*,
bool hasMixedSampledCoverage, GrClampType, GrProcessorAnalysisCoverage geometryCoverage,
@@ -185,17 +193,19 @@
using GrSimpleMeshDrawOpHelper::isTrivial;
using GrSimpleMeshDrawOpHelper::usesLocalCoords;
using GrSimpleMeshDrawOpHelper::compatibleWithCoverageAsAlpha;
+ using GrSimpleMeshDrawOpHelper::detachProcessorSet;
+ using GrSimpleMeshDrawOpHelper::pipelineFlags;
bool isCompatible(const GrSimpleMeshDrawOpHelperWithStencil& that, const GrCaps&,
const SkRect& thisBounds, const SkRect& thatBounds,
bool ignoreAAType = false) const;
- void executeDrawsAndUploads(const GrOp*, GrOpFlushState*, const SkRect& chainBounds);
-
#ifdef SK_DEBUG
SkString dumpInfo() const;
#endif
+ const GrUserStencilSettings* stencilSettings() const { return fStencilSettings; }
+
private:
const GrUserStencilSettings* fStencilSettings;
typedef GrSimpleMeshDrawOpHelper INHERITED;
diff --git a/src/gpu/ops/GrSmallPathRenderer.cpp b/src/gpu/ops/GrSmallPathRenderer.cpp
index 742aa58..96b40c4 100644
--- a/src/gpu/ops/GrSmallPathRenderer.cpp
+++ b/src/gpu/ops/GrSmallPathRenderer.cpp
@@ -812,7 +812,12 @@
}
void onExecute(GrOpFlushState* flushState, const SkRect& chainBounds) override {
- fHelper.executeDrawsAndUploads(this, flushState, chainBounds);
+ auto pipeline = GrSimpleMeshDrawOpHelper::CreatePipeline(flushState,
+ fHelper.detachProcessorSet(),
+ fHelper.pipelineFlags(),
+ fHelper.stencilSettings());
+
+ flushState->executeDrawsAndUploadsForMeshDrawOp(this, chainBounds, pipeline);
}
const SkPMColor4f& color() const { return fShapes[0].fColor; }
diff --git a/src/gpu/ops/GrStrokeRectOp.cpp b/src/gpu/ops/GrStrokeRectOp.cpp
index 6c95eae..045f69c 100644
--- a/src/gpu/ops/GrStrokeRectOp.cpp
+++ b/src/gpu/ops/GrStrokeRectOp.cpp
@@ -228,7 +228,11 @@
}
void onExecute(GrOpFlushState* flushState, const SkRect& chainBounds) override {
- fHelper.executeDrawsAndUploads(this, flushState, chainBounds);
+ auto pipeline = GrSimpleMeshDrawOpHelper::CreatePipeline(flushState,
+ fHelper.detachProcessorSet(),
+ fHelper.pipelineFlags());
+
+ flushState->executeDrawsAndUploadsForMeshDrawOp(this, chainBounds, pipeline);
}
// TODO: override onCombineIfPossible
@@ -520,7 +524,11 @@
}
void AAStrokeRectOp::onExecute(GrOpFlushState* flushState, const SkRect& chainBounds) {
- fHelper.executeDrawsAndUploads(this, flushState, chainBounds);
+ auto pipeline = GrSimpleMeshDrawOpHelper::CreatePipeline(flushState,
+ fHelper.detachProcessorSet(),
+ fHelper.pipelineFlags());
+
+ flushState->executeDrawsAndUploadsForMeshDrawOp(this, chainBounds, pipeline);
}
sk_sp<const GrGpuBuffer> AAStrokeRectOp::GetIndexBuffer(GrResourceProvider* resourceProvider,
diff --git a/src/gpu/ops/GrTessellatingPathRenderer.cpp b/src/gpu/ops/GrTessellatingPathRenderer.cpp
index ba1e853..ee4d91d 100644
--- a/src/gpu/ops/GrTessellatingPathRenderer.cpp
+++ b/src/gpu/ops/GrTessellatingPathRenderer.cpp
@@ -382,7 +382,12 @@
}
void onExecute(GrOpFlushState* flushState, const SkRect& chainBounds) override {
- fHelper.executeDrawsAndUploads(this, flushState, chainBounds);
+ auto pipeline = GrSimpleMeshDrawOpHelper::CreatePipeline(flushState,
+ fHelper.detachProcessorSet(),
+ fHelper.pipelineFlags(),
+ fHelper.stencilSettings());
+
+ flushState->executeDrawsAndUploadsForMeshDrawOp(this, chainBounds, pipeline);
}
Helper fHelper;
diff --git a/src/gpu/ops/GrTextureOp.cpp b/src/gpu/ops/GrTextureOp.cpp
index e687011..b6e39cb 100644
--- a/src/gpu/ops/GrTextureOp.cpp
+++ b/src/gpu/ops/GrTextureOp.cpp
@@ -39,6 +39,7 @@
#include "src/gpu/ops/GrFillRectOp.h"
#include "src/gpu/ops/GrMeshDrawOp.h"
#include "src/gpu/ops/GrQuadPerEdgeAA.h"
+#include "src/gpu/ops/GrSimpleMeshDrawOpHelper.h"
#include "src/gpu/ops/GrTextureOp.h"
namespace {
@@ -883,8 +884,12 @@
auto pipelineFlags = (GrAAType::kMSAA == fMetadata.aaType())
? GrPipeline::InputFlags::kHWAntialias
: GrPipeline::InputFlags::kNone;
- flushState->executeDrawsAndUploadsForMeshDrawOp(
- this, chainBounds, GrProcessorSet::MakeEmptySet(), pipelineFlags);
+
+ auto pipeline = GrSimpleMeshDrawOpHelper::CreatePipeline(flushState,
+ GrProcessorSet::MakeEmptySet(),
+ pipelineFlags);
+
+ flushState->executeDrawsAndUploadsForMeshDrawOp(this, chainBounds, pipeline);
}
CombineResult onCombineIfPossible(GrOp* t, const GrCaps& caps) override {