Perform multi core rendering in bench_pictures.

Add a flag in SkGPipeWriter for threadsafe drawing.

Add a deferred pipe controller to SamplePipeControllers, which can
be called to play back in multiple threads.

Depends on http://codereview.appspot.com/6459105/

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

git-svn-id: http://skia.googlecode.com/svn/trunk@5371 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/tools/PictureBenchmark.cpp b/tools/PictureBenchmark.cpp
index d24bb8b..29152f8 100644
--- a/tools/PictureBenchmark.cpp
+++ b/tools/PictureBenchmark.cpp
@@ -194,13 +194,16 @@
     }
 
     SkString result;
+    if (fRenderer.isMultiThreaded()) {
+        result.printf("multithreaded using %s ", (fRenderer.isUsePipe() ? "pipe" : "picture"));
+    }
     if (fRenderer.getTileMinPowerOf2Width() > 0) {
-        result.printf("%i_pow2tiles_%iminx%i: msecs = %6.2f", fRenderer.numTiles(),
-                      fRenderer.getTileMinPowerOf2Width(), fRenderer.getTileHeight(),
-                      wall_time / fRepeats);
+        result.appendf("%i_pow2tiles_%iminx%i: msecs = %6.2f", fRenderer.numTiles(),
+                       fRenderer.getTileMinPowerOf2Width(), fRenderer.getTileHeight(),
+                       wall_time / fRepeats);
     } else {
-        result.printf("%i_tiles_%ix%i: msecs = %6.2f", fRenderer.numTiles(),
-                      fRenderer.getTileWidth(), fRenderer.getTileHeight(), wall_time / fRepeats);
+        result.appendf("%i_tiles_%ix%i: msecs = %6.2f", fRenderer.numTiles(),
+                       fRenderer.getTileWidth(), fRenderer.getTileHeight(), wall_time / fRepeats);
     }
 #if SK_SUPPORT_GPU
     if (fRenderer.isUsingGpuDevice()) {