blob: f41bcaebab2e03cdad83df75516a0684e81f7ebc [file] [log] [blame]
jvanverthf5d1b2d2015-09-15 07:40:56 -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
9#include "VisualInteractiveModule.h"
10
11#include "ProcStats.h"
12#include "SkApplication.h"
13#include "SkCanvas.h"
14#include "SkCommandLineFlags.h"
15#include "SkForceLinking.h"
16#include "SkGraphics.h"
17#include "SkGr.h"
18#include "SkImageDecoder.h"
19#include "SkOSFile.h"
20#include "SkStream.h"
21#include "Stats.h"
22#include "gl/GrGLInterface.h"
23
24__SK_FORCE_IMAGE_DECODER_LINKING;
25
jvanverthf5d1b2d2015-09-15 07:40:56 -070026VisualInteractiveModule::VisualInteractiveModule(VisualBench* owner)
27 : fCurrentMeasurement(0)
jvanverthf5d1b2d2015-09-15 07:40:56 -070028 , fBenchmark(nullptr)
joshualittdc5db592015-10-05 13:24:55 -070029 , fAdvance(false)
jvanverthf5d1b2d2015-09-15 07:40:56 -070030 , fOwner(SkRef(owner)) {
31 fBenchmarkStream.reset(new VisualBenchmarkStream);
32
33 memset(fMeasurements, 0, sizeof(fMeasurements));
34}
35
36inline void VisualInteractiveModule::renderFrame(SkCanvas* canvas) {
joshualittdc5db592015-10-05 13:24:55 -070037 fBenchmark->draw(fTSM.loops(), canvas);
jvanverthf5d1b2d2015-09-15 07:40:56 -070038 this->drawStats(canvas);
39 canvas->flush();
40 fOwner->present();
41}
42
43void VisualInteractiveModule::drawStats(SkCanvas* canvas) {
44 static const float kPixelPerMS = 2.0f;
45 static const int kDisplayWidth = 130;
46 static const int kDisplayHeight = 100;
47 static const int kDisplayPadding = 10;
48 static const int kGraphPadding = 3;
49 static const float kBaseMS = 1000.f / 60.f; // ms/frame to hit 60 fps
50
51 SkISize canvasSize = canvas->getDeviceSize();
52 SkRect rect = SkRect::MakeXYWH(SkIntToScalar(canvasSize.fWidth-kDisplayWidth-kDisplayPadding),
53 SkIntToScalar(kDisplayPadding),
54 SkIntToScalar(kDisplayWidth), SkIntToScalar(kDisplayHeight));
55 SkPaint paint;
56 canvas->clipRect(rect);
57 paint.setColor(SK_ColorBLACK);
58 canvas->drawRect(rect, paint);
59 // draw the 16ms line
60 paint.setColor(SK_ColorLTGRAY);
61 canvas->drawLine(rect.fLeft, rect.fBottom - kBaseMS*kPixelPerMS,
62 rect.fRight, rect.fBottom - kBaseMS*kPixelPerMS, paint);
63 paint.setColor(SK_ColorRED);
64 paint.setStyle(SkPaint::kStroke_Style);
65 canvas->drawRect(rect, paint);
66
67 int x = SkScalarTruncToInt(rect.fLeft) + kGraphPadding;
68 const int xStep = 2;
69 const int startY = SkScalarTruncToInt(rect.fBottom);
70 int i = fCurrentMeasurement;
71 do {
72 int endY = startY - (int)(fMeasurements[i] * kPixelPerMS + 0.5); // round to nearest value
73 canvas->drawLine(SkIntToScalar(x), SkIntToScalar(startY),
74 SkIntToScalar(x), SkIntToScalar(endY), paint);
75 i++;
76 i &= (kMeasurementCount - 1); // fast mod
77 x += xStep;
78 } while (i != fCurrentMeasurement);
79
80}
81
82bool VisualInteractiveModule::advanceRecordIfNecessary(SkCanvas* canvas) {
83 if (fBenchmark) {
84 return true;
85 }
86
87 fBenchmark.reset(fBenchmarkStream->next());
88 if (!fBenchmark) {
89 return false;
90 }
91
92 // clear both buffers
93 fOwner->clear(canvas, SK_ColorWHITE, 2);
94
joshualitt8a6697a2015-09-30 12:11:07 -070095 fBenchmark->delayedSetup();
jvanverthf5d1b2d2015-09-15 07:40:56 -070096
97 return true;
98}
joshualittdc5db592015-10-05 13:24:55 -070099#include "GrGpu.h"
100#include "GrResourceCache.h"
jvanverthf5d1b2d2015-09-15 07:40:56 -0700101void VisualInteractiveModule::draw(SkCanvas* canvas) {
102 if (!this->advanceRecordIfNecessary(canvas)) {
103 SkDebugf("Exiting VisualBench successfully\n");
104 fOwner->closeWindow();
105 return;
106 }
107 this->renderFrame(canvas);
joshualittdc5db592015-10-05 13:24:55 -0700108 TimingStateMachine::ParentEvents event = fTSM.nextFrame(canvas, fBenchmark);
109 switch (event) {
110 case TimingStateMachine::kReset_ParentEvents:
111 fOwner->reset();
jvanverthf5d1b2d2015-09-15 07:40:56 -0700112 break;
joshualittdc5db592015-10-05 13:24:55 -0700113 case TimingStateMachine::kTiming_ParentEvents:
jvanverthf5d1b2d2015-09-15 07:40:56 -0700114 break;
joshualittdc5db592015-10-05 13:24:55 -0700115 case TimingStateMachine::kTimingFinished_ParentEvents:
116 // Record measurements
117 fMeasurements[fCurrentMeasurement++] = fTSM.lastMeasurement();
118 fCurrentMeasurement &= (kMeasurementCount-1); // fast mod
119 SkASSERT(fCurrentMeasurement < kMeasurementCount);
120 this->drawStats(canvas);
121 if (fAdvance) {
122 fAdvance = false;
123 fTSM.nextBenchmark(canvas, fBenchmark);
124 fBenchmark.reset(nullptr);
125 fOwner->reset();
126 } else {
127 fTSM.nextSample();
128 }
jvanverthf5d1b2d2015-09-15 07:40:56 -0700129 break;
jvanverthf5d1b2d2015-09-15 07:40:56 -0700130 }
131}
132
133bool VisualInteractiveModule::onHandleChar(SkUnichar c) {
134 if (' ' == c) {
joshualittdc5db592015-10-05 13:24:55 -0700135 fAdvance = true;
jvanverthf5d1b2d2015-09-15 07:40:56 -0700136 }
137
138 return true;
139}