Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1)

Unified Diff: gm/optimizations.cpp

Issue 617953002: Strip old backend recording down to essentials (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: debug-only Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | gyp/core.gypi » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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; )
« no previous file with comments | « no previous file | gyp/core.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698