Index: tools/VisualBench/VisualBench.h |
diff --git a/tools/VisualBench/VisualBench.h b/tools/VisualBench/VisualBench.h |
index b8cd2bdb771a866171f32c25ab40c9920641dcc2..9843693777099b433dd371a3a1c2affaf6fdd727 100644 |
--- a/tools/VisualBench/VisualBench.h |
+++ b/tools/VisualBench/VisualBench.h |
@@ -39,6 +39,34 @@ protected: |
void onSizeChange() override; |
private: |
+ /* |
+ * The heart of visual bench is an event driven timing loop. |
+ * 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 { |
+ kPreWarmLoopsPerCanvasPreDraw_State, |
+ kPreWarmLoops_State, |
+ kTuneLoops_State, |
+ kPreWarmTimingPerCanvasPreDraw_State, |
+ kPreWarmTiming_State, |
+ kTiming_State, |
+ }; |
void setTitle(); |
bool setupBackend(); |
void resetContext(); |
@@ -47,19 +75,21 @@ private: |
void printStats(); |
bool advanceRecordIfNecessary(SkCanvas*); |
inline void renderFrame(SkCanvas*); |
+ inline void nextState(State); |
+ void perCanvasPreDraw(SkCanvas*, State); |
+ void preWarm(State nextState); |
+ void scaleLoops(double elapsedMs); |
+ inline void tuneLoops(); |
+ inline void timing(SkCanvas*); |
+ inline double elapsed(); |
+ void resetTimingState(); |
+ void postDraw(SkCanvas*); |
+ void recordMeasurement(); |
struct Record { |
SkTArray<double> fMeasurements; |
}; |
- enum State { |
- kPreWarmLoops_State, |
- kTuneLoops_State, |
- kPreWarmTiming_State, |
- kTiming_State, |
- }; |
- void preWarm(State nextState); |
- |
int fCurrentSample; |
int fCurrentFrame; |
int fFlushes; |