Benchmark.h revision 410e6e80f00a6c660675c80904807a041c7b7d2a
1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc.
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */
8bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com#ifndef SkBenchmark_DEFINED
9bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com#define SkBenchmark_DEFINED
10bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com
11bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com#include "SkRefCnt.h"
12bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com#include "SkPoint.h"
13f523e25da069e3e1af2cb73d37073a34f3bb9ea2reed@android.com#include "SkTRegistry.h"
14bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com
15b8b92ea089a380e17984e4df7b49b379cb6bd929reed@google.com#define DEF_BENCH(code) \
16410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comstatic SkBenchmark* SK_MACRO_APPEND_LINE(F_)() { code; } \
17b8b92ea089a380e17984e4df7b49b379cb6bd929reed@google.comstatic BenchRegistry SK_MACRO_APPEND_LINE(R_)(SK_MACRO_APPEND_LINE(F_));
18b8b92ea089a380e17984e4df7b49b379cb6bd929reed@google.com
19b8b92ea089a380e17984e4df7b49b379cb6bd929reed@google.com/*
20b8b92ea089a380e17984e4df7b49b379cb6bd929reed@google.com *  With the above macros, you can register benches as follows (at the bottom
21b8b92ea089a380e17984e4df7b49b379cb6bd929reed@google.com *  of your .cpp)
22b8b92ea089a380e17984e4df7b49b379cb6bd929reed@google.com *
23410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com *  DEF_BENCH(return new MyBenchmark(...))
24410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com *  DEF_BENCH(return new MyBenchmark(...))
25410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com *  DEF_BENCH(return new MyBenchmark(...))
26b8b92ea089a380e17984e4df7b49b379cb6bd929reed@google.com */
27b8b92ea089a380e17984e4df7b49b379cb6bd929reed@google.com
28b8b92ea089a380e17984e4df7b49b379cb6bd929reed@google.com
29bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.comclass SkCanvas;
304bc1983e01d756ae9c91fd380758457f579d26eareed@android.comclass SkPaint;
31bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com
324e635f9eb218b15f656a02e71c60d4f787fe9306reed@android.comclass SkTriState {
334e635f9eb218b15f656a02e71c60d4f787fe9306reed@android.compublic:
344e635f9eb218b15f656a02e71c60d4f787fe9306reed@android.com    enum State {
354e635f9eb218b15f656a02e71c60d4f787fe9306reed@android.com        kDefault,
364e635f9eb218b15f656a02e71c60d4f787fe9306reed@android.com        kTrue,
374e635f9eb218b15f656a02e71c60d4f787fe9306reed@android.com        kFalse
384e635f9eb218b15f656a02e71c60d4f787fe9306reed@android.com    };
39c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com    static const char* Name[];
404e635f9eb218b15f656a02e71c60d4f787fe9306reed@android.com};
414e635f9eb218b15f656a02e71c60d4f787fe9306reed@android.com
42bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.comclass SkBenchmark : public SkRefCnt {
43bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.compublic:
4415e9d3e66e161ce23df30bc13f8a0c87d196b463robertphillips@google.com    SK_DECLARE_INST_COUNT(SkBenchmark)
4515e9d3e66e161ce23df30bc13f8a0c87d196b463robertphillips@google.com
46410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    SkBenchmark();
474bc1983e01d756ae9c91fd380758457f579d26eareed@android.com
48bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com    const char* getName();
49bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com    SkIPoint getSize();
5030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
5130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    // Call before draw, allows the benchmark to do setup work outside of the
5230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    // timer. When a benchmark is repeatedly drawn, this should be called once
5330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    // before the initial draw.
5430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    void preDraw();
5530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
56bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com    void draw(SkCanvas*);
5730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
5830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    // Call after draw, allows the benchmark to do cleanup work outside of the
5930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    // timer. When a benchmark is repeatedly drawn, this is only called once
6030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    // after the last draw.
6130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    void postDraw();
6230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
634bc1983e01d756ae9c91fd380758457f579d26eareed@android.com    void setForceAlpha(int alpha) {
644bc1983e01d756ae9c91fd380758457f579d26eareed@android.com        fForceAlpha = alpha;
654bc1983e01d756ae9c91fd380758457f579d26eareed@android.com    }
66fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
674bc1983e01d756ae9c91fd380758457f579d26eareed@android.com    void setForceAA(bool aa) {
684bc1983e01d756ae9c91fd380758457f579d26eareed@android.com        fForceAA = aa;
694bc1983e01d756ae9c91fd380758457f579d26eareed@android.com    }
70fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
7129348cb0612e19030d979156860946241e2ff4bdreed@android.com    void setForceFilter(bool filter) {
7229348cb0612e19030d979156860946241e2ff4bdreed@android.com        fForceFilter = filter;
7329348cb0612e19030d979156860946241e2ff4bdreed@android.com    }
74fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
754e635f9eb218b15f656a02e71c60d4f787fe9306reed@android.com    void setDither(SkTriState::State state) {
764e635f9eb218b15f656a02e71c60d4f787fe9306reed@android.com        fDither = state;
774e635f9eb218b15f656a02e71c60d4f787fe9306reed@android.com    }
78e9d0060f4d7b5a07a220182d83aae3a140784c4breed@android.com
799dc2713fc4a75e7fbee2f985057fde680a07c7f0tomhudson@google.com    /** If true; the benchmark does rendering; if false, the benchmark
809dc2713fc4a75e7fbee2f985057fde680a07c7f0tomhudson@google.com        doesn't, and so need not be re-run in every different rendering
819dc2713fc4a75e7fbee2f985057fde680a07c7f0tomhudson@google.com        mode. */
829dc2713fc4a75e7fbee2f985057fde680a07c7f0tomhudson@google.com    bool isRendering() {
839dc2713fc4a75e7fbee2f985057fde680a07c7f0tomhudson@google.com        return fIsRendering;
849dc2713fc4a75e7fbee2f985057fde680a07c7f0tomhudson@google.com    }
859dc2713fc4a75e7fbee2f985057fde680a07c7f0tomhudson@google.com
86ef77ec210416733e38072175cc948dcbdb831685reed@google.com    /** Assign masks for paint-flags. These will be applied when setupPaint()
87ef77ec210416733e38072175cc948dcbdb831685reed@google.com     *  is called.
88ef77ec210416733e38072175cc948dcbdb831685reed@google.com     *
89ef77ec210416733e38072175cc948dcbdb831685reed@google.com     *  Performs the following on the paint:
90ef77ec210416733e38072175cc948dcbdb831685reed@google.com     *      uint32_t flags = paint.getFlags();
91ef77ec210416733e38072175cc948dcbdb831685reed@google.com     *      flags &= ~clearMask;
92ef77ec210416733e38072175cc948dcbdb831685reed@google.com     *      flags |= orMask;
93ef77ec210416733e38072175cc948dcbdb831685reed@google.com     *      paint.setFlags(flags);
94ef77ec210416733e38072175cc948dcbdb831685reed@google.com     */
95ef77ec210416733e38072175cc948dcbdb831685reed@google.com    void setPaintMasks(uint32_t orMask, uint32_t clearMask) {
96ef77ec210416733e38072175cc948dcbdb831685reed@google.com        fOrMask = orMask;
97ef77ec210416733e38072175cc948dcbdb831685reed@google.com        fClearMask = clearMask;
98ef77ec210416733e38072175cc948dcbdb831685reed@google.com    }
99ef77ec210416733e38072175cc948dcbdb831685reed@google.com
100c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com    // The bench framework calls this to control the runtime of a bench.
101c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com    void setLoops(int loops) {
102c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com        fLoops = loops;
103c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com    }
104c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com
105c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com    // Each bench should do its main work in a loop like this:
106c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com    //   for (int i = 0; i < this->getLoops(); i++) { <work here> }
107c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com    int getLoops() const { return fLoops; }
108ef77ec210416733e38072175cc948dcbdb831685reed@google.com
109bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.comprotected:
1100561a3ccd24e46259d825adf5507c7ee9531b9c5reed@google.com    virtual void setupPaint(SkPaint* paint);
1114bc1983e01d756ae9c91fd380758457f579d26eareed@android.com
112bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com    virtual const char* onGetName() = 0;
11330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    virtual void onPreDraw() {}
114bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com    virtual void onDraw(SkCanvas*) = 0;
11530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    virtual void onPostDraw() {}
116f523e25da069e3e1af2cb73d37073a34f3bb9ea2reed@android.com
117f523e25da069e3e1af2cb73d37073a34f3bb9ea2reed@android.com    virtual SkIPoint onGetSize();
1189dc2713fc4a75e7fbee2f985057fde680a07c7f0tomhudson@google.com    /// Defaults to true.
1199dc2713fc4a75e7fbee2f985057fde680a07c7f0tomhudson@google.com    bool    fIsRendering;
120f523e25da069e3e1af2cb73d37073a34f3bb9ea2reed@android.com
1214bc1983e01d756ae9c91fd380758457f579d26eareed@android.comprivate:
1224bc1983e01d756ae9c91fd380758457f579d26eareed@android.com    int     fForceAlpha;
1234bc1983e01d756ae9c91fd380758457f579d26eareed@android.com    bool    fForceAA;
12429348cb0612e19030d979156860946241e2ff4bdreed@android.com    bool    fForceFilter;
1254e635f9eb218b15f656a02e71c60d4f787fe9306reed@android.com    SkTriState::State  fDither;
126ef77ec210416733e38072175cc948dcbdb831685reed@google.com    uint32_t    fOrMask, fClearMask;
127c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com    int fLoops;
12815e9d3e66e161ce23df30bc13f8a0c87d196b463robertphillips@google.com
12915e9d3e66e161ce23df30bc13f8a0c87d196b463robertphillips@google.com    typedef SkRefCnt INHERITED;
130bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com};
131bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com
132410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comtypedef SkTRegistry<SkBenchmark*(*)()> BenchRegistry;
133f523e25da069e3e1af2cb73d37073a34f3bb9ea2reed@android.com
134bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com#endif
135