From 9fff11133d1890a2733e8a61ba976492fe800c99 Mon Sep 17 00:00:00 2001 From: Mike Klein Date: Wed, 24 May 2017 11:37:52 -0400 Subject: [PATCH] better extend: alloc once, no recursion Change-Id: I6a8cee08248462e4e17196028758dd8d44093b28 Reviewed-on: https://skia-review.googlesource.com/17831 Reviewed-by: Herb Derby Commit-Queue: Mike Klein --- src/core/SkRasterPipeline.cpp | 26 +++++++++++++++++++------- src/core/SkRasterPipeline.h | 2 +- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/core/SkRasterPipeline.cpp b/src/core/SkRasterPipeline.cpp index 0f4c1f4..dc25e5a 100644 --- a/src/core/SkRasterPipeline.cpp +++ b/src/core/SkRasterPipeline.cpp @@ -12,6 +12,7 @@ SkRasterPipeline::SkRasterPipeline(SkArenaAlloc* alloc) : fAlloc(alloc) { } void SkRasterPipeline::reset() { fStages = nullptr; + fNumStages = 0; fSlotsNeeded = 1; // We always need one extra slot for just_return(). } @@ -21,22 +22,33 @@ void SkRasterPipeline::append(StockStage stage, void* ctx) { } void SkRasterPipeline::unchecked_append(StockStage stage, void* ctx) { fStages = fAlloc->make( StageList{fStages, stage, ctx} ); + fNumStages += 1; fSlotsNeeded += ctx ? 2 : 1; } void SkRasterPipeline::extend(const SkRasterPipeline& src) { - this->extend(src.fStages); -} -void SkRasterPipeline::extend(const StageList* stages) { - if (!stages) { + if (src.empty()) { return; } - this->extend(stages->prev); - this->unchecked_append(stages->stage, stages->ctx); + auto stages = fAlloc->makeArrayDefault(src.fNumStages); + + int n = src.fNumStages; + const StageList* st = src.fStages; + while (n --> 1) { + stages[n] = *st; + stages[n].prev = &stages[n-1]; + st = st->prev; + } + stages[0] = *st; + stages[0].prev = fStages; + + fStages = &stages[src.fNumStages - 1]; + fNumStages += src.fNumStages; + fSlotsNeeded += src.fSlotsNeeded - 1; // Don't double count just_returns(). } void SkRasterPipeline::dump() const { - SkDebugf("SkRasterPipeline, (in reverse)\n"); + SkDebugf("SkRasterPipeline, %d stages (in reverse)\n", fNumStages); for (auto st = fStages; st; st = st->prev) { const char* name = ""; switch (st->stage) { diff --git a/src/core/SkRasterPipeline.h b/src/core/SkRasterPipeline.h index 117ecf3..da38102 100644 --- a/src/core/SkRasterPipeline.h +++ b/src/core/SkRasterPipeline.h @@ -156,10 +156,10 @@ private: static void BuildPipeline(const StageList*, const SkJumper_Engine&, void**); void unchecked_append(StockStage, void*); - void extend(const StageList*); SkArenaAlloc* fAlloc; StageList* fStages; + int fNumStages; int fSlotsNeeded; }; -- 2.7.4