Provide an option to bench drawing individual tiles in bench_pictures.

Provides output like the following:
running bench [1236 12045] androidpolice.skp
  tile_256x256: tile [0,0] out of [5,48]: msecs =   1.00
  tile_256x256: tile [1,0] out of [5,48]: msecs =   1.50
  tile_256x256: tile [2,0] out of [5,48]: msecs =   1.00
  tile_256x256: tile [3,0] out of [5,48]: msecs =   1.50
  tile_256x256: tile [4,0] out of [5,48]: msecs =   2.50
  tile_256x256: tile [0,1] out of [5,48]: msecs =   2.00
  tile_256x256: tile [1,1] out of [5,48]: msecs =   3.50
  tile_256x256: tile [2,1] out of [5,48]: msecs =   3.50
  tile_256x256: tile [3,1] out of [5,48]: msecs =   6.00
  tile_256x256: tile [4,1] out of [5,48]: msecs =   2.50
  tile_256x256: tile [0,2] out of [5,48]: msecs =   2.00

BUG=https://code.google.com/p/skia/issues/detail?id=1016

Review URL: https://codereview.appspot.com/6937047

git-svn-id: http://skia.googlecode.com/svn/trunk@6805 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/tools/PictureBenchmark.cpp b/tools/PictureBenchmark.cpp
index ca7795f..bdf1306 100644
--- a/tools/PictureBenchmark.cpp
+++ b/tools/PictureBenchmark.cpp
@@ -27,6 +27,7 @@
 , fShowCpuTime(true)
 , fShowTruncatedCpuTime(false)
 , fShowGpuTime(false)
+, fTimeIndividualTiles(false)
 {}
 
 PictureBenchmark::~PictureBenchmark() {
@@ -37,12 +38,9 @@
 #if SK_SUPPORT_GPU
     if (fRenderer != NULL && fRenderer->isUsingGpuDevice()) {
         return SkNEW_ARGS(BenchTimer, (fRenderer->getGLContext()));
-    } else {
-        return SkNEW_ARGS(BenchTimer, (NULL));
     }
-#else
-    return SkNEW_ARGS(BenchTimer, (NULL));
 #endif
+    return SkNEW_ARGS(BenchTimer, (NULL));
 }
 
 void PictureBenchmark::logProgress(const char msg[]) {
@@ -80,29 +78,67 @@
     usingGpu = fRenderer->isUsingGpuDevice();
 #endif
 
-    TimerData timerData(fRenderer->getPerIterTimeFormat(), fRenderer->getNormalTimeFormat());
-    for (int i = 0; i < fRepeats; ++i) {
-        fRenderer->setup();
+    if (fTimeIndividualTiles) {
+        TiledPictureRenderer* tiledRenderer = fRenderer->getTiledRenderer();
+        SkASSERT(tiledRenderer);
+        if (NULL == tiledRenderer) {
+            return;
+        }
+        int xTiles, yTiles;
+        if (!tiledRenderer->tileDimensions(xTiles, yTiles)) {
+            return;
+        }
 
-        timer->start();
-        fRenderer->render(NULL);
-        timer->truncatedEnd();
+        // Insert a newline so that each tile is reported on its own line (separate from the line
+        // that describes the skp being run).
+        this->logProgress("\n");
 
-        // Finishes gl context
-        fRenderer->resetState();
-        timer->end();
+        int x, y;
+        while (tiledRenderer->nextTile(x, y)) {
+            TimerData timerData(tiledRenderer->getPerIterTimeFormat(),
+                                tiledRenderer->getNormalTimeFormat());
+            for (int i = 0; i < fRepeats; ++i) {
+                timer->start();
+                tiledRenderer->drawCurrentTile();
+                timer->truncatedEnd();
+                tiledRenderer->resetState();
+                timer->end();
+                timerData.appendTimes(timer, fRepeats - 1 == i);
+            }
+            SkString configName = tiledRenderer->getConfigName();
+            configName.appendf(": tile [%i,%i] out of [%i,%i]", x, y, xTiles, yTiles);
+            SkString result = timerData.getResult(fLogPerIter, fPrintMin, fRepeats,
+                                                  configName.c_str(), fShowWallTime,
+                                                  fShowTruncatedWallTime, fShowCpuTime,
+                                                  fShowTruncatedCpuTime, usingGpu && fShowGpuTime);
+            result.append("\n");
+            this->logProgress(result.c_str());
+        }
+    } else {
+        TimerData timerData(fRenderer->getPerIterTimeFormat(), fRenderer->getNormalTimeFormat());
+        for (int i = 0; i < fRepeats; ++i) {
+            fRenderer->setup();
 
-        timerData.appendTimes(timer, fRepeats - 1 == i);
+            timer->start();
+            fRenderer->render(NULL);
+            timer->truncatedEnd();
+
+            // Finishes gl context
+            fRenderer->resetState();
+            timer->end();
+
+            timerData.appendTimes(timer, fRepeats - 1 == i);
+        }
+
+        SkString configName = fRenderer->getConfigName();
+        SkString result = timerData.getResult(fLogPerIter, fPrintMin, fRepeats,
+                                              configName.c_str(), fShowWallTime,
+                                              fShowTruncatedWallTime, fShowCpuTime,
+                                              fShowTruncatedCpuTime, usingGpu && fShowGpuTime);
+        result.append("\n");
+        this->logProgress(result.c_str());
     }
 
-    SkString configName = fRenderer->getConfigName();
-    SkString result = timerData.getResult(fLogPerIter, fPrintMin, fRepeats,
-                                          configName.c_str(), fShowWallTime, fShowTruncatedWallTime,
-                                          fShowCpuTime, fShowTruncatedCpuTime,
-                                          usingGpu && fShowGpuTime);
-    result.append("\n");
-    this->logProgress(result.c_str());
-
     fRenderer->end();
     SkDELETE(timer);
 }