diff options
author | reed <reed@google.com> | 2015-11-19 10:31:08 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-11-19 10:31:08 -0800 |
commit | f38b0d86b888692f7d703916114781be43249600 (patch) | |
tree | 21129c8bbbfa71ca9a3db26eb127a0d6787aa3c9 /src | |
parent | 1d02a60fec20018c987ef827abbd5e77562c3a67 (diff) |
add SkRecordOptimize2 and an experimental API for more aggressive opts
BUG=skia:
Review URL: https://codereview.chromium.org/1462973002
Diffstat (limited to 'src')
-rw-r--r-- | src/core/SkRecordOpts.cpp | 77 | ||||
-rw-r--r-- | src/core/SkRecordOpts.h | 3 |
2 files changed, 67 insertions, 13 deletions
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<Is<SetMatrix>, + Greedy<Is<NoOp>>, + Is<SetMatrix> > + Match; + + bool onMatch(SkRecord* record, Match* pattern, int begin, int end) { + record->replace<NoOp>(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<Is<SetMatrix>, + Greedy<Is<NoOp>>, + Is<SetMatrix> > + Pattern; + + bool onMatch(SkRecord* record, Pattern* pattern, int begin, int end) { + record->replace<NoOp>(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<Is<Save>, @@ -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 |