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 VisualLightweightBenchModule_DEFINED | 9 #ifndef VisualInteractiveModule_DEFINED |
10 #define VisualLightweightBenchModule_DEFINED | 10 #define VisualInteractiveModule_DEFINED |
11 | 11 |
12 #include "VisualModule.h" | 12 #include "VisualModule.h" |
13 | 13 |
14 #include "ResultsWriter.h" | 14 #include "ResultsWriter.h" |
15 #include "SkPicture.h" | 15 #include "SkPicture.h" |
16 #include "Timer.h" | 16 #include "Timer.h" |
17 #include "VisualBench.h" | 17 #include "VisualBench.h" |
18 #include "VisualBenchmarkStream.h" | 18 #include "VisualBenchmarkStream.h" |
19 | 19 |
20 class SkCanvas; | 20 class SkCanvas; |
21 | 21 |
22 /* | 22 /* |
23 * This module is designed to be a minimal overhead timing module for VisualBenc
h | 23 * This module for VisualBench is designed to display stats data dynamically |
24 */ | 24 */ |
25 class VisualLightweightBenchModule : public VisualModule { | 25 class VisualInteractiveModule : public VisualModule { |
26 public: | 26 public: |
27 // TODO get rid of backpointer | 27 // TODO get rid of backpointer |
28 VisualLightweightBenchModule(VisualBench* owner); | 28 VisualInteractiveModule(VisualBench* owner); |
29 | 29 |
30 void draw(SkCanvas* canvas) override; | 30 void draw(SkCanvas* canvas) override; |
| 31 bool onHandleChar(SkUnichar unichar) override; |
31 | 32 |
32 private: | 33 private: |
33 /* | 34 /* |
34 * The heart of visual bench is an event driven timing loop. | 35 * The heart of visual bench is an event driven timing loop. |
35 * kPreWarmLoopsPerCanvasPreDraw_State: Before we begin timing, Benchmarks
have a hook to | 36 * kPreWarmLoopsPerCanvasPreDraw_State: Before we begin timing, Benchmarks
have a hook to |
36 * access the canvas. Then we prewarm
before the autotune | 37 * access the canvas. Then we prewarm
before the autotune |
37 * loops step. | 38 * loops step. |
38 * kPreWarmLoops_State: We prewarm the gpu before auto tuni
ng to enter a steady | 39 * kPreWarmLoops_State: We prewarm the gpu before auto tuni
ng to enter a steady |
39 * work state | 40 * work state |
40 * kTuneLoops_State: Then we tune the loops of the bench
mark to ensure we | 41 * kTuneLoops_State: Then we tune the loops of the bench
mark to ensure we |
41 * are doing a measurable amount of wo
rk | 42 * are doing a measurable amount of wo
rk |
42 * kPreWarmTimingPerCanvasPreDraw_State: Because reset the context after tun
ing loops to ensure | 43 * kPreTiming_State: Because reset the context after tun
ing loops to ensure |
43 * coherent state, we need to give the
benchmark | 44 * coherent state, we need to restart
before timing |
44 * another hook | 45 * kTiming_State: Finally we time the benchmark. In
this case we |
45 * kPreWarmTiming_State: We prewarm the gpu again to enter a
steady state | 46 * continue running and displaying ben
chmark data |
46 * kTiming_State: Finally we time the benchmark. Whe
n finished timing | 47 * until we quit or switch to another
benchmark |
47 * if we have enough samples then we'l
l start the next | 48 * kAdvance_State: Advance to the next benchmark in th
e stream |
48 * benchmark in the kPreWarmLoopsPerCa
nvasPreDraw_State. | |
49 * otherwise, we enter the | |
50 * kPreWarmTimingPerCanvasPreDraw_Stat
e for another sample | |
51 * In either case we reset the context
. | |
52 */ | 49 */ |
53 enum State { | 50 enum State { |
54 kPreWarmLoopsPerCanvasPreDraw_State, | 51 kPreWarmLoopsPerCanvasPreDraw_State, |
55 kPreWarmLoops_State, | 52 kPreWarmLoops_State, |
56 kTuneLoops_State, | 53 kTuneLoops_State, |
57 kPreWarmTimingPerCanvasPreDraw_State, | 54 kPreTiming_State, |
58 kPreWarmTiming_State, | |
59 kTiming_State, | 55 kTiming_State, |
| 56 kAdvance_State, |
60 }; | 57 }; |
61 void setTitle(); | 58 void setTitle(); |
62 bool setupBackend(); | 59 bool setupBackend(); |
63 void setupRenderTarget(); | 60 void setupRenderTarget(); |
64 void printStats(); | 61 void drawStats(SkCanvas*); |
65 bool advanceRecordIfNecessary(SkCanvas*); | 62 bool advanceRecordIfNecessary(SkCanvas*); |
66 inline void renderFrame(SkCanvas*); | 63 inline void renderFrame(SkCanvas*); |
67 inline void nextState(State); | 64 inline void nextState(State); |
68 void perCanvasPreDraw(SkCanvas*, State); | 65 void perCanvasPreDraw(SkCanvas*, State); |
69 void preWarm(State nextState); | 66 void preWarm(State nextState); |
70 void scaleLoops(double elapsedMs); | 67 void scaleLoops(double elapsedMs); |
71 inline void tuneLoops(); | 68 inline void tuneLoops(SkCanvas*); |
72 inline void timing(SkCanvas*); | 69 inline void timing(SkCanvas*); |
73 inline double elapsed(); | 70 inline double elapsed(); |
74 void resetTimingState(); | 71 void resetTimingState(); |
75 void postDraw(SkCanvas*); | 72 void postDraw(SkCanvas*); |
76 void recordMeasurement(); | 73 void recordMeasurement(); |
77 | 74 |
78 struct Record { | 75 static const int kMeasurementCount = 64; // should be power of 2 for fast m
od |
79 SkTArray<double> fMeasurements; | 76 double fMeasurements[kMeasurementCount]; |
80 }; | 77 int fCurrentMeasurement; |
81 | 78 |
82 int fCurrentSample; | |
83 int fCurrentFrame; | 79 int fCurrentFrame; |
84 int fLoops; | 80 int fLoops; |
85 SkTArray<Record> fRecords; | |
86 WallTimer fTimer; | 81 WallTimer fTimer; |
87 State fState; | 82 State fState; |
88 SkAutoTDelete<VisualBenchmarkStream> fBenchmarkStream; | 83 SkAutoTDelete<VisualBenchmarkStream> fBenchmarkStream; |
89 SkAutoTUnref<Benchmark> fBenchmark; | 84 SkAutoTUnref<Benchmark> fBenchmark; |
90 | 85 |
91 // support framework | 86 // support framework |
92 SkAutoTUnref<VisualBench> fOwner; | 87 SkAutoTUnref<VisualBench> fOwner; |
93 SkAutoTDelete<ResultsWriter> fResults; | |
94 | 88 |
95 typedef VisualModule INHERITED; | 89 typedef VisualModule INHERITED; |
96 }; | 90 }; |
97 | 91 |
98 #endif | 92 #endif |
OLD | NEW |