blob: 0a57e672211a2152053545bf114200325061f9c7 [file] [log] [blame]
joshualittd0f0bce2015-10-14 07:49:28 -07001/*
2 * Copyright 2015 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#include "VisualStreamTimingModule.h"
9
10#include "SkCanvas.h"
11
12VisualStreamTimingModule::VisualStreamTimingModule(VisualBench* owner, bool preWarmBeforeSample)
joshualittc603c142015-10-15 07:18:29 -070013 : fInitState(kReset_InitState)
joshualittd0f0bce2015-10-14 07:49:28 -070014 , fPreWarmBeforeSample(preWarmBeforeSample)
15 , fOwner(owner) {
16 fBenchmarkStream.reset(new VisualBenchmarkStream);
17}
18
joshualittc603c142015-10-15 07:18:29 -070019inline void VisualStreamTimingModule::handleInitState(SkCanvas* canvas) {
20 switch (fInitState) {
21 case kNewBenchmark_InitState:
22 fOwner->clear(canvas, SK_ColorWHITE, 2);
23 fBenchmarkStream->current()->delayedSetup();
24 // fallthrough
25 case kReset_InitState:
26 fBenchmarkStream->current()->preTimingHooks(canvas);
27 break;
28 case kNone_InitState:
29 break;
joshualitta3b8c672015-10-14 14:45:07 -070030 }
joshualittc603c142015-10-15 07:18:29 -070031 fInitState = kNone_InitState;
joshualitta3b8c672015-10-14 14:45:07 -070032}
33
joshualittc603c142015-10-15 07:18:29 -070034inline void VisualStreamTimingModule::handleTimingEvent(SkCanvas* canvas,
35 TimingStateMachine::ParentEvents event) {
joshualittd0f0bce2015-10-14 07:49:28 -070036 switch (event) {
37 case TimingStateMachine::kReset_ParentEvents:
joshualittc603c142015-10-15 07:18:29 -070038 fBenchmarkStream->current()->postTimingHooks(canvas);
joshualittd0f0bce2015-10-14 07:49:28 -070039 fOwner->reset();
joshualittc603c142015-10-15 07:18:29 -070040 fInitState = kReset_InitState;
joshualittd0f0bce2015-10-14 07:49:28 -070041 break;
42 case TimingStateMachine::kTiming_ParentEvents:
43 break;
44 case TimingStateMachine::kTimingFinished_ParentEvents:
joshualittc603c142015-10-15 07:18:29 -070045 fBenchmarkStream->current()->postTimingHooks(canvas);
joshualittd0f0bce2015-10-14 07:49:28 -070046 fOwner->reset();
joshualittc603c142015-10-15 07:18:29 -070047 if (this->timingFinished(fBenchmarkStream->current(), fTSM.loops(),
48 fTSM.lastMeasurement())) {
49 fTSM.nextBenchmark();
50 if (!fBenchmarkStream->next()) {
51 SkDebugf("Exiting VisualBench successfully\n");
52 fOwner->closeWindow();
53 } else {
54 fInitState = kNewBenchmark_InitState;
55 }
joshualittd0f0bce2015-10-14 07:49:28 -070056 } else {
joshualittc603c142015-10-15 07:18:29 -070057 fInitState = kReset_InitState;
joshualittd0f0bce2015-10-14 07:49:28 -070058 }
59 break;
60 }
61}
joshualittc603c142015-10-15 07:18:29 -070062
63void VisualStreamTimingModule::draw(SkCanvas* canvas) {
64 if (!fBenchmarkStream->current()) {
65 // this should never happen but just to be safe
66 // TODO research why this does happen on mac
67 return;
68 }
69
70 this->handleInitState(canvas);
71 this->renderFrame(canvas, fBenchmarkStream->current(), fTSM.loops());
72 fOwner->present();
73 TimingStateMachine::ParentEvents event = fTSM.nextFrame(fPreWarmBeforeSample);
74 this->handleTimingEvent(canvas, event);
75}