From f38b0d86b888692f7d703916114781be43249600 Mon Sep 17 00:00:00 2001 From: reed Date: Thu, 19 Nov 2015 10:31:08 -0800 Subject: add SkRecordOptimize2 and an experimental API for more aggressive opts BUG=skia: Review URL: https://codereview.chromium.org/1462973002 --- src/core/SkRecordOpts.cpp | 77 +++++++++++++++++++++++++++++++++++++++-------- src/core/SkRecordOpts.h | 3 ++ 2 files changed, 67 insertions(+), 13 deletions(-) (limited to 'src') diff --git a/src/core/SkRecordOpts.cpp b/src/core/SkRecordOpts.cpp index d363712f3a..d1520adf56 100644 --- a/src/core/SkRecordOpts.cpp +++ b/src/core/SkRecordOpts.cpp @@ -13,19 +13,6 @@ using namespace SkRecords; -void SkRecordOptimize(SkRecord* record) { - // This might be useful as a first pass in the future if we want to weed - // out junk for other optimization passes. Right now, nothing needs it, - // and the bounding box hierarchy will do the work of skipping no-op - // Save-NoDraw-Restore sequences better than we can here. - //SkRecordNoopSaveRestores(record); - - SkRecordNoopSaveLayerDrawRestores(record); - SkRecordMergeSvgOpacityAndFilterLayers(record); - - record->defrag(); -} - // Most of the optimizations in this file are pattern-based. These are all defined as structs with: // - a Match typedef // - a bool onMatch(SkRceord*, Match*, int begin, int end) method, @@ -46,6 +33,45 @@ static bool apply(Pass* pass, SkRecord* record) { return changed; } +/////////////////////////////////////////////////////////////////////////////////////////////////// + +static void multiple_set_matrices(SkRecord* record) { + struct { + typedef Pattern, + Greedy>, + Is > + Match; + + bool onMatch(SkRecord* record, Match* pattern, int begin, int end) { + record->replace(begin); // first SetMatrix + return true; + } + } pass; + while (apply(&pass, record)); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// + +#if 0 // experimental, but needs knowledge of previous matrix to operate correctly +static void apply_matrix_to_draw_params(SkRecord* record) { + struct { + typedef Pattern, + Greedy>, + Is > + Pattern; + + bool onMatch(SkRecord* record, Pattern* pattern, int begin, int end) { + record->replace(begin); // first SetMatrix + return true; + } + } pass; + // No need to loop, as we never "open up" opportunities for more of this type of optimization. + apply(&pass, record); +} +#endif + +/////////////////////////////////////////////////////////////////////////////////////////////////// + // Turns the logical NoOp Save and Restore in Save-Draw*-Restore patterns into actual NoOps. struct SaveOnlyDrawsRestoreNooper { typedef Pattern, @@ -232,3 +258,28 @@ void SkRecordMergeSvgOpacityAndFilterLayers(SkRecord* record) { SvgOpacityAndFilterLayerMergePass pass; apply(&pass, record); } + +/////////////////////////////////////////////////////////////////////////////////////////////////// + +void SkRecordOptimize(SkRecord* record) { + // This might be useful as a first pass in the future if we want to weed + // out junk for other optimization passes. Right now, nothing needs it, + // and the bounding box hierarchy will do the work of skipping no-op + // Save-NoDraw-Restore sequences better than we can here. + //SkRecordNoopSaveRestores(record); + + SkRecordNoopSaveLayerDrawRestores(record); + SkRecordMergeSvgOpacityAndFilterLayers(record); + + record->defrag(); +} + +void SkRecordOptimize2(SkRecord* record) { + multiple_set_matrices(record); + SkRecordNoopSaveRestores(record); + SkRecordNoopSaveLayerDrawRestores(record); + SkRecordMergeSvgOpacityAndFilterLayers(record); + + record->defrag(); +} + diff --git a/src/core/SkRecordOpts.h b/src/core/SkRecordOpts.h index a560d00661..d6531b5226 100644 --- a/src/core/SkRecordOpts.h +++ b/src/core/SkRecordOpts.h @@ -24,4 +24,7 @@ void SkRecordNoopSaveLayerDrawRestores(SkRecord*); // the alpha of the first SaveLayer to the second SaveLayer. void SkRecordMergeSvgOpacityAndFilterLayers(SkRecord*); +// Experimental optimizers +void SkRecordOptimize2(SkRecord*); + #endif//SkRecordOpts_DEFINED -- cgit v1.2.3