From be42c994b41a6d99b4bbf370aa1634350c773219 Mon Sep 17 00:00:00 2001 From: herb Date: Tue, 15 Nov 2016 14:07:13 -0800 Subject: Move the matrix stage of SkLinearBitmapPipeline over to using SkSmallAllocator. The rest of the stages will follow. When all stages are completed, this should significantly reduce stack use in the typical case. This a step in removing the baroque stage system and moving towards a SkRasterPipeline stage system. BUG=skia: GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2484273002 Review-Url: https://codereview.chromium.org/2484273002 --- src/core/SkLinearBitmapPipeline.cpp | 95 ++++++++++++++++++++++--------------- 1 file changed, 57 insertions(+), 38 deletions(-) (limited to 'src/core/SkLinearBitmapPipeline.cpp') diff --git a/src/core/SkLinearBitmapPipeline.cpp b/src/core/SkLinearBitmapPipeline.cpp index d6634bc711..ca42e0240d 100644 --- a/src/core/SkLinearBitmapPipeline.cpp +++ b/src/core/SkLinearBitmapPipeline.cpp @@ -88,9 +88,9 @@ public: : fNext{next} , fStrategy{std::forward(args)...}{ } - MatrixStage(Next* next, const MatrixStage& stage) + MatrixStage(Next* next, MatrixStage* stage) : fNext{next} - , fStrategy{stage.fStrategy} { } + , fStrategy{stage->fStrategy} { } void SK_VECTORCALL pointListFew(int n, Sk4s xs, Sk4s ys) override { fStrategy.processPoints(&xs, &ys); @@ -128,39 +128,6 @@ template using PerspectiveMatrix = MatrixStage; -static SkLinearBitmapPipeline::PointProcessorInterface* choose_matrix( - SkLinearBitmapPipeline::PointProcessorInterface* next, - const SkMatrix& inverse, - SkLinearBitmapPipeline::MatrixStage* matrixProc) { - if (inverse.hasPerspective()) { - matrixProc->initStage>( - next, - SkVector{inverse.getTranslateX(), inverse.getTranslateY()}, - SkVector{inverse.getScaleX(), inverse.getScaleY()}, - SkVector{inverse.getSkewX(), inverse.getSkewY()}, - SkVector{inverse.getPerspX(), inverse.getPerspY()}, - inverse.get(SkMatrix::kMPersp2)); - } else if (inverse.getSkewX() != 0.0f || inverse.getSkewY() != 0.0f) { - matrixProc->initStage>( - next, - SkVector{inverse.getTranslateX(), inverse.getTranslateY()}, - SkVector{inverse.getScaleX(), inverse.getScaleY()}, - SkVector{inverse.getSkewX(), inverse.getSkewY()}); - } else if (inverse.getScaleX() != 1.0f || inverse.getScaleY() != 1.0f) { - matrixProc->initStage>( - next, - SkVector{inverse.getTranslateX(), inverse.getTranslateY()}, - SkVector{inverse.getScaleX(), inverse.getScaleY()}); - } else if (inverse.getTranslateX() != 0.0f || inverse.getTranslateY() != 0.0f) { - matrixProc->initStage>( - next, - SkVector{inverse.getTranslateX(), inverse.getTranslateY()}); - } else { - return next; - } - return matrixProc->get(); -} - //////////////////////////////////////////////////////////////////////////////////////////////////// // Tile Stage @@ -658,7 +625,7 @@ SkLinearBitmapPipeline::SkLinearBitmapPipeline( srcPixmap, paintColor, &fSampleStage, &fAccessor); auto tilerStage = choose_tiler(samplerStage, dimensions, xTile, yTile, filterQuality, dx, &fTileStage); - fFirstStage = choose_matrix(tilerStage, adjustedInverse, &fMatrixStage); + fFirstStage = ChooseMatrix(tilerStage, adjustedInverse); fLastStage = blenderStage; } @@ -720,8 +687,7 @@ SkLinearBitmapPipeline::SkLinearBitmapPipeline( auto sampleStage = fSampleStage.get(); auto tilerStage = pipeline.fTileStage.cloneStageTo(sampleStage, &fTileStage); tilerStage = (tilerStage != nullptr) ? tilerStage : sampleStage; - auto matrixStage = pipeline.fMatrixStage.cloneStageTo(tilerStage, &fMatrixStage); - matrixStage = (matrixStage != nullptr) ? matrixStage : tilerStage; + auto matrixStage = pipeline.fMatrixStageCloner(tilerStage, &fMemory); fFirstStage = matrixStage; } @@ -740,3 +706,56 @@ void SkLinearBitmapPipeline::blitSpan(int x, int y, void* dst, int count) { // first pixel to the center of the last pixel. This implies that length is count-1. fFirstStage->pointSpan(Span{{x + 0.5f, y + 0.5f}, count - 1.0f, count}); } + +SkLinearBitmapPipeline::PointProcessorInterface* +SkLinearBitmapPipeline::ChooseMatrix(PointProcessorInterface* next, const SkMatrix& inverse) { + if (inverse.hasPerspective()) { + auto matrixStage = fMemory.createT>( + next, + SkVector{inverse.getTranslateX(), inverse.getTranslateY()}, + SkVector{inverse.getScaleX(), inverse.getScaleY()}, + SkVector{inverse.getSkewX(), inverse.getSkewY()}, + SkVector{inverse.getPerspX(), inverse.getPerspY()}, + inverse.get(SkMatrix::kMPersp2)); + fMatrixStageCloner = + [matrixStage](PointProcessorInterface* cloneNext, MemoryAllocator* memory) { + return memory->createT>(cloneNext, matrixStage); + }; + return matrixStage; + } else if (inverse.getSkewX() != 0.0f || inverse.getSkewY() != 0.0f) { + auto matrixStage = fMemory.createT>( + next, + SkVector{inverse.getTranslateX(), inverse.getTranslateY()}, + SkVector{inverse.getScaleX(), inverse.getScaleY()}, + SkVector{inverse.getSkewX(), inverse.getSkewY()}); + fMatrixStageCloner = + [matrixStage](PointProcessorInterface* cloneNext, MemoryAllocator* memory) { + return memory->createT>(cloneNext, matrixStage); + }; + return matrixStage; + } else if (inverse.getScaleX() != 1.0f || inverse.getScaleY() != 1.0f) { + auto matrixStage = fMemory.createT>( + next, + SkVector{inverse.getTranslateX(), inverse.getTranslateY()}, + SkVector{inverse.getScaleX(), inverse.getScaleY()}); + fMatrixStageCloner = + [matrixStage](PointProcessorInterface* cloneNext, MemoryAllocator* memory) { + return memory->createT>(cloneNext, matrixStage); + }; + return matrixStage; + } else if (inverse.getTranslateX() != 0.0f || inverse.getTranslateY() != 0.0f) { + auto matrixStage = fMemory.createT>( + next, + SkVector{inverse.getTranslateX(), inverse.getTranslateY()}); + fMatrixStageCloner = + [matrixStage](PointProcessorInterface* cloneNext, MemoryAllocator* memory) { + return memory->createT>(cloneNext, matrixStage); + }; + return matrixStage; + } else { + fMatrixStageCloner = [](PointProcessorInterface* cloneNext, MemoryAllocator* memory) { + return cloneNext; + }; + return next; + } +} -- cgit v1.2.3