blob: 60873887a5ebd1d24fd9aa3b99a82f00d49b77fb [file] [log] [blame]
junov@chromium.org9ed02b92012-08-14 13:36:26 +00001/*
2 * Copyright 2012 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7#include "SkBenchmark.h"
8#include "SkDeferredCanvas.h"
9#include "SkDevice.h"
10#include "SkString.h"
11
12class DeferredCanvasBench : public SkBenchmark {
13public:
14 DeferredCanvasBench(void* param, const char name[]) : INHERITED(param) {
15 fName.printf("deferred_canvas_%s", name);
16 }
17
18 enum {
19 N = SkBENCHLOOP(25), // number of times to create the picture
20 CANVAS_WIDTH = 200,
21 CANVAS_HEIGHT = 200,
22 };
23protected:
24 virtual const char* onGetName() {
25 return fName.c_str();
26 }
27
28 virtual void onDraw(SkCanvas* canvas) {
29 SkDeferredCanvas deferredCanvas(canvas->getDevice()->createCompatibleDevice(
30 SkBitmap::kARGB_8888_Config, CANVAS_WIDTH, CANVAS_HEIGHT, false));
31
32 initDeferredCanvas(deferredCanvas);
33
34 for (int i = 0; i < N; i++) {
35 drawInDeferredCanvas(deferredCanvas);
36 }
37
38 finalizeDeferredCanvas(deferredCanvas);
39 deferredCanvas.flush();
40 }
41
42 virtual void initDeferredCanvas(SkDeferredCanvas& canvas) = 0;
43 virtual void drawInDeferredCanvas(SkDeferredCanvas& canvas) = 0;
44 virtual void finalizeDeferredCanvas(SkDeferredCanvas& canvas) = 0;
45
46 SkString fName;
47
48private:
49 typedef SkBenchmark INHERITED;
50};
51
52class SimpleNotificationClient : public SkDeferredCanvas::NotificationClient {
53public:
54 SimpleNotificationClient() : fDummy(false) {}
55
56 //bogus virtual implementations that just do something small
57 virtual void prepareForDraw() SK_OVERRIDE {fDummy = true;}
58 virtual void storageAllocatedForRecordingChanged(size_t) SK_OVERRIDE {fDummy = false;}
59 virtual void flushedDrawCommands() SK_OVERRIDE {fDummy = !fDummy;}
60private:
61 bool fDummy;
62};
63
64// Test that records very simple draw operations.
65// This benchmark aims to capture performance fluctuations in the recording
66// overhead of SkDeferredCanvas
67class DeferredRecordBench : public DeferredCanvasBench {
68public:
69 DeferredRecordBench(void* param)
70 : INHERITED(param, "record") {
71 }
72
73 enum {
74 M = SkBENCHLOOP(700), // number of individual draws in each loop
75 };
76protected:
77
78 virtual void initDeferredCanvas(SkDeferredCanvas& canvas) SK_OVERRIDE {
79 canvas.setNotificationClient(SkNEW(SimpleNotificationClient))->unref();
80 }
81
82 virtual void drawInDeferredCanvas(SkDeferredCanvas& canvas) SK_OVERRIDE {
83 SkRect rect;
84 rect.setXYWH(0, 0, 10, 10);
85 SkPaint paint;
86 for (int i = 0; i < M; i++) {
87 canvas.save(SkCanvas::kMatrixClip_SaveFlag);
88 canvas.translate(SkIntToScalar(i * 27 % CANVAS_WIDTH), SkIntToScalar(i * 13 % CANVAS_HEIGHT));
89 canvas.drawRect(rect, paint);
90 canvas.restore();
91 }
92 }
93
94 virtual void finalizeDeferredCanvas(SkDeferredCanvas& canvas) SK_OVERRIDE {
95 canvas.clear(0x0);
96 }
97
98private:
99 typedef DeferredCanvasBench INHERITED;
100};
101
102
103///////////////////////////////////////////////////////////////////////////////
104
105static SkBenchmark* Fact0(void* p) { return new DeferredRecordBench(p); }
106
107static BenchRegistry gReg0(Fact0);