small tidy of benchmarkstream

BUG=skia:

Review URL: https://codereview.chromium.org/1395703002
diff --git a/tools/VisualBench/TimingStateMachine.cpp b/tools/VisualBench/TimingStateMachine.cpp
index ae03f5d..85aab42 100644
--- a/tools/VisualBench/TimingStateMachine.cpp
+++ b/tools/VisualBench/TimingStateMachine.cpp
@@ -91,9 +91,7 @@
     fLastMeasurement = this->elapsed() / (FLAGS_frames * fLoops);
 }
 
-void TimingStateMachine::nextBenchmark(SkCanvas* canvas, Benchmark* benchmark) {
-    benchmark->postDraw(canvas);
-    benchmark->perCanvasPostDraw(canvas);
+void TimingStateMachine::nextBenchmark() {
     fLoops = 1;
     fInnerState = kTuning_InnerState;
     fState = kPreWarm_State;
diff --git a/tools/VisualBench/TimingStateMachine.h b/tools/VisualBench/TimingStateMachine.h
index 2215059..3f40b6d 100644
--- a/tools/VisualBench/TimingStateMachine.h
+++ b/tools/VisualBench/TimingStateMachine.h
@@ -38,10 +38,9 @@
     ParentEvents nextFrame(bool preWarmBetweenSamples);
 
     /*
-     * The caller should call this when they are ready to move to the next benchmark.  The caller
-     * must call this with the *last* benchmark so post draw hooks can be invoked
+     * The caller should call this when they are ready to move to the next benchmark.
      */
-    void nextBenchmark(SkCanvas*, Benchmark*);
+    void nextBenchmark();
 
     /*
      * When TimingStateMachine returns kTimingFinished_ParentEvents, then the owner can call
diff --git a/tools/VisualBench/VisualBenchmarkStream.cpp b/tools/VisualBench/VisualBenchmarkStream.cpp
index c520eee..49bafbf 100644
--- a/tools/VisualBench/VisualBenchmarkStream.cpp
+++ b/tools/VisualBench/VisualBenchmarkStream.cpp
@@ -74,6 +74,9 @@
             }
         }
     }
+
+    // seed with an initial benchmark
+    this->next();
 }
 
 bool VisualBenchmarkStream::ReadPicture(const char* path, SkAutoTUnref<SkPicture>* pic) {
@@ -98,23 +101,24 @@
 }
 
 Benchmark* VisualBenchmarkStream::next() {
+    Benchmark* bench;
     if (!fIsWarmedUp) {
         fIsWarmedUp = true;
-        return new WarmupBench;
+        bench = new WarmupBench;
+    } else {
+        // skips non matching benches
+        while ((bench = this->innerNext()) &&
+               (SkCommandLineFlags::ShouldSkip(FLAGS_match, bench->getUniqueName()) ||
+                !bench->isSuitableFor(Benchmark::kGPU_Backend))) {
+            bench->unref();
+        }
+    }
+    if (bench && FLAGS_cpu) {
+        bench = new CpuWrappedBenchmark(bench);
     }
 
-    Benchmark* bench;
-
-    // skips non matching benches
-    while ((bench = this->innerNext()) &&
-           (SkCommandLineFlags::ShouldSkip(FLAGS_match, bench->getUniqueName()) ||
-            !bench->isSuitableFor(Benchmark::kGPU_Backend))) {
-        bench->unref();
-    }
-    if (FLAGS_cpu) {
-        return new CpuWrappedBenchmark(bench);
-    }
-    return bench;
+    fBenchmark.reset(bench);
+    return fBenchmark;
 }
 
 Benchmark* VisualBenchmarkStream::innerNext() {
diff --git a/tools/VisualBench/VisualBenchmarkStream.h b/tools/VisualBench/VisualBenchmarkStream.h
index 9e5d459..89ca632 100644
--- a/tools/VisualBench/VisualBenchmarkStream.h
+++ b/tools/VisualBench/VisualBenchmarkStream.h
@@ -23,6 +23,7 @@
     static bool ReadPicture(const char* path, SkAutoTUnref<SkPicture>* pic);
 
     Benchmark* next();
+    Benchmark* current() { return fBenchmark.get(); }
 
 private:
     Benchmark* innerNext();
@@ -30,6 +31,7 @@
     const BenchRegistry* fBenches;
     const skiagm::GMRegistry* fGMs;
     SkTArray<SkString> fSKPs;
+    SkAutoTUnref<Benchmark> fBenchmark;
 
     const char* fSourceType;  // What we're benching: bench, GM, SKP, ...
     const char* fBenchType;   // How we bench it: micro, playback, ...
diff --git a/tools/VisualBench/VisualStreamTimingModule.cpp b/tools/VisualBench/VisualStreamTimingModule.cpp
index db75890..4148282 100644
--- a/tools/VisualBench/VisualStreamTimingModule.cpp
+++ b/tools/VisualBench/VisualStreamTimingModule.cpp
@@ -16,52 +16,43 @@
     fBenchmarkStream.reset(new VisualBenchmarkStream);
 }
 
-bool VisualStreamTimingModule::nextBenchmarkIfNecessary(SkCanvas* canvas) {
-    if (fBenchmark) {
-        return true;
-    }
-
-    fBenchmark.reset(fBenchmarkStream->next());
-    if (!fBenchmark) {
-        return false;
-    }
-
-    fOwner->clear(canvas, SK_ColorWHITE, 2);
-
-    fBenchmark->delayedSetup();
-    fBenchmark->preTimingHooks(canvas);
-    return true;
-}
-
 void VisualStreamTimingModule::draw(SkCanvas* canvas) {
-    if (!this->nextBenchmarkIfNecessary(canvas)) {
-        SkDebugf("Exiting VisualBench successfully\n");
-        fOwner->closeWindow();
+    if (!fBenchmarkStream->current()) {
+        // this should never happen but just to be safe
         return;
     }
 
     if (fReinitializeBenchmark) {
         fReinitializeBenchmark = false;
-        fBenchmark->preTimingHooks(canvas);
+        fBenchmarkStream->current()->preTimingHooks(canvas);
     }
 
-    this->renderFrame(canvas, fBenchmark, fTSM.loops());
+    this->renderFrame(canvas, fBenchmarkStream->current(), fTSM.loops());
     fOwner->present();
     TimingStateMachine::ParentEvents event = fTSM.nextFrame(fPreWarmBeforeSample);
     switch (event) {
         case TimingStateMachine::kReset_ParentEvents:
-            fBenchmark->postTimingHooks(canvas);
+            fBenchmarkStream->current()->postTimingHooks(canvas);
             fOwner->reset();
             fReinitializeBenchmark = true;
             break;
         case TimingStateMachine::kTiming_ParentEvents:
             break;
         case TimingStateMachine::kTimingFinished_ParentEvents:
-            fBenchmark->postTimingHooks(canvas);
+            fBenchmarkStream->current()->postTimingHooks(canvas);
             fOwner->reset();
-            if (this->timingFinished(fBenchmark, fTSM.loops(), fTSM.lastMeasurement())) {
-                fTSM.nextBenchmark(canvas, fBenchmark);
-                fBenchmark.reset(nullptr);
+            if (this->timingFinished(fBenchmarkStream->current(), fTSM.loops(),
+                                     fTSM.lastMeasurement())) {
+                fTSM.nextBenchmark();
+                if (!fBenchmarkStream->next()) {
+                    SkDebugf("Exiting VisualBench successfully\n");
+                    fOwner->closeWindow();
+                } else {
+                    fOwner->clear(canvas, SK_ColorWHITE, 2);
+
+                    fBenchmarkStream->current()->delayedSetup();
+                    fBenchmarkStream->current()->preTimingHooks(canvas);
+                }
             } else {
                 fReinitializeBenchmark = true;
             }
diff --git a/tools/VisualBench/VisualStreamTimingModule.h b/tools/VisualBench/VisualStreamTimingModule.h
index ac06ed4..b84f04f 100644
--- a/tools/VisualBench/VisualStreamTimingModule.h
+++ b/tools/VisualBench/VisualStreamTimingModule.h
@@ -31,11 +31,8 @@
     // subclasses should return true to advance the stream
     virtual bool timingFinished(Benchmark*, int loops, double measurement)=0;
 
-    bool nextBenchmarkIfNecessary(SkCanvas*);
-
     TimingStateMachine fTSM;
     SkAutoTDelete<VisualBenchmarkStream> fBenchmarkStream;
-    SkAutoTUnref<Benchmark> fBenchmark;
     bool fReinitializeBenchmark;
     bool fPreWarmBeforeSample;