1 /* 2 * Copyright 2011 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 8 #ifndef Benchmark_DEFINED 9 #define Benchmark_DEFINED 10 11 #include "SkPoint.h" 12 #include "SkRefCnt.h" 13 #include "SkString.h" 14 #include "SkTRegistry.h" 15 16 #define DEF_BENCH(code) \ 17 namespace { \ 18 static Benchmark* SK_MACRO_APPEND_LINE(factory)(void*) { code; } \ 19 BenchRegistry SK_MACRO_APPEND_LINE(g_R_)(SK_MACRO_APPEND_LINE(factory)); \ 20 } 21 22 /* 23 * With the above macros, you can register benches as follows (at the bottom 24 * of your .cpp) 25 * 26 * DEF_BENCH(return new MyBenchmark(...)) 27 * DEF_BENCH(return new MyBenchmark(...)) 28 * DEF_BENCH(return new MyBenchmark(...)) 29 */ 30 31 32 class SkCanvas; 33 class SkPaint; 34 35 class SkTriState { 36 public: 37 enum State { 38 kDefault, 39 kTrue, 40 kFalse 41 }; 42 static const char* Name[]; 43 }; 44 45 class Benchmark : public SkRefCnt { 46 public: 47 SK_DECLARE_INST_COUNT(Benchmark) 48 49 Benchmark(); 50 51 const char* getName(); 52 SkIPoint getSize(); 53 54 enum Backend { 55 kNonRendering_Backend, 56 kRaster_Backend, 57 kGPU_Backend, 58 kPDF_Backend, 59 }; 60 61 // Call to determine whether the benchmark is intended for 62 // the rendering mode. 63 virtual bool isSuitableFor(Backend backend) { 64 return backend != kNonRendering_Backend; 65 } 66 67 // Call before draw, allows the benchmark to do setup work outside of the 68 // timer. When a benchmark is repeatedly drawn, this should be called once 69 // before the initial draw. 70 void preDraw(); 71 72 // Bench framework can tune loops to be large enough for stable timing. 73 void draw(const int loops, SkCanvas*); 74 75 void setForceAlpha(int alpha) { 76 fForceAlpha = alpha; 77 } 78 79 void setForceAA(bool aa) { 80 fForceAA = aa; 81 } 82 83 void setForceFilter(bool filter) { 84 fForceFilter = filter; 85 } 86 87 void setDither(SkTriState::State state) { 88 fDither = state; 89 } 90 91 /** Assign masks for paint-flags. These will be applied when setupPaint() 92 * is called. 93 * 94 * Performs the following on the paint: 95 * uint32_t flags = paint.getFlags(); 96 * flags &= ~clearMask; 97 * flags |= orMask; 98 * paint.setFlags(flags); 99 */ 100 void setPaintMasks(uint32_t orMask, uint32_t clearMask) { 101 fOrMask = orMask; 102 fClearMask = clearMask; 103 } 104 105 protected: 106 virtual void setupPaint(SkPaint* paint); 107 108 virtual const char* onGetName() = 0; 109 virtual void onPreDraw() {} 110 // Each bench should do its main work in a loop like this: 111 // for (int i = 0; i < loops; i++) { <work here> } 112 virtual void onDraw(const int loops, SkCanvas*) = 0; 113 114 virtual SkIPoint onGetSize(); 115 116 private: 117 int fForceAlpha; 118 bool fForceAA; 119 bool fForceFilter; 120 SkTriState::State fDither; 121 uint32_t fOrMask, fClearMask; 122 123 typedef SkRefCnt INHERITED; 124 }; 125 126 typedef SkTRegistry<Benchmark*(*)(void*)> BenchRegistry; 127 128 #endif 129