| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 * | 6 * |
| 7 */ | 7 */ |
| 8 | 8 |
| 9 #ifndef TimingStateMachine_DEFINED | 9 #ifndef TimingStateMachine_DEFINED |
| 10 #define TimingStateMachine_DEFINED | 10 #define TimingStateMachine_DEFINED |
| (...skipping 18 matching lines...) Expand all Loading... |
| 29 public: | 29 public: |
| 30 TimingStateMachine(); | 30 TimingStateMachine(); |
| 31 | 31 |
| 32 enum ParentEvents { | 32 enum ParentEvents { |
| 33 kReset_ParentEvents, | 33 kReset_ParentEvents, |
| 34 kTiming_ParentEvents, | 34 kTiming_ParentEvents, |
| 35 kTimingFinished_ParentEvents,// This implies parent can read lastMeasure
ment() and must | 35 kTimingFinished_ParentEvents,// This implies parent can read lastMeasure
ment() and must |
| 36 // reset | 36 // reset |
| 37 }; | 37 }; |
| 38 | 38 |
| 39 ParentEvents nextFrame(SkCanvas* canvas, Benchmark* benchmark); | 39 ParentEvents nextFrame(bool preWarmBetweenSamples); |
| 40 | |
| 41 /* | |
| 42 * Before taking another sample, the owner can choose to prewarm or not | |
| 43 */ | |
| 44 void nextSampleWithPrewarm(); | |
| 45 void nextSample(); | |
| 46 | 40 |
| 47 /* | 41 /* |
| 48 * The caller should call this when they are ready to move to the next bench
mark. The caller | 42 * The caller should call this when they are ready to move to the next bench
mark. The caller |
| 49 * must call this with the *last* benchmark so post draw hooks can be invoke
d | 43 * must call this with the *last* benchmark so post draw hooks can be invoke
d |
| 50 */ | 44 */ |
| 51 void nextBenchmark(SkCanvas*, Benchmark*); | 45 void nextBenchmark(SkCanvas*, Benchmark*); |
| 52 | 46 |
| 53 | |
| 54 /* | 47 /* |
| 55 * When TimingStateMachine returns kTimingFinished_ParentEvents, then the ow
ner can call | 48 * When TimingStateMachine returns kTimingFinished_ParentEvents, then the ow
ner can call |
| 56 * lastMeasurement() to get the time | 49 * lastMeasurement() to get the time |
| 57 */ | 50 */ |
| 58 double lastMeasurement() const { return fLastMeasurement; } | 51 double lastMeasurement() const { return fLastMeasurement; } |
| 59 | 52 |
| 60 int loops() const { return fLoops; } | 53 int loops() const { return fLoops; } |
| 61 | 54 |
| 62 private: | 55 private: |
| 63 /* | |
| 64 * The heart of the timing state machine is an event driven timing loop. | |
| 65 * kPreWarmLoopsPerCanvasPreDraw_State: Before we begin timing, Benchmarks
have a hook to | |
| 66 * access the canvas. Then we prewarm
before the autotune | |
| 67 * loops step. | |
| 68 * kPreWarmLoops_State: We prewarm the gpu before auto tuni
ng to enter a steady | |
| 69 * work state | |
| 70 * kTuneLoops_State: Then we tune the loops of the bench
mark to ensure we | |
| 71 * are doing a measurable amount of wo
rk | |
| 72 * kPreWarmTimingPerCanvasPreDraw_State: Because reset the context after tun
ing loops to ensure | |
| 73 * coherent state, we need to give the
benchmark | |
| 74 * another hook | |
| 75 * kPreWarmTiming_State: We prewarm the gpu again to enter a
steady state | |
| 76 * kTiming_State: Finally we time the benchmark. Whe
n finished timing | |
| 77 * if we have enough samples then we'l
l start the next | |
| 78 * benchmark in the kPreWarmLoopsPerCa
nvasPreDraw_State. | |
| 79 * otherwise, we enter the | |
| 80 * kPreWarmTimingPerCanvasPreDraw_Stat
e for another sample | |
| 81 * In either case we reset the context
. | |
| 82 */ | |
| 83 enum State { | 56 enum State { |
| 84 kPreWarmLoopsPerCanvasPreDraw_State, | 57 kPreWarm_State, |
| 85 kPreWarmLoops_State, | |
| 86 kTuneLoops_State, | |
| 87 kPreWarmTimingPerCanvasPreDraw_State, | |
| 88 kPreWarmTiming_State, | |
| 89 kTiming_State, | 58 kTiming_State, |
| 90 }; | 59 }; |
| 60 enum InnerState { |
| 61 kTuning_InnerState, |
| 62 kTiming_InnerState, |
| 63 }; |
| 91 | 64 |
| 92 inline void nextState(State); | |
| 93 ParentEvents perCanvasPreDraw(SkCanvas*, Benchmark*, State); | |
| 94 ParentEvents preWarm(State nextState); | |
| 95 inline ParentEvents tuneLoops(); | |
| 96 inline ParentEvents timing(SkCanvas*, Benchmark*); | |
| 97 inline double elapsed(); | 65 inline double elapsed(); |
| 98 void resetTimingState(); | 66 void resetTimingState(); |
| 99 void postDraw(SkCanvas*, Benchmark*); | |
| 100 void recordMeasurement(); | 67 void recordMeasurement(); |
| 101 | 68 |
| 102 int fCurrentFrame; | 69 int fCurrentFrame; |
| 103 int fLoops; | 70 int fLoops; |
| 104 double fLastMeasurement; | 71 double fLastMeasurement; |
| 105 WallTimer fTimer; | 72 WallTimer fTimer; |
| 106 State fState; | 73 State fState; |
| 74 InnerState fInnerState; |
| 107 }; | 75 }; |
| 108 | 76 |
| 109 #endif | 77 #endif |
| OLD | NEW |