Index: gm/optimizations.cpp |
diff --git a/gm/optimizations.cpp b/gm/optimizations.cpp |
deleted file mode 100644 |
index 85ce3e9d945333ff4e2d7936df44787ea6a493c6..0000000000000000000000000000000000000000 |
--- a/gm/optimizations.cpp |
+++ /dev/null |
@@ -1,420 +0,0 @@ |
-/* |
- * Copyright 2013 Google Inc. |
- * |
- * Use of this source code is governed by a BSD-style license that can be |
- * found in the LICENSE file. |
- */ |
- |
-#include "gm.h" |
-#include "SkDebugCanvas.h" |
-#include "SkPictureFlat.h" |
-#include "SkPictureRecorder.h" |
- |
-#define WARN(msg) \ |
- SkDebugf("%s:%d: %s\n", __FILE__, __LINE__, msg); |
- |
-// Do the commands in 'input' match the supplied pattern? Note: this is a pretty |
-// heavy-weight operation since we are drawing the picture into a debug canvas |
-// to extract the commands. |
-static bool check_pattern(SkPicture& input, const SkTDArray<DrawType> &pattern) { |
- SkDebugCanvas debugCanvas(SkScalarCeilToInt(input.cullRect().width()), |
- SkScalarCeilToInt(input.cullRect().height())); |
- input.playback(&debugCanvas); |
- |
- if (pattern.count() != debugCanvas.getSize()) { |
- return false; |
- } |
- |
- for (int i = 0; i < pattern.count(); ++i) { |
- if (pattern[i] != debugCanvas.getDrawCommandAt(i)->getType()) { |
- return false; |
- } |
- } |
- |
- return true; |
-} |
- |
-// construct the pattern removed by the SkPictureRecord::remove_save_layer1 |
-// optimization, i.e.: |
-// SAVE_LAYER |
-// DRAW_BITMAP|DRAW_BITMAP_MATRIX|DRAW_BITMAP_NINE|DRAW_BITMAP_RECT_TO_RECT |
-// RESTORE |
-// |
-// saveLayerHasPaint - control if the saveLayer has a paint (the optimization |
-// takes a different path if this is false) |
-// dbmr2rHasPaint - control if the dbmr2r has a paint (the optimization |
-// takes a different path if this is false) |
-// colorsMatch - control if the saveLayer and dbmr2r paint colors |
-// match (the optimization will fail if they do not) |
-static SkPicture* create_save_layer_opt_1(SkTDArray<DrawType>* preOptPattern, |
- SkTDArray<DrawType>* postOptPattern, |
- const SkBitmap& checkerBoard, |
- bool saveLayerHasPaint, |
- bool dbmr2rHasPaint, |
- bool colorsMatch) { |
- // Create the pattern that should trigger the optimization |
- preOptPattern->setCount(5); |
- (*preOptPattern)[0] = SAVE; |
- (*preOptPattern)[1] = SAVE_LAYER; |
- (*preOptPattern)[2] = DRAW_BITMAP_RECT_TO_RECT; |
- (*preOptPattern)[3] = RESTORE; |
- (*preOptPattern)[4] = RESTORE; |
- |
- if (colorsMatch) { |
- // Create the pattern that should appear after the optimization |
- postOptPattern->setCount(5); |
- (*postOptPattern)[0] = SAVE; // extra save/restore added by extra draw |
- (*postOptPattern)[1] = SAVE; |
- (*postOptPattern)[2] = DRAW_BITMAP_RECT_TO_RECT; |
- (*postOptPattern)[3] = RESTORE; |
- (*postOptPattern)[4] = RESTORE; |
- } else { |
- // Create the pattern that appears if the optimization doesn't fire |
- postOptPattern->setCount(7); |
- (*postOptPattern)[0] = SAVE; // extra save/restore added by extra draw |
- (*postOptPattern)[1] = SAVE; |
- (*postOptPattern)[2] = SAVE_LAYER; |
- (*postOptPattern)[3] = DRAW_BITMAP_RECT_TO_RECT; |
- (*postOptPattern)[4] = RESTORE; |
- (*postOptPattern)[5] = RESTORE; |
- (*postOptPattern)[6] = RESTORE; |
- } |
- |
- SkPictureRecorder recorder; |
- |
- SkCanvas* canvas = recorder.DEPRECATED_beginRecording(100, 100, NULL, 0); |
- // have to disable the optimizations while generating the picture |
- recorder.internalOnly_EnableOpts(false); |
- |
- SkPaint saveLayerPaint; |
- saveLayerPaint.setColor(0xCC000000); |
- |
- // saveLayer's 'bounds' parameter must be NULL for this optimization |
- if (saveLayerHasPaint) { |
- canvas->saveLayer(NULL, &saveLayerPaint); |
- } else { |
- canvas->saveLayer(NULL, NULL); |
- } |
- |
- SkRect rect = { 10, 10, 90, 90 }; |
- |
- // The dbmr2r's paint must be opaque |
- SkPaint dbmr2rPaint; |
- if (colorsMatch) { |
- dbmr2rPaint.setColor(0xFF000000); |
- } else { |
- dbmr2rPaint.setColor(0xFFFF0000); |
- } |
- |
- if (dbmr2rHasPaint) { |
- canvas->drawBitmapRectToRect(checkerBoard, NULL, rect, &dbmr2rPaint); |
- } else { |
- canvas->drawBitmapRectToRect(checkerBoard, NULL, rect, NULL); |
- } |
- canvas->restore(); |
- |
- return recorder.endRecording(); |
-} |
- |
-// straight-ahead version that is seen in the skps |
-static SkPicture* create_save_layer_opt_1_v1(SkTDArray<DrawType>* preOptPattern, |
- SkTDArray<DrawType>* postOptPattern, |
- const SkBitmap& checkerBoard) { |
- return create_save_layer_opt_1(preOptPattern, postOptPattern, checkerBoard, |
- true, // saveLayer has a paint |
- true, // dbmr2r has a paint |
- true); // and the colors match |
-} |
- |
-// alternate version that should still succeed |
-static SkPicture* create_save_layer_opt_1_v2(SkTDArray<DrawType>* preOptPattern, |
- SkTDArray<DrawType>* postOptPattern, |
- const SkBitmap& checkerBoard) { |
- return create_save_layer_opt_1(preOptPattern, postOptPattern, checkerBoard, |
- false, // saveLayer doesn't have a paint! |
- true, // dbmr2r has a paint |
- true); // color matching not really applicable |
-} |
- |
-// alternate version that should still succeed |
-static SkPicture* create_save_layer_opt_1_v3(SkTDArray<DrawType>* preOptPattern, |
- SkTDArray<DrawType>* postOptPattern, |
- const SkBitmap& checkerBoard) { |
- return create_save_layer_opt_1(preOptPattern, postOptPattern, checkerBoard, |
- true, // saveLayer has a paint |
- false, // dbmr2r doesn't have a paint! |
- true); // color matching not really applicable |
-} |
- |
-// version in which the optimization fails b.c. the colors don't match |
-static SkPicture* create_save_layer_opt_1_v4(SkTDArray<DrawType>* preOptPattern, |
- SkTDArray<DrawType>* postOptPattern, |
- const SkBitmap& checkerBoard) { |
- return create_save_layer_opt_1(preOptPattern, postOptPattern, checkerBoard, |
- true, // saveLayer has a paint |
- true, // dbmr2r has a paint |
- false); // and the colors don't match! |
-} |
- |
-// construct the pattern removed by the SkPictureRecord::remove_save_layer2 |
-// optimization, i.e.: |
-// SAVE_LAYER (with NULL == bounds) |
-// SAVE |
-// CLIP_RECT |
-// DRAW_BITMAP|DRAW_BITMAP_MATRIX|DRAW_BITMAP_NINE|DRAW_BITMAP_RECT_TO_RECT |
-// RESTORE |
-// RESTORE |
-// |
-// saveLayerHasPaint - control if the saveLayer has a paint (the optimization |
-// takes a different path if this is false) |
-// dbmr2rHasPaint - control if the dbmr2r has a paint (the optimization |
-// takes a different path if this is false) |
-// colorsMatch - control if the saveLayer and dbmr2r paint colors |
-// match (the optimization will fail if they do not) |
-static SkPicture* create_save_layer_opt_2(SkTDArray<DrawType>* preOptPattern, |
- SkTDArray<DrawType>* postOptPattern, |
- const SkBitmap& checkerBoard, |
- bool saveLayerHasPaint, |
- bool dbmr2rHasPaint, |
- bool colorsMatch) { |
- // Create the pattern that should trigger the optimization |
- preOptPattern->setCount(8); |
- (*preOptPattern)[0] = SAVE; |
- (*preOptPattern)[1] = SAVE_LAYER; |
- (*preOptPattern)[2] = SAVE; |
- (*preOptPattern)[3] = CLIP_RECT; |
- (*preOptPattern)[4] = DRAW_BITMAP_RECT_TO_RECT; |
- (*preOptPattern)[5] = RESTORE; |
- (*preOptPattern)[6] = RESTORE; |
- (*preOptPattern)[7] = RESTORE; |
- |
- if (colorsMatch) { |
- // Create the pattern that should appear after the optimization |
- postOptPattern->setCount(8); |
- (*postOptPattern)[0] = SAVE; // extra save/restore added by extra draw |
- (*postOptPattern)[1] = SAVE; |
- (*postOptPattern)[2] = SAVE; |
- (*postOptPattern)[3] = CLIP_RECT; |
- (*postOptPattern)[4] = DRAW_BITMAP_RECT_TO_RECT; |
- (*postOptPattern)[5] = RESTORE; |
- (*postOptPattern)[6] = RESTORE; |
- (*postOptPattern)[7] = RESTORE; |
- } else { |
- // Create the pattern that appears if the optimization doesn't fire |
- postOptPattern->setCount(10); |
- (*postOptPattern)[0] = SAVE; // extra save/restore added by extra draw |
- (*postOptPattern)[1] = SAVE; |
- (*postOptPattern)[2] = SAVE_LAYER; |
- (*postOptPattern)[3] = SAVE; |
- (*postOptPattern)[4] = CLIP_RECT; |
- (*postOptPattern)[5] = DRAW_BITMAP_RECT_TO_RECT; |
- (*postOptPattern)[6] = RESTORE; |
- (*postOptPattern)[7] = RESTORE; |
- (*postOptPattern)[8] = RESTORE; |
- (*postOptPattern)[9] = RESTORE; |
- } |
- |
- SkPictureRecorder recorder; |
- |
- SkCanvas* canvas = recorder.DEPRECATED_beginRecording(100, 100, NULL, 0); |
- // have to disable the optimizations while generating the picture |
- recorder.internalOnly_EnableOpts(false); |
- |
- SkPaint saveLayerPaint; |
- saveLayerPaint.setColor(0xCC000000); |
- |
- // saveLayer's 'bounds' parameter must be NULL for this optimization |
- if (saveLayerHasPaint) { |
- canvas->saveLayer(NULL, &saveLayerPaint); |
- } else { |
- canvas->saveLayer(NULL, NULL); |
- } |
- |
- canvas->save(); |
- |
- SkRect rect = { 10, 10, 90, 90 }; |
- canvas->clipRect(rect); |
- |
- // The dbmr2r's paint must be opaque |
- SkPaint dbmr2rPaint; |
- if (colorsMatch) { |
- dbmr2rPaint.setColor(0xFF000000); |
- } else { |
- dbmr2rPaint.setColor(0xFFFF0000); |
- } |
- |
- if (dbmr2rHasPaint) { |
- canvas->drawBitmapRectToRect(checkerBoard, NULL, rect, &dbmr2rPaint); |
- } else { |
- canvas->drawBitmapRectToRect(checkerBoard, NULL, rect, NULL); |
- } |
- canvas->restore(); |
- canvas->restore(); |
- |
- return recorder.endRecording(); |
-} |
- |
-// straight-ahead version that is seen in the skps |
-static SkPicture* create_save_layer_opt_2_v1(SkTDArray<DrawType>* preOptPattern, |
- SkTDArray<DrawType>* postOptPattern, |
- const SkBitmap& checkerBoard) { |
- return create_save_layer_opt_2(preOptPattern, postOptPattern, checkerBoard, |
- true, // saveLayer has a paint |
- true, // dbmr2r has a paint |
- true); // and the colors match |
-} |
- |
-// alternate version that should still succeed |
-static SkPicture* create_save_layer_opt_2_v2(SkTDArray<DrawType>* preOptPattern, |
- SkTDArray<DrawType>* postOptPattern, |
- const SkBitmap& checkerBoard) { |
- return create_save_layer_opt_2(preOptPattern, postOptPattern, checkerBoard, |
- false, // saveLayer doesn't have a paint! |
- true, // dbmr2r has a paint |
- true); // color matching not really applicable |
-} |
- |
-// alternate version that should still succeed |
-static SkPicture* create_save_layer_opt_2_v3(SkTDArray<DrawType>* preOptPattern, |
- SkTDArray<DrawType>* postOptPattern, |
- const SkBitmap& checkerBoard) { |
- return create_save_layer_opt_2(preOptPattern, postOptPattern, checkerBoard, |
- true, // saveLayer has a paint |
- false, // dbmr2r doesn't have a paint! |
- true); // color matching not really applicable |
-} |
- |
-// version in which the optimization fails b.c. the colors don't match |
-static SkPicture* create_save_layer_opt_2_v4(SkTDArray<DrawType>* preOptPattern, |
- SkTDArray<DrawType>* postOptPattern, |
- const SkBitmap& checkerBoard) { |
- return create_save_layer_opt_2(preOptPattern, postOptPattern, checkerBoard, |
- true, // saveLayer has a paint |
- true, // dbmr2r has a paint |
- false); // and the colors don't match! |
-} |
- |
-// As our .skp optimizations get folded into the captured skps our code will |
-// no longer be locally exercised. This GM manually constructs the patterns |
-// our optimizations will remove to test them. It acts as both a GM and a unit |
-// test |
-class OptimizationsGM : public skiagm::GM { |
-public: |
- OptimizationsGM() { |
- this->makeCheckerboard(); |
- } |
- |
- static const int kWidth = 800; |
- static const int kHeight = 800; |
- |
-protected: |
- uint32_t onGetFlags() const SK_OVERRIDE { |
- // One optimization changes the color drawn slightly in a 565 target. |
- // We've decided it's innocuous, so we disable this GM when targeting 565. |
- // Revisit this if we get finer-grained control: it'd be nice to keep drawing directly. |
- // For more, see skia:1994. |
- return skiagm::GM::kSkip565_Flag; |
- } |
- |
- SkString onShortName() { |
- return SkString("optimizations"); |
- } |
- |
- SkISize onISize() { return SkISize::Make(kWidth, kHeight); } |
- |
- typedef SkPicture* (*PFCreateOpt)(SkTDArray<DrawType> *preOptPattern, |
- SkTDArray<DrawType> *postOptPattern, |
- const SkBitmap& checkerBoard); |
- |
- virtual void onDraw(SkCanvas* canvas) { |
- |
- PFCreateOpt gOpts[] = { |
- create_save_layer_opt_1_v1, |
- create_save_layer_opt_1_v2, |
- create_save_layer_opt_1_v3, |
- create_save_layer_opt_1_v4, |
- create_save_layer_opt_2_v1, |
- create_save_layer_opt_2_v2, |
- create_save_layer_opt_2_v3, |
- create_save_layer_opt_2_v4, |
- }; |
- |
- SkTDArray<DrawType> prePattern, postPattern; |
- SkScalar xPos = 0, yPos = 0; |
- |
- for (size_t i = 0; i < SK_ARRAY_COUNT(gOpts); ++i) { |
- SkAutoTUnref<SkPicture> pre((*gOpts[i])(&prePattern, &postPattern, fCheckerboard)); |
- |
- if (!(check_pattern(*pre, prePattern))) { |
- WARN("Pre optimization pattern mismatch"); |
- SkASSERT(0); |
- } |
- |
- canvas->save(); |
- canvas->translate(xPos, yPos); |
- pre->playback(canvas); |
- xPos += pre->cullRect().width(); |
- canvas->restore(); |
- |
- // re-render the 'pre' picture and thus 'apply' the optimization |
- SkPictureRecorder recorder; |
- |
- SkCanvas* recordCanvas = |
- recorder.DEPRECATED_beginRecording(pre->cullRect().width(), |
- pre->cullRect().height(), |
- NULL, 0); |
- |
- pre->playback(recordCanvas); |
- |
- SkAutoTUnref<SkPicture> post(recorder.endRecording()); |
- |
- if (!(check_pattern(*post, postPattern))) { |
- WARN("Post optimization pattern mismatch"); |
- SkASSERT(0); |
- } |
- |
- canvas->save(); |
- canvas->translate(xPos, yPos); |
- post->playback(canvas); |
- xPos += post->cullRect().width(); |
- canvas->restore(); |
- |
- if (xPos >= kWidth) { |
- // start a new line |
- xPos = 0; |
- yPos += post->cullRect().height(); |
- } |
- |
- // TODO: we could also render the pre and post pictures to bitmaps |
- // and manually compare them in this method |
- } |
- } |
- |
-private: |
- void makeCheckerboard() { |
- static const unsigned int kCheckerboardWidth = 16; |
- static const unsigned int kCheckerboardHeight = 16; |
- |
- fCheckerboard.allocN32Pixels(kCheckerboardWidth, kCheckerboardHeight); |
- for (unsigned int y = 0; y < kCheckerboardHeight; y += 2) { |
- SkPMColor* scanline = fCheckerboard.getAddr32(0, y); |
- for (unsigned int x = 0; x < kCheckerboardWidth; x += 2) { |
- *scanline++ = 0xFFFFFFFF; |
- *scanline++ = 0xFF000000; |
- } |
- scanline = fCheckerboard.getAddr32(0, y + 1); |
- for (unsigned int x = 0; x < kCheckerboardWidth; x += 2) { |
- *scanline++ = 0xFF000000; |
- *scanline++ = 0xFFFFFFFF; |
- } |
- } |
- } |
- |
- SkBitmap fCheckerboard; |
- |
- typedef skiagm::GM INHERITED; |
-}; |
- |
-////////////////////////////////////////////////////////////////////////////// |
- |
-DEF_GM( return new OptimizationsGM; ) |