Benchmark.h revision 111fd11e11cbc296c97225ea16b7ff174a4bcdb5
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"
13111fd11e11cbc296c97225ea16b7ff174a4bcdb5scroggo@google.com#include "SkString.h"
14f523e25da069e3e1af2cb73d37073a34f3bb9ea2reed@android.com#include "SkTRegistry.h"
15bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com
16b8b92ea089a380e17984e4df7b49b379cb6bd929reed@google.com#define DEF_BENCH(code) \
17410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comstatic SkBenchmark* SK_MACRO_APPEND_LINE(F_)() { code; } \
18b8b92ea089a380e17984e4df7b49b379cb6bd929reed@google.comstatic BenchRegistry SK_MACRO_APPEND_LINE(R_)(SK_MACRO_APPEND_LINE(F_));
19b8b92ea089a380e17984e4df7b49b379cb6bd929reed@google.com
20b8b92ea089a380e17984e4df7b49b379cb6bd929reed@google.com/*
21b8b92ea089a380e17984e4df7b49b379cb6bd929reed@google.com *  With the above macros, you can register benches as follows (at the bottom
22b8b92ea089a380e17984e4df7b49b379cb6bd929reed@google.com *  of your .cpp)
23b8b92ea089a380e17984e4df7b49b379cb6bd929reed@google.com *
24410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com *  DEF_BENCH(return new MyBenchmark(...))
25410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com *  DEF_BENCH(return new MyBenchmark(...))
26410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com *  DEF_BENCH(return new MyBenchmark(...))
27b8b92ea089a380e17984e4df7b49b379cb6bd929reed@google.com */
28b8b92ea089a380e17984e4df7b49b379cb6bd929reed@google.com
29b8b92ea089a380e17984e4df7b49b379cb6bd929reed@google.com
30bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.comclass SkCanvas;
314bc1983e01d756ae9c91fd380758457f579d26eareed@android.comclass SkPaint;
32bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com
334e635f9eb218b15f656a02e71c60d4f787fe9306reed@android.comclass SkTriState {
344e635f9eb218b15f656a02e71c60d4f787fe9306reed@android.compublic:
354e635f9eb218b15f656a02e71c60d4f787fe9306reed@android.com    enum State {
364e635f9eb218b15f656a02e71c60d4f787fe9306reed@android.com        kDefault,
374e635f9eb218b15f656a02e71c60d4f787fe9306reed@android.com        kTrue,
384e635f9eb218b15f656a02e71c60d4f787fe9306reed@android.com        kFalse
394e635f9eb218b15f656a02e71c60d4f787fe9306reed@android.com    };
40c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com    static const char* Name[];
414e635f9eb218b15f656a02e71c60d4f787fe9306reed@android.com};
424e635f9eb218b15f656a02e71c60d4f787fe9306reed@android.com
43bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.comclass SkBenchmark : public SkRefCnt {
44bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.compublic:
4515e9d3e66e161ce23df30bc13f8a0c87d196b463robertphillips@google.com    SK_DECLARE_INST_COUNT(SkBenchmark)
4615e9d3e66e161ce23df30bc13f8a0c87d196b463robertphillips@google.com
47410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    SkBenchmark();
484bc1983e01d756ae9c91fd380758457f579d26eareed@android.com
49bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com    const char* getName();
50bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com    SkIPoint getSize();
5130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
5230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    // Call before draw, allows the benchmark to do setup work outside of the
5330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    // timer. When a benchmark is repeatedly drawn, this should be called once
5430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    // before the initial draw.
5530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    void preDraw();
5630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
57bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com    void draw(SkCanvas*);
5830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
5930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    // Call after draw, allows the benchmark to do cleanup work outside of the
6030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    // timer. When a benchmark is repeatedly drawn, this is only called once
6130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    // after the last draw.
6230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    void postDraw();
6330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
644bc1983e01d756ae9c91fd380758457f579d26eareed@android.com    void setForceAlpha(int alpha) {
654bc1983e01d756ae9c91fd380758457f579d26eareed@android.com        fForceAlpha = alpha;
664bc1983e01d756ae9c91fd380758457f579d26eareed@android.com    }
67fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
684bc1983e01d756ae9c91fd380758457f579d26eareed@android.com    void setForceAA(bool aa) {
694bc1983e01d756ae9c91fd380758457f579d26eareed@android.com        fForceAA = aa;
704bc1983e01d756ae9c91fd380758457f579d26eareed@android.com    }
71fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
7229348cb0612e19030d979156860946241e2ff4bdreed@android.com    void setForceFilter(bool filter) {
7329348cb0612e19030d979156860946241e2ff4bdreed@android.com        fForceFilter = filter;
7429348cb0612e19030d979156860946241e2ff4bdreed@android.com    }
75fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
764e635f9eb218b15f656a02e71c60d4f787fe9306reed@android.com    void setDither(SkTriState::State state) {
774e635f9eb218b15f656a02e71c60d4f787fe9306reed@android.com        fDither = state;
784e635f9eb218b15f656a02e71c60d4f787fe9306reed@android.com    }
79e9d0060f4d7b5a07a220182d83aae3a140784c4breed@android.com
809dc2713fc4a75e7fbee2f985057fde680a07c7f0tomhudson@google.com    /** If true; the benchmark does rendering; if false, the benchmark
819dc2713fc4a75e7fbee2f985057fde680a07c7f0tomhudson@google.com        doesn't, and so need not be re-run in every different rendering
829dc2713fc4a75e7fbee2f985057fde680a07c7f0tomhudson@google.com        mode. */
839dc2713fc4a75e7fbee2f985057fde680a07c7f0tomhudson@google.com    bool isRendering() {
849dc2713fc4a75e7fbee2f985057fde680a07c7f0tomhudson@google.com        return fIsRendering;
859dc2713fc4a75e7fbee2f985057fde680a07c7f0tomhudson@google.com    }
869dc2713fc4a75e7fbee2f985057fde680a07c7f0tomhudson@google.com
87ef77ec210416733e38072175cc948dcbdb831685reed@google.com    /** Assign masks for paint-flags. These will be applied when setupPaint()
88ef77ec210416733e38072175cc948dcbdb831685reed@google.com     *  is called.
89ef77ec210416733e38072175cc948dcbdb831685reed@google.com     *
90ef77ec210416733e38072175cc948dcbdb831685reed@google.com     *  Performs the following on the paint:
91ef77ec210416733e38072175cc948dcbdb831685reed@google.com     *      uint32_t flags = paint.getFlags();
92ef77ec210416733e38072175cc948dcbdb831685reed@google.com     *      flags &= ~clearMask;
93ef77ec210416733e38072175cc948dcbdb831685reed@google.com     *      flags |= orMask;
94ef77ec210416733e38072175cc948dcbdb831685reed@google.com     *      paint.setFlags(flags);
95ef77ec210416733e38072175cc948dcbdb831685reed@google.com     */
96ef77ec210416733e38072175cc948dcbdb831685reed@google.com    void setPaintMasks(uint32_t orMask, uint32_t clearMask) {
97ef77ec210416733e38072175cc948dcbdb831685reed@google.com        fOrMask = orMask;
98ef77ec210416733e38072175cc948dcbdb831685reed@google.com        fClearMask = clearMask;
99ef77ec210416733e38072175cc948dcbdb831685reed@google.com    }
100ef77ec210416733e38072175cc948dcbdb831685reed@google.com
101c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com    // The bench framework calls this to control the runtime of a bench.
102c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com    void setLoops(int loops) {
103c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com        fLoops = loops;
104c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com    }
105c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com
106c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com    // Each bench should do its main work in a loop like this:
107c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com    //   for (int i = 0; i < this->getLoops(); i++) { <work here> }
108c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com    int getLoops() const { return fLoops; }
109ef77ec210416733e38072175cc948dcbdb831685reed@google.com
110111fd11e11cbc296c97225ea16b7ff174a4bcdb5scroggo@google.com    static void SetResourcePath(const char* resPath) { gResourcePath.set(resPath); }
111111fd11e11cbc296c97225ea16b7ff174a4bcdb5scroggo@google.com
112111fd11e11cbc296c97225ea16b7ff174a4bcdb5scroggo@google.com    static SkString& GetResourcePath() { return gResourcePath; }
113111fd11e11cbc296c97225ea16b7ff174a4bcdb5scroggo@google.com
114bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.comprotected:
1150561a3ccd24e46259d825adf5507c7ee9531b9c5reed@google.com    virtual void setupPaint(SkPaint* paint);
1164bc1983e01d756ae9c91fd380758457f579d26eareed@android.com
117bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com    virtual const char* onGetName() = 0;
11830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    virtual void onPreDraw() {}
119bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com    virtual void onDraw(SkCanvas*) = 0;
12030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    virtual void onPostDraw() {}
121f523e25da069e3e1af2cb73d37073a34f3bb9ea2reed@android.com
122f523e25da069e3e1af2cb73d37073a34f3bb9ea2reed@android.com    virtual SkIPoint onGetSize();
1239dc2713fc4a75e7fbee2f985057fde680a07c7f0tomhudson@google.com    /// Defaults to true.
1249dc2713fc4a75e7fbee2f985057fde680a07c7f0tomhudson@google.com    bool    fIsRendering;
125f523e25da069e3e1af2cb73d37073a34f3bb9ea2reed@android.com
1264bc1983e01d756ae9c91fd380758457f579d26eareed@android.comprivate:
1274bc1983e01d756ae9c91fd380758457f579d26eareed@android.com    int     fForceAlpha;
1284bc1983e01d756ae9c91fd380758457f579d26eareed@android.com    bool    fForceAA;
12929348cb0612e19030d979156860946241e2ff4bdreed@android.com    bool    fForceFilter;
1304e635f9eb218b15f656a02e71c60d4f787fe9306reed@android.com    SkTriState::State  fDither;
131ef77ec210416733e38072175cc948dcbdb831685reed@google.com    uint32_t    fOrMask, fClearMask;
132c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com    int fLoops;
133111fd11e11cbc296c97225ea16b7ff174a4bcdb5scroggo@google.com    static  SkString gResourcePath;
13415e9d3e66e161ce23df30bc13f8a0c87d196b463robertphillips@google.com
13515e9d3e66e161ce23df30bc13f8a0c87d196b463robertphillips@google.com    typedef SkRefCnt INHERITED;
136bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com};
137bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com
138410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comtypedef SkTRegistry<SkBenchmark*(*)()> BenchRegistry;
139f523e25da069e3e1af2cb73d37073a34f3bb9ea2reed@android.com
140bd700c391dd45acd8ea1a40321789c9d92a14bb8reed@android.com#endif
141