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