| OLD | NEW |
| (Empty) |
| 1 | |
| 2 /* | |
| 3 * Copyright 2011 Google Inc. | |
| 4 * | |
| 5 * Use of this source code is governed by a BSD-style license that can be | |
| 6 * found in the LICENSE file. | |
| 7 */ | |
| 8 #ifndef SkBenchmark_DEFINED | |
| 9 #define SkBenchmark_DEFINED | |
| 10 | |
| 11 #include "SkRefCnt.h" | |
| 12 #include "SkPoint.h" | |
| 13 #include "SkString.h" | |
| 14 #include "SkTRegistry.h" | |
| 15 | |
| 16 #define DEF_BENCH(code) \ | |
| 17 namespace { \ | |
| 18 static SkBenchmark* 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 SkBenchmark : public SkRefCnt { | |
| 46 public: | |
| 47 SK_DECLARE_INST_COUNT(SkBenchmark) | |
| 48 | |
| 49 SkBenchmark(); | |
| 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<SkBenchmark*(*)(void*)> BenchRegistry; | |
| 127 | |
| 128 #endif | |
| OLD | NEW |