Stack-allocate pipelines for GrMeshDrawOp
Stack-allocates the pipelines in onExecute. This saves us from having
to store the pipelines on the heap, as well as delaying the need to
detach processors until onExecute. The delay is an improvement because
it allows us to keep visiting proxies after onPrepare. (Previously,
they were moved out of GrProcessorSet and into a pipeline during
onPrepare, so visiting proxies was impossible after that point.)
Bug: skia:8731
Change-Id: Idc05063fb0dfbfed42b434e429fa5a497097bdae
Reviewed-on: https://skia-review.googlesource.com/c/193368
Commit-Queue: Chris Dalton <csmartdalton@google.com>
Reviewed-by: Robert Phillips <robertphillips@google.com>
diff --git a/src/gpu/ops/GrDefaultPathRenderer.cpp b/src/gpu/ops/GrDefaultPathRenderer.cpp
index 7b50162..1ac80e6 100644
--- a/src/gpu/ops/GrDefaultPathRenderer.cpp
+++ b/src/gpu/ops/GrDefaultPathRenderer.cpp
@@ -66,14 +66,11 @@
class PathGeoBuilder {
public:
PathGeoBuilder(GrPrimitiveType primitiveType, GrMeshDrawOp::Target* target,
- sk_sp<const GrGeometryProcessor> geometryProcessor, const GrPipeline* pipeline,
- const GrPipeline::FixedDynamicState* fixedDynamicState)
+ sk_sp<const GrGeometryProcessor> geometryProcessor)
: fPrimitiveType(primitiveType)
, fTarget(target)
, fVertexStride(sizeof(SkPoint))
, fGeometryProcessor(std::move(geometryProcessor))
- , fPipeline(pipeline)
- , fFixedDynamicState(fixedDynamicState)
, fFirstIndex(0)
, fIndicesInChunk(0)
, fIndices(nullptr) {
@@ -279,7 +276,7 @@
vertexCount - 1, GrPrimitiveRestart::kNo);
}
mesh->setVertexData(std::move(fVertexBuffer), fFirstVertex);
- fTarget->draw(fGeometryProcessor, fPipeline, fFixedDynamicState, mesh);
+ fTarget->recordDraw(fGeometryProcessor, mesh);
}
fTarget->putBackIndices((size_t)(fIndicesInChunk - indexCount));
@@ -316,8 +313,6 @@
GrMeshDrawOp::Target* fTarget;
size_t fVertexStride;
sk_sp<const GrGeometryProcessor> fGeometryProcessor;
- const GrPipeline* fPipeline;
- const GrPipeline::FixedDynamicState* fFixedDynamicState;
sk_sp<const GrBuffer> fVertexBuffer;
int fFirstVertex;
@@ -430,9 +425,7 @@
} else {
primitiveType = GrPrimitiveType::kTriangles;
}
- auto pipe = fHelper.makePipeline(target);
- PathGeoBuilder pathGeoBuilder(primitiveType, target, std::move(gp), pipe.fPipeline,
- pipe.fFixedDynamicState);
+ PathGeoBuilder pathGeoBuilder(primitiveType, target, std::move(gp));
// fill buffers
for (int i = 0; i < instanceCount; i++) {
@@ -441,6 +434,10 @@
}
}
+ void onExecute(GrOpFlushState* flushState, const SkRect& chainBounds) override {
+ fHelper.executeDrawsAndUploads(this, flushState, chainBounds);
+ }
+
CombineResult onCombineIfPossible(GrOp* t, const GrCaps& caps) override {
DefaultPathOp* that = t->cast<DefaultPathOp>();
if (!fHelper.isCompatible(that->fHelper, caps, this->bounds(), that->bounds())) {