From 1e78fc4ed2a1ef9f049311696ebd0a26e1c3782d Mon Sep 17 00:00:00 2001 From: mtklein Date: Tue, 16 Sep 2014 11:11:20 -0700 Subject: [PATCH] Turn disable or delete optimizations that don't have any effect. Recording gets a ~5% speedup. BUG=skia: R=robertphillips@google.com, mtklein@google.com Author: mtklein@chromium.org Review URL: https://codereview.chromium.org/577673003 --- src/core/SkRecordOpts.cpp | 52 +++++---------------------------------- src/core/SkRecordOpts.h | 3 --- tests/RecordOptsTest.cpp | 24 ------------------ 3 files changed, 6 insertions(+), 73 deletions(-) diff --git a/src/core/SkRecordOpts.cpp b/src/core/SkRecordOpts.cpp index 47718e102..7c24a08c8 100644 --- a/src/core/SkRecordOpts.cpp +++ b/src/core/SkRecordOpts.cpp @@ -14,9 +14,13 @@ 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); - SkRecordNoopSaveRestores(record); - SkRecordReduceDrawPosTextStrength(record); } // Most of the optimizations in this file are pattern-based. These are all defined as structs with: @@ -147,47 +151,3 @@ void SkRecordNoopSaveLayerDrawRestores(SkRecord* record) { apply(&pass, record); } - -// Replaces DrawPosText with DrawPosTextH when all Y coordinates are equal. -struct StrengthReducer { - typedef Pattern1 > Pattern; - - bool onMatch(SkRecord* record, Pattern* pattern, unsigned begin, unsigned end) { - SkASSERT(end == begin + 1); - DrawPosText* draw = pattern->first(); - - const unsigned points = draw->paint.countText(draw->text, draw->byteLength); - if (points == 0) { - return false; // No point (ha!). - } - - const SkScalar firstY = draw->pos[0].fY; - for (unsigned i = 1; i < points; i++) { - if (draw->pos[i].fY != firstY) { - return false; // Needs full power of DrawPosText. - } - } - // All ys are the same. We can replace DrawPosText with DrawPosTextH. - - // draw->pos is points SkPoints, [(x,y),(x,y),(x,y),(x,y), ... ]. - // We're going to squint and look at that as 2*points SkScalars, [x,y,x,y,x,y,x,y, ...]. - // Then we'll rearrange things so all the xs are in order up front, clobbering the ys. - SK_COMPILE_ASSERT(sizeof(SkPoint) == 2 * sizeof(SkScalar), SquintingIsNotSafe); - SkScalar* scalars = &draw->pos[0].fX; - for (unsigned i = 0; i < 2*points; i += 2) { - scalars[i/2] = scalars[i]; - } - - // Extend lifetime of draw to the end of the loop so we can copy its paint. - Adopted adopted(draw); - SkNEW_PLACEMENT_ARGS(record->replace(begin, adopted), - DrawPosTextH, - (draw->paint, draw->text, draw->byteLength, scalars, firstY)); - return true; - } -}; -void SkRecordReduceDrawPosTextStrength(SkRecord* record) { - StrengthReducer pass; - apply(&pass, record); -} - diff --git a/src/core/SkRecordOpts.h b/src/core/SkRecordOpts.h index da7279652..936eeffd0 100644 --- a/src/core/SkRecordOpts.h +++ b/src/core/SkRecordOpts.h @@ -20,7 +20,4 @@ void SkRecordNoopSaveRestores(SkRecord*); // draw, and no-op the SaveLayer and Restore. void SkRecordNoopSaveLayerDrawRestores(SkRecord*); -// Convert DrawPosText to DrawPosTextH when all the Y coordinates are equal. -void SkRecordReduceDrawPosTextStrength(SkRecord*); - #endif//SkRecordOpts_DEFINED diff --git a/tests/RecordOptsTest.cpp b/tests/RecordOptsTest.cpp index e17b5e6bf..c5c4471d6 100644 --- a/tests/RecordOptsTest.cpp +++ b/tests/RecordOptsTest.cpp @@ -16,30 +16,6 @@ static const int W = 1920, H = 1080; -static void draw_pos_text(SkCanvas* canvas, const char* text, bool constantY) { - const size_t len = strlen(text); - SkAutoTMalloc pos(len); - for (size_t i = 0; i < len; i++) { - pos[i].fX = (SkScalar)i; - pos[i].fY = constantY ? SK_Scalar1 : (SkScalar)i; - } - canvas->drawPosText(text, len, pos, SkPaint()); -} - -DEF_TEST(RecordOpts_StrengthReduction, r) { - SkRecord record; - SkRecorder recorder(&record, W, H); - - // We can convert a drawPosText into a drawPosTextH when all the Ys are the same. - draw_pos_text(&recorder, "This will be reduced to drawPosTextH.", true); - draw_pos_text(&recorder, "This cannot be reduced to drawPosTextH.", false); - - SkRecordReduceDrawPosTextStrength(&record); - - assert_type(r, record, 0); - assert_type(r, record, 1); -} - DEF_TEST(RecordOpts_NoopDrawSaveRestore, r) { SkRecord record; SkRecorder recorder(&record, W, H);