Factor out VisualBench timing code into a helper class

BUG=skia:

Review URL: https://codereview.chromium.org/1375363003
diff --git a/tools/VisualBench/VisualLightweightBenchModule.h b/tools/VisualBench/VisualLightweightBenchModule.h
index 1a30875..ffa109d 100644
--- a/tools/VisualBench/VisualLightweightBenchModule.h
+++ b/tools/VisualBench/VisualLightweightBenchModule.h
@@ -13,7 +13,7 @@
 
 #include "ResultsWriter.h"
 #include "SkPicture.h"
-#include "Timer.h"
+#include "TimingStateMachine.h"
 #include "VisualBench.h"
 #include "VisualBenchmarkStream.h"
 
@@ -32,65 +32,21 @@
     bool onHandleChar(SkUnichar c) override;
 
 private:
-    /*
-     * The heart of visual bench is an event driven timing loop.
-     * kWarmup_State:                        We run a dummy bench to let things settle on startup
-     * kPreWarmLoopsPerCanvasPreDraw_State:  Before we begin timing, Benchmarks have a hook to
-     *                                       access the canvas.  Then we prewarm before the autotune
-     *                                       loops step.
-     * kPreWarmLoops_State:                  We prewarm the gpu before auto tuning to enter a steady
-     *                                       work state
-     * kTuneLoops_State:                     Then we tune the loops of the benchmark to ensure we
-     *                                       are doing a measurable amount of work
-     * kPreWarmTimingPerCanvasPreDraw_State: Because reset the context after tuning loops to ensure
-     *                                       coherent state, we need to give the benchmark
-     *                                       another hook
-     * kPreWarmTiming_State:                 We prewarm the gpu again to enter a steady state
-     * kTiming_State:                        Finally we time the benchmark.  When finished timing
-     *                                       if we have enough samples then we'll start the next
-     *                                       benchmark in the kPreWarmLoopsPerCanvasPreDraw_State.
-     *                                       otherwise, we enter the
-     *                                       kPreWarmTimingPerCanvasPreDraw_State for another sample
-     *                                       In either case we reset the context.
-     */
-    enum State {
-        kWarmup_State,
-        kPreWarmLoopsPerCanvasPreDraw_State,
-        kPreWarmLoops_State,
-        kTuneLoops_State,
-        kPreWarmTimingPerCanvasPreDraw_State,
-        kPreWarmTiming_State,
-        kTiming_State,
-    };
     void setTitle();
     bool setupBackend();
     void setupRenderTarget();
     void printStats();
     bool advanceRecordIfNecessary(SkCanvas*);
     inline void renderFrame(SkCanvas*);
-    inline void nextState(State);
-    void perCanvasPreDraw(SkCanvas*, State);
-    void preWarm(State nextState);
-    inline void tuneLoops();
-    inline void timing(SkCanvas*);
-    inline double elapsed();
-    void resetTimingState();
-    void postDraw(SkCanvas*);
-    void recordMeasurement();
-    void warmup(SkCanvas* canvas);
 
     struct Record {
         SkTArray<double> fMeasurements;
     };
-
     int fCurrentSample;
-    int fCurrentFrame;
-    int fLoops;
     SkTArray<Record> fRecords;
-    WallTimer fTimer;
-    State fState;
     SkAutoTDelete<VisualBenchmarkStream> fBenchmarkStream;
     SkAutoTUnref<Benchmark> fBenchmark;
+    TimingStateMachine fTSM;
 
     // support framework
     SkAutoTUnref<VisualBench> fOwner;