| Index: tools/VisualBench/VisualInteractiveModule.cpp
|
| diff --git a/tools/VisualBench/VisualInteractiveModule.cpp b/tools/VisualBench/VisualInteractiveModule.cpp
|
| index af922a92bf10352cc422da9abbea92e15904847e..f41bcaebab2e03cdad83df75516a0684e81f7ebc 100755
|
| --- a/tools/VisualBench/VisualInteractiveModule.cpp
|
| +++ b/tools/VisualBench/VisualInteractiveModule.cpp
|
| @@ -23,16 +23,10 @@
|
|
|
| __SK_FORCE_IMAGE_DECODER_LINKING;
|
|
|
| -static const int kGpuFrameLag = 5;
|
| -static const int kFrames = 5;
|
| -static const double kLoopMs = 5;
|
| -
|
| VisualInteractiveModule::VisualInteractiveModule(VisualBench* owner)
|
| : fCurrentMeasurement(0)
|
| - , fCurrentFrame(0)
|
| - , fLoops(1)
|
| - , fState(kPreWarmLoops_State)
|
| , fBenchmark(nullptr)
|
| + , fAdvance(false)
|
| , fOwner(SkRef(owner)) {
|
| fBenchmarkStream.reset(new VisualBenchmarkStream);
|
|
|
| @@ -40,7 +34,7 @@ VisualInteractiveModule::VisualInteractiveModule(VisualBench* owner)
|
| }
|
|
|
| inline void VisualInteractiveModule::renderFrame(SkCanvas* canvas) {
|
| - fBenchmark->draw(fLoops, canvas);
|
| + fBenchmark->draw(fTSM.loops(), canvas);
|
| this->drawStats(canvas);
|
| canvas->flush();
|
| fOwner->present();
|
| @@ -102,7 +96,8 @@ bool VisualInteractiveModule::advanceRecordIfNecessary(SkCanvas* canvas) {
|
|
|
| return true;
|
| }
|
| -
|
| +#include "GrGpu.h"
|
| +#include "GrResourceCache.h"
|
| void VisualInteractiveModule::draw(SkCanvas* canvas) {
|
| if (!this->advanceRecordIfNecessary(canvas)) {
|
| SkDebugf("Exiting VisualBench successfully\n");
|
| @@ -110,123 +105,34 @@ void VisualInteractiveModule::draw(SkCanvas* canvas) {
|
| return;
|
| }
|
| this->renderFrame(canvas);
|
| - switch (fState) {
|
| - case kPreWarmLoopsPerCanvasPreDraw_State: {
|
| - this->perCanvasPreDraw(canvas, kPreWarmLoops_State);
|
| - break;
|
| - }
|
| - case kPreWarmLoops_State: {
|
| - this->preWarm(kTuneLoops_State);
|
| - break;
|
| - }
|
| - case kTuneLoops_State: {
|
| - this->tuneLoops(canvas);
|
| + TimingStateMachine::ParentEvents event = fTSM.nextFrame(canvas, fBenchmark);
|
| + switch (event) {
|
| + case TimingStateMachine::kReset_ParentEvents:
|
| + fOwner->reset();
|
| break;
|
| - }
|
| - case kPreTiming_State: {
|
| - fBenchmark->perCanvasPreDraw(canvas);
|
| - fBenchmark->preDraw(canvas);
|
| - fCurrentFrame = 0;
|
| - fTimer.start();
|
| - fState = kTiming_State;
|
| - // fall to next state
|
| - }
|
| - case kTiming_State: {
|
| - this->timing(canvas);
|
| + case TimingStateMachine::kTiming_ParentEvents:
|
| break;
|
| - }
|
| - case kAdvance_State: {
|
| - this->postDraw(canvas);
|
| - this->nextState(kPreWarmLoopsPerCanvasPreDraw_State);
|
| + case TimingStateMachine::kTimingFinished_ParentEvents:
|
| + // Record measurements
|
| + fMeasurements[fCurrentMeasurement++] = fTSM.lastMeasurement();
|
| + fCurrentMeasurement &= (kMeasurementCount-1); // fast mod
|
| + SkASSERT(fCurrentMeasurement < kMeasurementCount);
|
| + this->drawStats(canvas);
|
| + if (fAdvance) {
|
| + fAdvance = false;
|
| + fTSM.nextBenchmark(canvas, fBenchmark);
|
| + fBenchmark.reset(nullptr);
|
| + fOwner->reset();
|
| + } else {
|
| + fTSM.nextSample();
|
| + }
|
| break;
|
| - }
|
| - }
|
| -}
|
| -
|
| -inline void VisualInteractiveModule::nextState(State nextState) {
|
| - fState = nextState;
|
| -}
|
| -
|
| -void VisualInteractiveModule::perCanvasPreDraw(SkCanvas* canvas, State nextState) {
|
| - fBenchmark->perCanvasPreDraw(canvas);
|
| - fBenchmark->preDraw(canvas);
|
| - fCurrentFrame = 0;
|
| - this->nextState(nextState);
|
| -}
|
| -
|
| -void VisualInteractiveModule::preWarm(State nextState) {
|
| - if (fCurrentFrame >= kGpuFrameLag) {
|
| - // we currently time across all frames to make sure we capture all GPU work
|
| - this->nextState(nextState);
|
| - fCurrentFrame = 0;
|
| - fTimer.start();
|
| - } else {
|
| - fCurrentFrame++;
|
| - }
|
| -}
|
| -
|
| -inline double VisualInteractiveModule::elapsed() {
|
| - fTimer.end();
|
| - return fTimer.fWall;
|
| -}
|
| -
|
| -void VisualInteractiveModule::resetTimingState() {
|
| - fCurrentFrame = 0;
|
| - fTimer = WallTimer();
|
| - fOwner->reset();
|
| -}
|
| -
|
| -void VisualInteractiveModule::scaleLoops(double elapsedMs) {
|
| - // Scale back the number of loops
|
| - fLoops = (int)ceil(fLoops * kLoopMs / elapsedMs);
|
| -}
|
| -
|
| -inline void VisualInteractiveModule::tuneLoops(SkCanvas* canvas) {
|
| - if (1 << 30 == fLoops) {
|
| - // We're about to wrap. Something's wrong with the bench.
|
| - SkDebugf("InnerLoops wrapped\n");
|
| - fLoops = 0;
|
| - } else {
|
| - double elapsedMs = this->elapsed();
|
| - if (elapsedMs > kLoopMs) {
|
| - this->scaleLoops(elapsedMs);
|
| - fBenchmark->perCanvasPostDraw(canvas);
|
| - this->nextState(kPreTiming_State);
|
| - } else {
|
| - fLoops *= 2;
|
| - this->nextState(kPreWarmLoops_State);
|
| - }
|
| - this->resetTimingState();
|
| - }
|
| -}
|
| -
|
| -void VisualInteractiveModule::recordMeasurement() {
|
| - double measurement = this->elapsed() / (kFrames * fLoops);
|
| - fMeasurements[fCurrentMeasurement++] = measurement;
|
| - fCurrentMeasurement &= (kMeasurementCount-1); // fast mod
|
| - SkASSERT(fCurrentMeasurement < kMeasurementCount);
|
| -}
|
| -
|
| -void VisualInteractiveModule::postDraw(SkCanvas* canvas) {
|
| - fBenchmark->postDraw(canvas);
|
| - fBenchmark->perCanvasPostDraw(canvas);
|
| - fBenchmark.reset(nullptr);
|
| - fLoops = 1;
|
| -}
|
| -
|
| -inline void VisualInteractiveModule::timing(SkCanvas* canvas) {
|
| - if (fCurrentFrame >= kFrames) {
|
| - this->recordMeasurement();
|
| - fTimer.start();
|
| - fCurrentFrame = 0;
|
| - } else {
|
| - fCurrentFrame++;
|
| }
|
| }
|
|
|
| bool VisualInteractiveModule::onHandleChar(SkUnichar c) {
|
| if (' ' == c) {
|
| - this->nextState(kAdvance_State);
|
| + fAdvance = true;
|
| }
|
|
|
| return true;
|
|
|