Reland "Stack-allocate pipelines for GrMeshDrawOp"
This is a reland of dfe5000a5ff2cabb50ddc139882dc1f3005fa429
Original change's description:
> 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>
TBR=robertphillips@google.com
Bug: skia:8731
Change-Id: I32def1a35bb0593470fa672691a9e697dc6d9680
Reviewed-on: https://skia-review.googlesource.com/c/195261
Reviewed-by: Chris Dalton <csmartdalton@google.com>
Commit-Queue: Chris Dalton <csmartdalton@google.com>
diff --git a/src/gpu/ops/GrMeshDrawOp.cpp b/src/gpu/ops/GrMeshDrawOp.cpp
index ac019f3..a8ad863 100644
--- a/src/gpu/ops/GrMeshDrawOp.cpp
+++ b/src/gpu/ops/GrMeshDrawOp.cpp
@@ -14,10 +14,6 @@
void GrMeshDrawOp::onPrepare(GrOpFlushState* state) { this->onPrepareDraws(state); }
-void GrMeshDrawOp::onExecute(GrOpFlushState* state, const SkRect& chainBounds) {
- state->executeDrawsAndUploadsForMeshDrawOp(this, chainBounds);
-}
-
//////////////////////////////////////////////////////////////////////////////
GrMeshDrawOp::PatternHelper::PatternHelper(Target* target, GrPrimitiveType primitiveType,
@@ -54,9 +50,14 @@
}
void GrMeshDrawOp::PatternHelper::recordDraw(
- Target* target, sk_sp<const GrGeometryProcessor> gp, const GrPipeline* pipeline,
+ Target* target, sk_sp<const GrGeometryProcessor> gp) const {
+ target->recordDraw(std::move(gp), fMesh);
+}
+
+void GrMeshDrawOp::PatternHelper::recordDraw(
+ Target* target, sk_sp<const GrGeometryProcessor> gp,
const GrPipeline::FixedDynamicState* fixedDynamicState) const {
- target->draw(std::move(gp), pipeline, fixedDynamicState, fMesh);
+ target->recordDraw(std::move(gp), fMesh, 1, fixedDynamicState, nullptr);
}
//////////////////////////////////////////////////////////////////////////////
@@ -73,45 +74,32 @@
//////////////////////////////////////////////////////////////////////////////
-GrPipeline::FixedDynamicState* GrMeshDrawOp::Target::allocFixedDynamicState(
- const SkIRect& rect, int numPrimitiveProcessorTextures) {
- auto result = this->pipelineArena()->make<GrPipeline::FixedDynamicState>(rect);
- if (numPrimitiveProcessorTextures) {
- result->fPrimitiveProcessorTextures =
- this->allocPrimitiveProcessorTextureArray(numPrimitiveProcessorTextures);
- }
- return result;
-}
-
GrPipeline::DynamicStateArrays* GrMeshDrawOp::Target::allocDynamicStateArrays(
int numMeshes, int numPrimitiveProcessorTextures, bool allocScissors) {
- auto result = this->pipelineArena()->make<GrPipeline::DynamicStateArrays>();
+ auto result = this->allocator()->make<GrPipeline::DynamicStateArrays>();
if (allocScissors) {
- result->fScissorRects = this->pipelineArena()->makeArray<SkIRect>(numMeshes);
+ result->fScissorRects = this->allocator()->makeArray<SkIRect>(numMeshes);
}
if (numPrimitiveProcessorTextures) {
- result->fPrimitiveProcessorTextures = this->allocPrimitiveProcessorTextureArray(
- numPrimitiveProcessorTextures * numMeshes);
+ result->fPrimitiveProcessorTextures =
+ this->allocator()->makeArrayDefault<GrTextureProxy*>(
+ numPrimitiveProcessorTextures * numMeshes);
}
return result;
}
-GrMeshDrawOp::Target::PipelineAndFixedDynamicState GrMeshDrawOp::Target::makePipeline(
- uint32_t pipelineFlags, GrProcessorSet&& processorSet, GrAppliedClip&& clip,
+GrPipeline::FixedDynamicState* GrMeshDrawOp::Target::makeFixedDynamicState(
int numPrimProcTextures) {
- GrPipeline::InitArgs pipelineArgs;
- pipelineArgs.fFlags = pipelineFlags;
- pipelineArgs.fDstProxy = this->dstProxy();
- pipelineArgs.fCaps = &this->caps();
- pipelineArgs.fResourceProvider = this->resourceProvider();
- GrPipeline::FixedDynamicState* fixedDynamicState = nullptr;
- if (clip.scissorState().enabled() || numPrimProcTextures) {
- fixedDynamicState = this->allocFixedDynamicState(clip.scissorState().rect());
+ const GrAppliedClip* clip = this->appliedClip();
+ if ((clip && clip->scissorState().enabled()) || numPrimProcTextures) {
+ const SkIRect& scissor = (clip) ? clip->scissorState().rect() : SkIRect::MakeEmpty();
+ auto fixedDynamicState =
+ this->allocator()->make<GrPipeline::FixedDynamicState>(scissor);
if (numPrimProcTextures) {
fixedDynamicState->fPrimitiveProcessorTextures =
- this->allocPrimitiveProcessorTextureArray(numPrimProcTextures);
+ this->allocator()->makeArrayDefault<GrTextureProxy*>(numPrimProcTextures);
}
+ return fixedDynamicState;
}
- return {this->allocPipeline(pipelineArgs, std::move(processorSet), std::move(clip)),
- fixedDynamicState};
+ return nullptr;
}