Adding a silent playback option to SkGPipeRead
Testing state consistency after silent playback in CanvasTest indirectly
through SkDeferredCanvas.

BUG=http://code.google.com/p/chromium/issues/detail?id=146178
TEST=CanvasTest unit test, and bench with --mode deferredSilent
Review URL: https://codereview.appspot.com/6542047

git-svn-id: http://skia.googlecode.com/svn/trunk@5619 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/bench/benchmain.cpp b/bench/benchmain.cpp
index 692b0bd..19ff176 100644
--- a/bench/benchmain.cpp
+++ b/bench/benchmain.cpp
@@ -37,6 +37,7 @@
 enum benchModes {
     kNormal_benchModes,
     kDeferred_benchModes,
+    kDeferredSilent_benchModes,
     kRecord_benchModes,
     kPictureRecord_benchModes
 };
@@ -352,7 +353,7 @@
                           "[--timers [wcgWC]*] [--rotate]\n"
              "    [--scale] [--clip] [--min] [--forceAA 1|0] [--forceFilter 1|0]\n"
              "    [--forceDither 1|0] [--forceBlend 1|0] [--strokeWidth width]\n"
-             "    [--match name] [--mode normal|deferred|record|picturerecord]\n"
+             "    [--match name] [--mode normal|deferred|deferredSilent|record|picturerecord]\n"
              "    [--config 8888|565|GPU|ANGLE|NULLGPU] [-Dfoo bar] [--logFile filename]\n"
              "    [-h|--help]");
     SkDebugf("\n\n");
@@ -376,9 +377,11 @@
              "Enable/disable dithering, default is disabled.\n");
     SkDebugf("    --strokeWidth width : The width for path stroke.\n");
     SkDebugf("    --match name : Only run bench whose name is matched.\n");
-    SkDebugf("    --mode normal|deferred|record|picturerecord : Run in the corresponding mode\n"
+    SkDebugf("    --mode normal|deferred|deferredSilent|record|picturerecord :\n"
+             "             Run in the corresponding mode\n"
              "                 normal, Use a normal canvas to draw to;\n"
              "                 deferred, Use a deferrred canvas when drawing;\n"
+             "                 deferredSilent, deferred with silent playback;\n"
              "                 record, Benchmark the time to record to an SkPicture;\n"
              "                 picturerecord, Benchmark the time to do record from a \n"
              "                                SkPicture to a SkPicture.\n");
@@ -526,6 +529,8 @@
                     benchMode = kNormal_benchModes;
                 } else if (strcmp(*argv, "deferred") == 0) {
                     benchMode = kDeferred_benchModes;
+                } else if (strcmp(*argv, "deferredSilent") == 0) {
+                    benchMode = kDeferredSilent_benchModes;
                 } else if (strcmp(*argv, "record") == 0) {
                     benchMode = kRecord_benchModes;
                 } else if (strcmp(*argv, "picturerecord") == 0) {
@@ -637,9 +642,11 @@
     // report our current settings
     {
         SkString str;
+        const char* deferredMode = benchMode == kDeferred_benchModes ? "yes" :
+            (benchMode == kDeferredSilent_benchModes ? "silent" : "no");
         str.printf("skia bench: alpha=0x%02X antialias=%d filter=%d "
-                   "deferred=%d logperiter=%d",
-                   forceAlpha, forceAA, forceFilter, benchMode == kDeferred_benchModes,
+                   "deferred=%s logperiter=%d",
+                   forceAlpha, forceAA, forceFilter, deferredMode,
                    logPerIter);
         str.appendf(" rotate=%d scale=%d clip=%d min=%d",
                    doRotate, doScale, doClip, printMin);
@@ -763,6 +770,7 @@
             SkPicture pictureRecordFrom;
             SkPicture pictureRecordTo;
             switch(benchMode) {
+                case kDeferredSilent_benchModes: 
                 case kDeferred_benchModes:
                     canvas = new SkDeferredCanvas(device);
                     break;
@@ -816,7 +824,12 @@
                 } else {
                     bench->draw(canvas);
                 }
-                canvas->flush();
+
+                if (kDeferredSilent_benchModes == benchMode) {
+                    static_cast<SkDeferredCanvas*>(canvas)->silentFlush();
+                } else {
+                    canvas->flush();
+                }
 #if SK_SUPPORT_GPU
                 if (glHelper) {
                     glHelper->grContext()->flush();
@@ -842,7 +855,12 @@
                 } else {
                     bench->draw(canvas);
                 }
-                canvas->flush();
+
+                if (kDeferredSilent_benchModes == benchMode) {
+                    static_cast<SkDeferredCanvas*>(canvas)->silentFlush();
+                } else {
+                    canvas->flush();
+                }
 
                 // stop the truncated timer after the last canvas call but
                 // don't wait for all the GL calls to complete