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