Thread through a flag to force SkPicture::playback() when recording subpictures.

This makes nanobench picture recording benchmarks somewhat useful again,
as opposed to all taking about 5us to run no matter the content.

ATTN Sheriff: this will probably trigger perf.skia.org alerts.

BUG=skia:

Review URL: https://codereview.chromium.org/1219873002
diff --git a/src/core/SkRecorder.cpp b/src/core/SkRecorder.cpp
index 6d7e5ee..a9d9ba9 100644
--- a/src/core/SkRecorder.cpp
+++ b/src/core/SkRecorder.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "SkBigPicture.h"
+#include "SkCanvasPriv.h"
 #include "SkPatchUtils.h"
 #include "SkPicture.h"
 #include "SkPictureUtils.h"
@@ -35,18 +36,22 @@
 
 SkRecorder::SkRecorder(SkRecord* record, int width, int height, SkMiniRecorder* mr)
     : SkCanvas(SkIRect::MakeWH(width, height), SkCanvas::kConservativeRasterClip_InitFlag)
+    , fDrawPictureMode(Record_DrawPictureMode)
     , fApproxBytesUsedBySubPictures(0)
     , fRecord(record)
     , fMiniRecorder(mr) {}
 
 SkRecorder::SkRecorder(SkRecord* record, const SkRect& bounds, SkMiniRecorder* mr)
     : SkCanvas(bounds.roundOut(), SkCanvas::kConservativeRasterClip_InitFlag)
+    , fDrawPictureMode(Record_DrawPictureMode)
     , fApproxBytesUsedBySubPictures(0)
     , fRecord(record)
     , fMiniRecorder(mr) {}
 
-void SkRecorder::reset(SkRecord* record, const SkRect& bounds, SkMiniRecorder* mr) {
+void SkRecorder::reset(SkRecord* record, const SkRect& bounds,
+                       DrawPictureMode dpm, SkMiniRecorder* mr) {
     this->forgetRecord();
+    fDrawPictureMode = dpm;
     fRecord = record;
     this->resetForNextPicture(bounds.roundOut());
     fMiniRecorder = mr;
@@ -254,8 +259,14 @@
 }
 
 void SkRecorder::onDrawPicture(const SkPicture* pic, const SkMatrix* matrix, const SkPaint* paint) {
-    fApproxBytesUsedBySubPictures += SkPictureUtils::ApproximateBytesUsed(pic);
-    APPEND(DrawPicture, this->copy(paint), pic, matrix ? *matrix : SkMatrix::I());
+    if (fDrawPictureMode == Record_DrawPictureMode) {
+        fApproxBytesUsedBySubPictures += SkPictureUtils::ApproximateBytesUsed(pic);
+        APPEND(DrawPicture, this->copy(paint), pic, matrix ? *matrix : SkMatrix::I());
+    } else {
+        SkASSERT(fDrawPictureMode == Playback_DrawPictureMode);
+        SkAutoCanvasMatrixPaint acmp(this, matrix, paint, pic->cullRect());
+        pic->playback(this);
+    }
 }
 
 void SkRecorder::onDrawVertices(VertexMode vmode,