Add measurement command line args to SampleApp

This way, we may be able to use SampleApp as a performance benchmark
tool that's closer to real-world use cases than nanobench.

For example, we can now run

./out/Release/SampleApp --slide Chart --backendTiles 8 --measureMS 2000

to test the threaded backend.

Bug: skia:
Change-Id: I92b177624bc8d16c5b4d3ad122319882e8783101
Reviewed-on: https://skia-review.googlesource.com/50801
Reviewed-by: Mike Reed <reed@google.com>
Commit-Queue: Yuqian Li <liyuqian@google.com>
diff --git a/samplecode/SampleApp.cpp b/samplecode/SampleApp.cpp
index 6cb6785..1c652ea 100644
--- a/samplecode/SampleApp.cpp
+++ b/samplecode/SampleApp.cpp
@@ -7,6 +7,7 @@
 
 #include "SampleApp.h"
 
+#include "SkCommonFlags.h"
 #include "OverView.h"
 #include "Resources.h"
 #include "SampleCode.h"
@@ -757,6 +758,10 @@
 DEFINE_int32(msaa, 0, "Request multisampling with this count.");
 DEFINE_bool(deepColor, false, "Request deep color (10-bit/channel or more) display buffer.");
 #endif
+DEFINE_int32(backendTiles, 0, "Number of tiles in the experimental threaded backend.");
+DEFINE_int32(backendThreads, 0, "Number of threads in the experimental threaded backend.");
+DEFINE_int32(measureMS, 0, "Number of miliseconds to measure the FPS before closing the SampleApp. "
+                           "If it's 0, we won't measure the FPS or close SampleApp automatically.");
 
 #include "SkTaskGroup.h"
 
@@ -923,6 +928,22 @@
     fSaveToPdf = false;
     fSaveToSKP = false;
 
+    gSkUseAnalyticAA = FLAGS_analyticAA;
+    gSkUseDeltaAA = FLAGS_deltaAA;
+    if (FLAGS_forceAnalyticAA) {
+        gSkForceAnalyticAA = true;
+    }
+    if (FLAGS_forceDeltaAA) {
+        gSkForceDeltaAA = true;
+    }
+    fTiles = FLAGS_backendTiles;
+    fThreads = FLAGS_backendThreads;
+    fMeasureMS = FLAGS_measureMS;
+    if (FLAGS_measureMS > 0) {
+        SkASSERT(fMeasureFPS == false);
+        toggleFPS();
+    }
+
     if (true) {
         fPipeSerializer.setTypefaceSerializer(new SampleTFSerializer);
         fPipeDeserializer.setTypefaceDeserializer(new SampleTFDeserializer);
@@ -1042,6 +1063,10 @@
 }
 
 SampleWindow::~SampleWindow() {
+    if (fMeasureFPS) {
+        SkDebugf("Average frame time of the last slide: %.4f ms\n",
+                 fCumulativeFPS_Time / (float)SkTMax(1, fCumulativeFPS_Count));
+    }
     SkSafeUnref(fDevManager);
 }
 
@@ -2261,6 +2286,10 @@
 }
 
 void SampleWindow::updateTitle() {
+    if (fMeasureMS > 0 && (int)gAnimTimer.msec() > fMeasureMS) {
+        this->closeWindow();
+    }
+
     SkString title;
     if (!this->getRawTitle(&title)) {
         title.set("<unknown>");
diff --git a/samplecode/SampleApp.h b/samplecode/SampleApp.h
index 52f041a..9f7b5db 100644
--- a/samplecode/SampleApp.h
+++ b/samplecode/SampleApp.h
@@ -254,6 +254,8 @@
     int fThreads = 0;
     std::unique_ptr<SkExecutor> fExecutor;
 
+    int fMeasureMS; // the number of milliseconds to measure the FPS before we close the SampleApp
+
     void loadView(SkView*);
     void updateTitle();
     bool getRawTitle(SkString*);