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 #include "TimingStateMachine.h" | 8 #include "TimingStateMachine.h" |
9 | 9 |
10 #include "SkCanvas.h" | 10 #include "SkCanvas.h" |
11 #include "SkCommandLineFlags.h" | 11 #include "SkCommandLineFlags.h" |
12 | 12 |
13 DEFINE_int32(gpuFrameLag, 5, "Overestimate of maximum number of frames GPU is al
lowed to lag."); | 13 DEFINE_int32(gpuFrameLag, 5, "Overestimate of maximum number of frames GPU is al
lowed to lag."); |
14 DEFINE_int32(frames, 5, "Number of frames of each skp to render per sample."); | 14 DEFINE_int32(frames, 5, "Number of frames of each skp to render per sample."); |
15 DEFINE_double(loopMs, 5, "Each benchmark will be tuned until it takes loopsMs mi
llseconds."); | 15 DEFINE_double(loopMs, 5, "Each benchmark will be tuned until it takes loopsMs mi
llseconds."); |
16 | 16 |
| 17 static double now_ms() { return SkTime::GetNSecs() * 1e-6; } |
| 18 |
17 TimingStateMachine::TimingStateMachine() | 19 TimingStateMachine::TimingStateMachine() |
18 : fCurrentFrame(0) | 20 : fCurrentFrame(0) |
19 , fLoops(1) | 21 , fLoops(1) |
20 , fLastMeasurement(0.) | 22 , fLastMeasurement(0.) |
21 , fState(kPreWarm_State) | 23 , fState(kPreWarm_State) |
22 , fInnerState(kTuning_InnerState) { | 24 , fInnerState(kTuning_InnerState) { |
23 } | 25 } |
24 | 26 |
25 TimingStateMachine::ParentEvents TimingStateMachine::nextFrame(bool preWarmBetwe
enSamples) { | 27 TimingStateMachine::ParentEvents TimingStateMachine::nextFrame(bool preWarmBetwe
enSamples) { |
26 ParentEvents parentEvent = kTiming_ParentEvents; | 28 ParentEvents parentEvent = kTiming_ParentEvents; |
27 switch (fState) { | 29 switch (fState) { |
28 case kPreWarm_State: { | 30 case kPreWarm_State: { |
29 if (fCurrentFrame >= FLAGS_gpuFrameLag) { | 31 if (fCurrentFrame >= FLAGS_gpuFrameLag) { |
30 fCurrentFrame = 0; | 32 fCurrentFrame = 0; |
31 fTimer.start(); | 33 fStartTime = now_ms(); |
32 fState = kTiming_State; | 34 fState = kTiming_State; |
33 } else { | 35 } else { |
34 fCurrentFrame++; | 36 fCurrentFrame++; |
35 } | 37 } |
36 break; | 38 break; |
37 } | 39 } |
38 case kTiming_State: { | 40 case kTiming_State: { |
39 switch (fInnerState) { | 41 switch (fInnerState) { |
40 case kTuning_InnerState: { | 42 case kTuning_InnerState: { |
41 if (1 << 30 == fLoops) { | 43 if (1 << 30 == fLoops) { |
(...skipping 14 matching lines...) Expand all Loading... |
56 break; | 58 break; |
57 } | 59 } |
58 case kTiming_InnerState: { | 60 case kTiming_InnerState: { |
59 if (fCurrentFrame >= FLAGS_frames) { | 61 if (fCurrentFrame >= FLAGS_frames) { |
60 this->recordMeasurement(); | 62 this->recordMeasurement(); |
61 this->resetTimingState(); | 63 this->resetTimingState(); |
62 parentEvent = kTimingFinished_ParentEvents; | 64 parentEvent = kTimingFinished_ParentEvents; |
63 if (preWarmBetweenSamples) { | 65 if (preWarmBetweenSamples) { |
64 fState = kPreWarm_State; | 66 fState = kPreWarm_State; |
65 } else { | 67 } else { |
66 fTimer.start(); // start timing again, don't change
state | 68 fStartTime = now_ms(); |
67 } | 69 } |
68 } else { | 70 } else { |
69 fCurrentFrame++; | 71 fCurrentFrame++; |
70 } | 72 } |
71 break; | 73 break; |
72 } | 74 } |
73 } | 75 } |
74 } | 76 } |
75 break; | 77 break; |
76 } | 78 } |
77 return parentEvent; | 79 return parentEvent; |
78 } | 80 } |
79 | 81 |
80 inline double TimingStateMachine::elapsed() { | 82 inline double TimingStateMachine::elapsed() { |
81 fTimer.end(); | 83 return now_ms() - fStartTime; |
82 return fTimer.fWall; | |
83 } | 84 } |
84 | 85 |
85 void TimingStateMachine::resetTimingState() { | 86 void TimingStateMachine::resetTimingState() { |
86 fCurrentFrame = 0; | 87 fCurrentFrame = 0; |
87 fTimer = WallTimer(); | |
88 } | 88 } |
89 | 89 |
90 void TimingStateMachine::recordMeasurement() { | 90 void TimingStateMachine::recordMeasurement() { |
91 fLastMeasurement = this->elapsed() / (FLAGS_frames * fLoops); | 91 fLastMeasurement = this->elapsed() / (FLAGS_frames * fLoops); |
92 } | 92 } |
93 | 93 |
94 void TimingStateMachine::nextBenchmark() { | 94 void TimingStateMachine::nextBenchmark() { |
95 fLoops = 1; | 95 fLoops = 1; |
96 fInnerState = kTuning_InnerState; | 96 fInnerState = kTuning_InnerState; |
97 fState = kPreWarm_State; | 97 fState = kPreWarm_State; |
98 } | 98 } |
OLD | NEW |