DeferredCanvasBench.cpp revision 52805485581cff7e13134aa1465a2950f7bed007
1/*
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(&fNotificationClient);
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        canvas.setNotificationClient(NULL);
97    }
98
99private:
100    typedef DeferredCanvasBench INHERITED;
101    SimpleNotificationClient fNotificationClient;
102};
103
104
105///////////////////////////////////////////////////////////////////////////////
106
107static SkBenchmark* Fact0(void* p) { return new DeferredRecordBench(p); }
108
109static BenchRegistry gReg0(Fact0);
110