Provide record time allocator to onCombineIfPossible()
Change-Id: I3acf5d5fdb29bfbd3407a8065b7567dff43503a0
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/259427
Commit-Queue: Michael Ludwig <michaelludwig@google.com>
Reviewed-by: Robert Phillips <robertphillips@google.com>
diff --git a/src/atlastext/SkAtlasTextTarget.cpp b/src/atlastext/SkAtlasTextTarget.cpp
index fe43491..6d0f242 100644
--- a/src/atlastext/SkAtlasTextTarget.cpp
+++ b/src/atlastext/SkAtlasTextTarget.cpp
@@ -126,6 +126,10 @@
return fContext->internal().grContext()->priv().opMemoryPool();
}
+ SkArenaAlloc* recordTimeAllocator() {
+ return fContext->internal().grContext()->priv().recordTimeAllocator();
+ }
+
uint32_t fColor;
using SkAtlasTextTarget::fWidth;
using SkAtlasTextTarget::fHeight;
@@ -178,9 +182,10 @@
int n = SkTMin(kMaxBatchLookBack, fOps.count());
GrOpMemoryPool* pool = this->opMemoryPool();
+ SkArenaAlloc* arena = this->recordTimeAllocator();
for (int i = 0; i < n; ++i) {
GrAtlasTextOp* other = fOps.fromBack(i).get();
- if (other->combineIfPossible(op.get(), caps) == GrOp::CombineResult::kMerged) {
+ if (other->combineIfPossible(op.get(), arena, caps) == GrOp::CombineResult::kMerged) {
pool->release(std::move(op));
return;
}
diff --git a/src/gpu/GrContextPriv.h b/src/gpu/GrContextPriv.h
index a3ef7d0..627c096 100644
--- a/src/gpu/GrContextPriv.h
+++ b/src/gpu/GrContextPriv.h
@@ -58,8 +58,8 @@
// from GrRecordingContext
GrDrawingManager* drawingManager() { return fContext->drawingManager(); }
-
GrOpMemoryPool* opMemoryPool() { return fContext->opMemoryPool(); }
+ SkArenaAlloc* recordTimeAllocator() { return fContext->recordTimeAllocator(); }
GrStrikeCache* getGrStrikeCache() { return fContext->getGrStrikeCache(); }
GrTextBlobCache* getTextBlobCache() { return fContext->getTextBlobCache(); }
diff --git a/src/gpu/GrDrawingManager.cpp b/src/gpu/GrDrawingManager.cpp
index 8284a32..d318c0d 100644
--- a/src/gpu/GrDrawingManager.cpp
+++ b/src/gpu/GrDrawingManager.cpp
@@ -682,7 +682,9 @@
this->closeRenderTasksForNewRenderTask(proxy);
sk_sp<GrOpsTask> opsTask(new GrOpsTask(fContext->priv().opMemoryPool(),
- std::move(surfaceView), fContext->priv().auditTrail()));
+ fContext->priv().recordTimeAllocator(),
+ std::move(surfaceView),
+ fContext->priv().auditTrail()));
SkASSERT(proxy->getLastRenderTask() == opsTask.get());
if (managedOpsTask) {
diff --git a/src/gpu/GrOpsTask.cpp b/src/gpu/GrOpsTask.cpp
index ea21b55..28dd6cb 100644
--- a/src/gpu/GrOpsTask.cpp
+++ b/src/gpu/GrOpsTask.cpp
@@ -159,7 +159,7 @@
// the two chains are chainable. Returns the new chain.
GrOpsTask::OpChain::List GrOpsTask::OpChain::DoConcat(
List chainA, List chainB, const GrCaps& caps, GrOpMemoryPool* pool,
- GrAuditTrail* auditTrail) {
+ SkArenaAlloc* rtArena, GrAuditTrail* auditTrail) {
// We process ops in chain b from head to tail. We attempt to merge with nodes in a, starting
// at chain a's tail and working toward the head. We produce one of the following outcomes:
// 1) b's head is merged into an op in a.
@@ -184,7 +184,7 @@
bool canForwardMerge =
(a == chainA.tail()) || can_reorder(a->bounds(), forwardMergeBounds);
if (canForwardMerge || canBackwardMerge) {
- auto result = a->combineIfPossible(chainB.head(), caps);
+ auto result = a->combineIfPossible(chainB.head(), rtArena, caps);
SkASSERT(result != GrOp::CombineResult::kCannotCombine);
merged = (result == GrOp::CombineResult::kMerged);
GrOP_INFO("\t\t: (%s opID: %u) -> Combining with (%s, opID: %u)\n",
@@ -236,7 +236,7 @@
bool GrOpsTask::OpChain::tryConcat(
List* list, GrProcessorSet::Analysis processorAnalysis, const DstProxyView& dstProxyView,
const GrAppliedClip* appliedClip, const SkRect& bounds, const GrCaps& caps,
- GrOpMemoryPool* pool, GrAuditTrail* auditTrail) {
+ GrOpMemoryPool* pool, SkArenaAlloc* rtArena, GrAuditTrail* auditTrail) {
SkASSERT(!fList.empty());
SkASSERT(!list->empty());
SkASSERT(fProcessorAnalysis.requiresDstTexture() == SkToBool(fDstProxyView.proxy()));
@@ -259,7 +259,7 @@
SkDEBUGCODE(bool first = true;)
do {
- switch (fList.tail()->combineIfPossible(list->head(), caps)) {
+ switch (fList.tail()->combineIfPossible(list->head(), rtArena, caps)) {
case GrOp::CombineResult::kCannotCombine:
// If an op supports chaining then it is required that chaining is transitive and
// that if any two ops in two different chains can merge then the two chains
@@ -269,7 +269,7 @@
return false;
case GrOp::CombineResult::kMayChain:
fList = DoConcat(std::move(fList), skstd::exchange(*list, List()), caps, pool,
- auditTrail);
+ rtArena, auditTrail);
// The above exchange cleared out 'list'. The list needs to be empty now for the
// loop to terminate.
SkASSERT(list->empty());
@@ -292,9 +292,9 @@
}
bool GrOpsTask::OpChain::prependChain(OpChain* that, const GrCaps& caps, GrOpMemoryPool* pool,
- GrAuditTrail* auditTrail) {
+ SkArenaAlloc* rtArena, GrAuditTrail* auditTrail) {
if (!that->tryConcat(&fList, fProcessorAnalysis, fDstProxyView, fAppliedClip, fBounds, caps,
- pool, auditTrail)) {
+ pool, rtArena, auditTrail)) {
this->validate();
// append failed
return false;
@@ -318,7 +318,7 @@
std::unique_ptr<GrOp> GrOpsTask::OpChain::appendOp(
std::unique_ptr<GrOp> op, GrProcessorSet::Analysis processorAnalysis,
const DstProxyView* dstProxyView, const GrAppliedClip* appliedClip, const GrCaps& caps,
- GrOpMemoryPool* pool, GrAuditTrail* auditTrail) {
+ GrOpMemoryPool* pool, SkArenaAlloc* rtArena, GrAuditTrail* auditTrail) {
const GrXferProcessor::DstProxyView noDstProxyView;
if (!dstProxyView) {
dstProxyView = &noDstProxyView;
@@ -328,7 +328,7 @@
List chain(std::move(op));
if (!this->tryConcat(
&chain, processorAnalysis, *dstProxyView, appliedClip, opBounds, caps, pool,
- auditTrail)) {
+ rtArena, auditTrail)) {
// append failed, give the op back to the caller.
this->validate();
return chain.popHead();
@@ -353,10 +353,12 @@
////////////////////////////////////////////////////////////////////////////////
GrOpsTask::GrOpsTask(GrOpMemoryPool* opMemoryPool,
+ SkArenaAlloc* rtArena,
GrSurfaceProxyView view,
GrAuditTrail* auditTrail)
: GrRenderTask(std::move(view))
, fOpMemoryPool(opMemoryPool)
+ , fRecordTimeAllocator(rtArena)
, fAuditTrail(auditTrail)
, fLastClipStackGenID(SK_InvalidUniqueID)
SkDEBUGCODE(, fNumClips(0)) {
@@ -815,7 +817,7 @@
while (true) {
OpChain& candidate = fOpChains.fromBack(i);
op = candidate.appendOp(std::move(op), processorAnalysis, dstProxyView, clip, caps,
- fOpMemoryPool, fAuditTrail);
+ fOpMemoryPool, fRecordTimeAllocator, fAuditTrail);
if (!op) {
return;
}
@@ -850,7 +852,8 @@
int j = i + 1;
while (true) {
OpChain& candidate = fOpChains[j];
- if (candidate.prependChain(&chain, caps, fOpMemoryPool, fAuditTrail)) {
+ if (candidate.prependChain(&chain, caps, fOpMemoryPool, fRecordTimeAllocator,
+ fAuditTrail)) {
break;
}
// Stop traversing if we would cause a painter's order violation.
diff --git a/src/gpu/GrOpsTask.h b/src/gpu/GrOpsTask.h
index 7d4e15e..d497f56 100644
--- a/src/gpu/GrOpsTask.h
+++ b/src/gpu/GrOpsTask.h
@@ -32,6 +32,7 @@
class GrGpuBuffer;
class GrOpMemoryPool;
class GrRenderTargetProxy;
+class SkArenaAlloc;
class GrOpsTask : public GrRenderTask {
private:
@@ -40,7 +41,7 @@
public:
// The GrOpMemoryPool must outlive the GrOpsTask, either by preserving the context that owns
// the pool, or by moving the pool to the DDL that takes over the GrOpsTask.
- GrOpsTask(GrOpMemoryPool*, GrSurfaceProxyView, GrAuditTrail*);
+ GrOpsTask(GrOpMemoryPool*, SkArenaAlloc*, GrSurfaceProxyView, GrAuditTrail*);
~GrOpsTask() override;
GrOpsTask* asOpsTask() override { return this; }
@@ -199,14 +200,14 @@
// Attempts to move the ops from the passed chain to this chain at the head. Also attempts
// to merge ops between the chains. Upon success the passed chain is empty.
// Fails when the chains aren't of the same op type, have different clips or dst proxies.
- bool prependChain(OpChain*, const GrCaps&, GrOpMemoryPool*, GrAuditTrail*);
+ bool prependChain(OpChain*, const GrCaps&, GrOpMemoryPool*, SkArenaAlloc*, GrAuditTrail*);
// Attempts to add 'op' to this chain either by merging or adding to the tail. Returns
// 'op' to the caller upon failure, otherwise null. Fails when the op and chain aren't of
// the same op type, have different clips or dst proxies.
std::unique_ptr<GrOp> appendOp(std::unique_ptr<GrOp> op, GrProcessorSet::Analysis,
const DstProxyView*, const GrAppliedClip*, const GrCaps&,
- GrOpMemoryPool*, GrAuditTrail*);
+ GrOpMemoryPool*, SkArenaAlloc*, GrAuditTrail*);
void setSkipExecuteFlag() { fSkipExecute = true; }
bool shouldExecute() const {
@@ -240,8 +241,10 @@
void validate() const;
bool tryConcat(List*, GrProcessorSet::Analysis, const DstProxyView&, const GrAppliedClip*,
- const SkRect& bounds, const GrCaps&, GrOpMemoryPool*, GrAuditTrail*);
- static List DoConcat(List, List, const GrCaps&, GrOpMemoryPool*, GrAuditTrail*);
+ const SkRect& bounds, const GrCaps&, GrOpMemoryPool*, SkArenaAlloc*,
+ GrAuditTrail*);
+ static List DoConcat(List, List, const GrCaps&, GrOpMemoryPool*, SkArenaAlloc*,
+ GrAuditTrail*);
List fList;
GrProcessorSet::Analysis fProcessorAnalysis;
@@ -280,6 +283,7 @@
// In the DDL case, the GrOpMemoryPool must have been detached from the original recording
// context and moved into the owning DDL.
GrOpMemoryPool* fOpMemoryPool;
+ SkArenaAlloc* fRecordTimeAllocator;
GrAuditTrail* fAuditTrail;
GrLoadOp fColorLoadOp = GrLoadOp::kLoad;
diff --git a/src/gpu/ccpr/GrCCDrawPathsOp.cpp b/src/gpu/ccpr/GrCCDrawPathsOp.cpp
index 2aa6b59..6b2e2ce 100644
--- a/src/gpu/ccpr/GrCCDrawPathsOp.cpp
+++ b/src/gpu/ccpr/GrCCDrawPathsOp.cpp
@@ -192,7 +192,7 @@
return analysis;
}
-GrOp::CombineResult GrCCDrawPathsOp::onCombineIfPossible(GrOp* op, const GrCaps&) {
+GrOp::CombineResult GrCCDrawPathsOp::onCombineIfPossible(GrOp* op, SkArenaAlloc*, const GrCaps&) {
GrCCDrawPathsOp* that = op->cast<GrCCDrawPathsOp>();
SkASSERT(fOwningPerOpsTaskPaths);
SkASSERT(fNumDraws);
diff --git a/src/gpu/ccpr/GrCCDrawPathsOp.h b/src/gpu/ccpr/GrCCDrawPathsOp.h
index 2a63953..27eae4b 100644
--- a/src/gpu/ccpr/GrCCDrawPathsOp.h
+++ b/src/gpu/ccpr/GrCCDrawPathsOp.h
@@ -37,7 +37,7 @@
FixedFunctionFlags fixedFunctionFlags() const override { return FixedFunctionFlags::kNone; }
GrProcessorSet::Analysis finalize(const GrCaps&, const GrAppliedClip*,
bool hasMixedSampledCoverage, GrClampType) override;
- CombineResult onCombineIfPossible(GrOp*, const GrCaps&) override;
+ CombineResult onCombineIfPossible(GrOp*, SkArenaAlloc*, const GrCaps&) override;
void visitProxies(const VisitProxyFunc& fn) const override {
for (const auto& range : fInstanceRanges) {
fn(range.fAtlasProxy, GrMipMapped::kNo);
diff --git a/src/gpu/ccpr/GrCCPerFlushResources.cpp b/src/gpu/ccpr/GrCCPerFlushResources.cpp
index 2043702..771c805 100644
--- a/src/gpu/ccpr/GrCCPerFlushResources.cpp
+++ b/src/gpu/ccpr/GrCCPerFlushResources.cpp
@@ -39,7 +39,7 @@
bool hasMixedSampledCoverage, GrClampType) override {
return GrProcessorSet::EmptySetAnalysis();
}
- CombineResult onCombineIfPossible(GrOp* other, const GrCaps&) override {
+ CombineResult onCombineIfPossible(GrOp* other, SkArenaAlloc*, const GrCaps&) override {
// We will only make multiple copy ops if they have different source proxies.
// TODO: make use of texture chaining.
return CombineResult::kCannotCombine;
diff --git a/src/gpu/ccpr/GrStencilAtlasOp.h b/src/gpu/ccpr/GrStencilAtlasOp.h
index 8c1f4fb..c54d8ec 100644
--- a/src/gpu/ccpr/GrStencilAtlasOp.h
+++ b/src/gpu/ccpr/GrStencilAtlasOp.h
@@ -40,7 +40,7 @@
bool hasMixedSampledCoverage, GrClampType) override {
return GrProcessorSet::EmptySetAnalysis();
}
- CombineResult onCombineIfPossible(GrOp* other, const GrCaps&) override {
+ CombineResult onCombineIfPossible(GrOp* other, SkArenaAlloc*, const GrCaps&) override {
// We will only make multiple copy ops if they have different source proxies.
// TODO: make use of texture chaining.
return CombineResult::kCannotCombine;
diff --git a/src/gpu/ops/GrAAConvexPathRenderer.cpp b/src/gpu/ops/GrAAConvexPathRenderer.cpp
index 8e66ae8..4a00d6b 100644
--- a/src/gpu/ops/GrAAConvexPathRenderer.cpp
+++ b/src/gpu/ops/GrAAConvexPathRenderer.cpp
@@ -829,7 +829,7 @@
flushState->executeDrawsAndUploadsForMeshDrawOp(this, chainBounds, pipeline);
}
- CombineResult onCombineIfPossible(GrOp* t, const GrCaps& caps) override {
+ CombineResult onCombineIfPossible(GrOp* t, SkArenaAlloc*, const GrCaps& caps) override {
AAConvexPathOp* that = t->cast<AAConvexPathOp>();
if (!fHelper.isCompatible(that->fHelper, caps, this->bounds(), that->bounds())) {
return CombineResult::kCannotCombine;
diff --git a/src/gpu/ops/GrAAHairLinePathRenderer.cpp b/src/gpu/ops/GrAAHairLinePathRenderer.cpp
index 7a6ce00..baaa965 100644
--- a/src/gpu/ops/GrAAHairLinePathRenderer.cpp
+++ b/src/gpu/ops/GrAAHairLinePathRenderer.cpp
@@ -866,7 +866,7 @@
typedef SkTArray<int, true> IntArray;
typedef SkTArray<float, true> FloatArray;
- CombineResult onCombineIfPossible(GrOp* t, const GrCaps& caps) override {
+ CombineResult onCombineIfPossible(GrOp* t, SkArenaAlloc*, const GrCaps& caps) override {
AAHairlineOp* that = t->cast<AAHairlineOp>();
if (!fHelper.isCompatible(that->fHelper, caps, this->bounds(), that->bounds())) {
diff --git a/src/gpu/ops/GrAALinearizingConvexPathRenderer.cpp b/src/gpu/ops/GrAALinearizingConvexPathRenderer.cpp
index aa8d437..a8dedbb 100644
--- a/src/gpu/ops/GrAALinearizingConvexPathRenderer.cpp
+++ b/src/gpu/ops/GrAALinearizingConvexPathRenderer.cpp
@@ -312,7 +312,7 @@
flushState->executeDrawsAndUploadsForMeshDrawOp(this, chainBounds, pipeline);
}
- CombineResult onCombineIfPossible(GrOp* t, const GrCaps& caps) override {
+ CombineResult onCombineIfPossible(GrOp* t, SkArenaAlloc*, const GrCaps& caps) override {
AAFlatteningConvexPathOp* that = t->cast<AAFlatteningConvexPathOp>();
if (!fHelper.isCompatible(that->fHelper, caps, this->bounds(), that->bounds())) {
return CombineResult::kCannotCombine;
diff --git a/src/gpu/ops/GrAtlasTextOp.cpp b/src/gpu/ops/GrAtlasTextOp.cpp
index 0fcdb3b..7ee8195 100644
--- a/src/gpu/ops/GrAtlasTextOp.cpp
+++ b/src/gpu/ops/GrAtlasTextOp.cpp
@@ -452,7 +452,7 @@
flushInfo->fGlyphsToFlush = 0;
}
-GrOp::CombineResult GrAtlasTextOp::onCombineIfPossible(GrOp* t, const GrCaps& caps) {
+GrOp::CombineResult GrAtlasTextOp::onCombineIfPossible(GrOp* t, SkArenaAlloc*, const GrCaps& caps) {
GrAtlasTextOp* that = t->cast<GrAtlasTextOp>();
if (fProcessors != that->fProcessors) {
return CombineResult::kCannotCombine;
diff --git a/src/gpu/ops/GrAtlasTextOp.h b/src/gpu/ops/GrAtlasTextOp.h
index a348632..62ac3c8 100644
--- a/src/gpu/ops/GrAtlasTextOp.h
+++ b/src/gpu/ops/GrAtlasTextOp.h
@@ -149,7 +149,7 @@
bool usesLocalCoords() const { return fUsesLocalCoords; }
int numGlyphs() const { return fNumGlyphs; }
- CombineResult onCombineIfPossible(GrOp* t, const GrCaps& caps) override;
+ CombineResult onCombineIfPossible(GrOp* t, SkArenaAlloc*, const GrCaps& caps) override;
GrGeometryProcessor* setupDfProcessor(SkArenaAlloc* arena,
const GrShaderCaps& caps,
diff --git a/src/gpu/ops/GrClearOp.h b/src/gpu/ops/GrClearOp.h
index c64bcc7..c3b8695 100644
--- a/src/gpu/ops/GrClearOp.h
+++ b/src/gpu/ops/GrClearOp.h
@@ -65,7 +65,7 @@
this->setBounds(SkRect::Make(rect), HasAABloat::kNo, IsHairline::kNo);
}
- CombineResult onCombineIfPossible(GrOp* t, const GrCaps& caps) override {
+ CombineResult onCombineIfPossible(GrOp* t, SkArenaAlloc*, const GrCaps& caps) override {
// This could be much more complicated. Currently we look at cases where the new clear
// contains the old clear, or when the new clear is a subset of the old clear and is the
// same color.
diff --git a/src/gpu/ops/GrDashOp.cpp b/src/gpu/ops/GrDashOp.cpp
index 6643f1e..1707e19 100644
--- a/src/gpu/ops/GrDashOp.cpp
+++ b/src/gpu/ops/GrDashOp.cpp
@@ -642,7 +642,7 @@
flushState->executeDrawsAndUploadsForMeshDrawOp(this, chainBounds, pipeline);
}
- CombineResult onCombineIfPossible(GrOp* t, const GrCaps& caps) override {
+ CombineResult onCombineIfPossible(GrOp* t, SkArenaAlloc*, const GrCaps& caps) override {
DashOp* that = t->cast<DashOp>();
if (fProcessorSet != that->fProcessorSet) {
return CombineResult::kCannotCombine;
diff --git a/src/gpu/ops/GrDefaultPathRenderer.cpp b/src/gpu/ops/GrDefaultPathRenderer.cpp
index e860335..8f86c6a 100644
--- a/src/gpu/ops/GrDefaultPathRenderer.cpp
+++ b/src/gpu/ops/GrDefaultPathRenderer.cpp
@@ -450,7 +450,7 @@
flushState->executeDrawsAndUploadsForMeshDrawOp(this, chainBounds, pipeline);
}
- CombineResult onCombineIfPossible(GrOp* t, const GrCaps& caps) override {
+ CombineResult onCombineIfPossible(GrOp* t, SkArenaAlloc*, const GrCaps& caps) override {
DefaultPathOp* that = t->cast<DefaultPathOp>();
if (!fHelper.isCompatible(that->fHelper, caps, this->bounds(), that->bounds())) {
return CombineResult::kCannotCombine;
diff --git a/src/gpu/ops/GrDrawAtlasOp.cpp b/src/gpu/ops/GrDrawAtlasOp.cpp
index 8ffe0d7..2d0f812 100644
--- a/src/gpu/ops/GrDrawAtlasOp.cpp
+++ b/src/gpu/ops/GrDrawAtlasOp.cpp
@@ -56,7 +56,7 @@
bool hasColors() const { return fHasColors; }
int quadCount() const { return fQuadCount; }
- CombineResult onCombineIfPossible(GrOp* t, const GrCaps&) override;
+ CombineResult onCombineIfPossible(GrOp* t, SkArenaAlloc*, const GrCaps&) override;
struct Geometry {
SkPMColor4f fColor;
@@ -221,7 +221,7 @@
flushState->executeDrawsAndUploadsForMeshDrawOp(this, chainBounds, pipeline);
}
-GrOp::CombineResult DrawAtlasOp::onCombineIfPossible(GrOp* t, const GrCaps& caps) {
+GrOp::CombineResult DrawAtlasOp::onCombineIfPossible(GrOp* t, SkArenaAlloc*, const GrCaps& caps) {
DrawAtlasOp* that = t->cast<DrawAtlasOp>();
if (!fHelper.isCompatible(that->fHelper, caps, this->bounds(), that->bounds())) {
diff --git a/src/gpu/ops/GrDrawVerticesOp.cpp b/src/gpu/ops/GrDrawVerticesOp.cpp
index f51307c..d3abf61 100644
--- a/src/gpu/ops/GrDrawVerticesOp.cpp
+++ b/src/gpu/ops/GrDrawVerticesOp.cpp
@@ -78,7 +78,7 @@
GrPrimitiveType::kPoints == fPrimitiveType;
}
- CombineResult onCombineIfPossible(GrOp* t, const GrCaps&) override;
+ CombineResult onCombineIfPossible(GrOp* t, SkArenaAlloc*, const GrCaps&) override;
struct Mesh {
SkPMColor4f fColor; // Used if this->hasPerVertexColors() is false.
@@ -519,7 +519,8 @@
flushState->executeDrawsAndUploadsForMeshDrawOp(this, chainBounds, pipeline);
}
-GrOp::CombineResult DrawVerticesOp::onCombineIfPossible(GrOp* t, const GrCaps& caps) {
+GrOp::CombineResult DrawVerticesOp::onCombineIfPossible(GrOp* t, SkArenaAlloc*,
+ const GrCaps& caps) {
DrawVerticesOp* that = t->cast<DrawVerticesOp>();
if (!fHelper.isCompatible(that->fHelper, caps, this->bounds(), that->bounds())) {
diff --git a/src/gpu/ops/GrDrawableOp.h b/src/gpu/ops/GrDrawableOp.h
index b5b71a7..5194664 100644
--- a/src/gpu/ops/GrDrawableOp.h
+++ b/src/gpu/ops/GrDrawableOp.h
@@ -37,7 +37,7 @@
GrDrawableOp(std::unique_ptr<SkDrawable::GpuDrawHandler>, const SkRect& bounds);
- CombineResult onCombineIfPossible(GrOp* that, const GrCaps& caps) override {
+ CombineResult onCombineIfPossible(GrOp* that, SkArenaAlloc*, const GrCaps& caps) override {
return CombineResult::kCannotCombine;
}
void onPrepare(GrOpFlushState*) override {}
diff --git a/src/gpu/ops/GrFillRRectOp.cpp b/src/gpu/ops/GrFillRRectOp.cpp
index 099f4cf..443adf6 100644
--- a/src/gpu/ops/GrFillRRectOp.cpp
+++ b/src/gpu/ops/GrFillRRectOp.cpp
@@ -157,7 +157,7 @@
return analysis;
}
-GrDrawOp::CombineResult GrFillRRectOp::onCombineIfPossible(GrOp* op, const GrCaps&) {
+GrDrawOp::CombineResult GrFillRRectOp::onCombineIfPossible(GrOp* op, SkArenaAlloc*, const GrCaps&) {
const auto& that = *op->cast<GrFillRRectOp>();
if (fFlags != that.fFlags || fProcessors != that.fProcessors ||
fInstanceData.count() > std::numeric_limits<int>::max() - that.fInstanceData.count()) {
diff --git a/src/gpu/ops/GrFillRRectOp.h b/src/gpu/ops/GrFillRRectOp.h
index c6ad1e2..4490059 100644
--- a/src/gpu/ops/GrFillRRectOp.h
+++ b/src/gpu/ops/GrFillRRectOp.h
@@ -29,7 +29,7 @@
}
GrProcessorSet::Analysis finalize(const GrCaps&, const GrAppliedClip*,
bool hasMixedSampledCoverage, GrClampType) final;
- CombineResult onCombineIfPossible(GrOp*, const GrCaps&) final;
+ CombineResult onCombineIfPossible(GrOp*, SkArenaAlloc*, const GrCaps&) final;
void visitProxies(const VisitProxyFunc& fn) const override {
if (fProgramInfo) {
fProgramInfo->visitProxies(fn);
diff --git a/src/gpu/ops/GrFillRectOp.cpp b/src/gpu/ops/GrFillRectOp.cpp
index e2e490b..68c932f 100644
--- a/src/gpu/ops/GrFillRectOp.cpp
+++ b/src/gpu/ops/GrFillRectOp.cpp
@@ -288,7 +288,7 @@
flushState->executeDrawsAndUploadsForMeshDrawOp(this, chainBounds, pipeline);
}
- CombineResult onCombineIfPossible(GrOp* t, const GrCaps& caps) override {
+ CombineResult onCombineIfPossible(GrOp* t, SkArenaAlloc*, const GrCaps& caps) override {
TRACE_EVENT0("skia.gpu", TRACE_FUNC);
const auto* that = t->cast<FillRectOp>();
diff --git a/src/gpu/ops/GrLatticeOp.cpp b/src/gpu/ops/GrLatticeOp.cpp
index 3e4733f..e26a847 100644
--- a/src/gpu/ops/GrLatticeOp.cpp
+++ b/src/gpu/ops/GrLatticeOp.cpp
@@ -297,7 +297,7 @@
flushState->executeDrawsAndUploadsForMeshDrawOp(this, chainBounds, pipeline);
}
- CombineResult onCombineIfPossible(GrOp* t, const GrCaps& caps) override {
+ CombineResult onCombineIfPossible(GrOp* t, SkArenaAlloc*, const GrCaps& caps) override {
NonAALatticeOp* that = t->cast<NonAALatticeOp>();
if (fView != that->fView) {
return CombineResult::kCannotCombine;
diff --git a/src/gpu/ops/GrOp.cpp b/src/gpu/ops/GrOp.cpp
index 30e2e44..40bc792 100644
--- a/src/gpu/ops/GrOp.cpp
+++ b/src/gpu/ops/GrOp.cpp
@@ -30,12 +30,12 @@
SkDEBUGCODE(fBoundsFlags = kUninitialized_BoundsFlag);
}
-GrOp::CombineResult GrOp::combineIfPossible(GrOp* that, const GrCaps& caps) {
+GrOp::CombineResult GrOp::combineIfPossible(GrOp* that, SkArenaAlloc* arena, const GrCaps& caps) {
SkASSERT(this != that);
if (this->classID() != that->classID()) {
return CombineResult::kCannotCombine;
}
- auto result = this->onCombineIfPossible(that, caps);
+ auto result = this->onCombineIfPossible(that, arena, caps);
if (result == CombineResult::kMerged) {
this->joinBounds(*that);
}
diff --git a/src/gpu/ops/GrOp.h b/src/gpu/ops/GrOp.h
index 2280f40..cd61968 100644
--- a/src/gpu/ops/GrOp.h
+++ b/src/gpu/ops/GrOp.h
@@ -95,7 +95,8 @@
kCannotCombine
};
- CombineResult combineIfPossible(GrOp* that, const GrCaps& caps);
+ // The arena is the same record time allocator available when the op was created.
+ CombineResult combineIfPossible(GrOp* that, SkArenaAlloc* arena, const GrCaps& caps);
const SkRect& bounds() const {
SkASSERT(kUninitialized_BoundsFlag != fBoundsFlags);
@@ -288,7 +289,7 @@
return fBounds.joinPossiblyEmptyRect(that.fBounds);
}
- virtual CombineResult onCombineIfPossible(GrOp*, const GrCaps&) {
+ virtual CombineResult onCombineIfPossible(GrOp*, SkArenaAlloc*, const GrCaps&) {
return CombineResult::kCannotCombine;
}
diff --git a/src/gpu/ops/GrOvalOpFactory.cpp b/src/gpu/ops/GrOvalOpFactory.cpp
index 4021f3e..d73b06d 100644
--- a/src/gpu/ops/GrOvalOpFactory.cpp
+++ b/src/gpu/ops/GrOvalOpFactory.cpp
@@ -1409,7 +1409,7 @@
flushState->executeDrawsAndUploadsForMeshDrawOp(this, chainBounds, pipeline);
}
- CombineResult onCombineIfPossible(GrOp* t, const GrCaps& caps) override {
+ CombineResult onCombineIfPossible(GrOp* t, SkArenaAlloc*, const GrCaps& caps) override {
CircleOp* that = t->cast<CircleOp>();
// can only represent 65535 unique vertices with 16-bit indices
@@ -1704,7 +1704,7 @@
flushState->executeDrawsAndUploadsForMeshDrawOp(this, chainBounds, pipeline);
}
- CombineResult onCombineIfPossible(GrOp* t, const GrCaps& caps) override {
+ CombineResult onCombineIfPossible(GrOp* t, SkArenaAlloc*, const GrCaps& caps) override {
ButtCapDashedCircleOp* that = t->cast<ButtCapDashedCircleOp>();
// can only represent 65535 unique vertices with 16-bit indices
@@ -1963,7 +1963,7 @@
flushState->executeDrawsAndUploadsForMeshDrawOp(this, chainBounds, pipeline);
}
- CombineResult onCombineIfPossible(GrOp* t, const GrCaps& caps) override {
+ CombineResult onCombineIfPossible(GrOp* t, SkArenaAlloc*, const GrCaps& caps) override {
EllipseOp* that = t->cast<EllipseOp>();
if (!fHelper.isCompatible(that->fHelper, caps, this->bounds(), that->bounds())) {
@@ -2204,7 +2204,7 @@
flushState->executeDrawsAndUploadsForMeshDrawOp(this, chainBounds, pipeline);
}
- CombineResult onCombineIfPossible(GrOp* t, const GrCaps& caps) override {
+ CombineResult onCombineIfPossible(GrOp* t, SkArenaAlloc*, const GrCaps& caps) override {
DIEllipseOp* that = t->cast<DIEllipseOp>();
if (!fHelper.isCompatible(that->fHelper, caps, this->bounds(), that->bounds())) {
return CombineResult::kCannotCombine;
@@ -2639,7 +2639,7 @@
flushState->executeDrawsAndUploadsForMeshDrawOp(this, chainBounds, pipeline);
}
- CombineResult onCombineIfPossible(GrOp* t, const GrCaps& caps) override {
+ CombineResult onCombineIfPossible(GrOp* t, SkArenaAlloc*, const GrCaps& caps) override {
CircularRRectOp* that = t->cast<CircularRRectOp>();
// can only represent 65535 unique vertices with 16-bit indices
@@ -2925,7 +2925,7 @@
flushState->executeDrawsAndUploadsForMeshDrawOp(this, chainBounds, pipeline);
}
- CombineResult onCombineIfPossible(GrOp* t, const GrCaps& caps) override {
+ CombineResult onCombineIfPossible(GrOp* t, SkArenaAlloc*, const GrCaps& caps) override {
EllipticalRRectOp* that = t->cast<EllipticalRRectOp>();
if (!fHelper.isCompatible(that->fHelper, caps, this->bounds(), that->bounds())) {
diff --git a/src/gpu/ops/GrRegionOp.cpp b/src/gpu/ops/GrRegionOp.cpp
index e12a865..80c4dfd 100644
--- a/src/gpu/ops/GrRegionOp.cpp
+++ b/src/gpu/ops/GrRegionOp.cpp
@@ -141,7 +141,7 @@
flushState->executeDrawsAndUploadsForMeshDrawOp(this, chainBounds, pipeline);
}
- CombineResult onCombineIfPossible(GrOp* t, const GrCaps& caps) override {
+ CombineResult onCombineIfPossible(GrOp* t, SkArenaAlloc*, const GrCaps& caps) override {
RegionOp* that = t->cast<RegionOp>();
if (!fHelper.isCompatible(that->fHelper, caps, this->bounds(), that->bounds())) {
return CombineResult::kCannotCombine;
diff --git a/src/gpu/ops/GrShadowRRectOp.cpp b/src/gpu/ops/GrShadowRRectOp.cpp
index a9e7b72..1e07a81 100644
--- a/src/gpu/ops/GrShadowRRectOp.cpp
+++ b/src/gpu/ops/GrShadowRRectOp.cpp
@@ -610,7 +610,7 @@
flushState->executeDrawsAndUploadsForMeshDrawOp(this, chainBounds, pipeline);
}
- CombineResult onCombineIfPossible(GrOp* t, const GrCaps& caps) override {
+ CombineResult onCombineIfPossible(GrOp* t, SkArenaAlloc*, const GrCaps& caps) override {
ShadowCircularRRectOp* that = t->cast<ShadowCircularRRectOp>();
fGeoData.push_back_n(that->fGeoData.count(), that->fGeoData.begin());
fVertCount += that->fVertCount;
diff --git a/src/gpu/ops/GrSmallPathRenderer.cpp b/src/gpu/ops/GrSmallPathRenderer.cpp
index 1259a93..f5ca616 100644
--- a/src/gpu/ops/GrSmallPathRenderer.cpp
+++ b/src/gpu/ops/GrSmallPathRenderer.cpp
@@ -823,7 +823,7 @@
const SkPMColor4f& color() const { return fShapes[0].fColor; }
bool usesDistanceField() const { return fUsesDistanceField; }
- CombineResult onCombineIfPossible(GrOp* t, const GrCaps& caps) override {
+ CombineResult onCombineIfPossible(GrOp* t, SkArenaAlloc*, const GrCaps& caps) override {
SmallPathOp* that = t->cast<SmallPathOp>();
if (!fHelper.isCompatible(that->fHelper, caps, this->bounds(), that->bounds())) {
return CombineResult::kCannotCombine;
diff --git a/src/gpu/ops/GrStrokeRectOp.cpp b/src/gpu/ops/GrStrokeRectOp.cpp
index 045f69c..4a6c65b 100644
--- a/src/gpu/ops/GrStrokeRectOp.cpp
+++ b/src/gpu/ops/GrStrokeRectOp.cpp
@@ -444,7 +444,7 @@
const SkMatrix& viewMatrix() const { return fViewMatrix; }
bool miterStroke() const { return fMiterStroke; }
- CombineResult onCombineIfPossible(GrOp* t, const GrCaps&) override;
+ CombineResult onCombineIfPossible(GrOp* t, SkArenaAlloc*, const GrCaps&) override;
void generateAAStrokeRectGeometry(GrVertexWriter& vertices,
const SkPMColor4f& color,
@@ -625,7 +625,8 @@
}
}
-GrOp::CombineResult AAStrokeRectOp::onCombineIfPossible(GrOp* t, const GrCaps& caps) {
+GrOp::CombineResult AAStrokeRectOp::onCombineIfPossible(GrOp* t, SkArenaAlloc*,
+ const GrCaps& caps) {
AAStrokeRectOp* that = t->cast<AAStrokeRectOp>();
if (!fHelper.isCompatible(that->fHelper, caps, this->bounds(), that->bounds())) {
diff --git a/src/gpu/ops/GrTextureOp.cpp b/src/gpu/ops/GrTextureOp.cpp
index 039fe22..87ad089 100644
--- a/src/gpu/ops/GrTextureOp.cpp
+++ b/src/gpu/ops/GrTextureOp.cpp
@@ -930,7 +930,7 @@
flushState->executeDrawsAndUploadsForMeshDrawOp(this, chainBounds, pipeline);
}
- CombineResult onCombineIfPossible(GrOp* t, const GrCaps& caps) override {
+ CombineResult onCombineIfPossible(GrOp* t, SkArenaAlloc*, const GrCaps& caps) override {
TRACE_EVENT0("skia.gpu", TRACE_FUNC);
const auto* that = t->cast<TextureOp>();
diff --git a/tests/OpChainTest.cpp b/tests/OpChainTest.cpp
index 698fa35..3571c86 100644
--- a/tests/OpChainTest.cpp
+++ b/tests/OpChainTest.cpp
@@ -130,7 +130,10 @@
}
}
- CombineResult onCombineIfPossible(GrOp* t, const GrCaps&) override {
+ CombineResult onCombineIfPossible(GrOp* t, SkArenaAlloc* arena, const GrCaps&) override {
+ // This op doesn't use the record time allocator, but make sure the GrOpsTask is sending it
+ SkASSERT(arena);
+ (void) arena;
auto that = t->cast<TestOp>();
int v0 = fValueRanges[0].fValue;
int v1 = that->fValueRanges[0].fValue;
@@ -211,6 +214,7 @@
context->priv().resourceProvider(),
&tracker);
GrOpsTask opsTask(context->priv().opMemoryPool(),
+ context->priv().recordTimeAllocator(),
GrSurfaceProxyView(proxy, kOrigin, outSwizzle),
context->priv().auditTrail());
// This assumes the particular values of kRanges.