Thread through a flag to force SkPicture::playback() when recording subpictures.
authormtklein <mtklein@chromium.org>
Wed, 1 Jul 2015 14:04:37 +0000 (07:04 -0700)
committerCommit bot <commit-bot@chromium.org>
Wed, 1 Jul 2015 14:04:37 +0000 (07:04 -0700)
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

bench/RecordingBench.cpp
include/core/SkPictureRecorder.h
src/core/SkPictureRecorder.cpp
src/core/SkRecorder.cpp
src/core/SkRecorder.h

index cd029ddf14eeb0c1242455fac6c064a08065d2bf..eada9305f968656669a995e186b2124e01f33841 100644 (file)
@@ -33,10 +33,11 @@ void RecordingBench::onDraw(const int loops, SkCanvas*) {
     const SkScalar w = fSrc->cullRect().width(),
                    h = fSrc->cullRect().height();
 
+    uint32_t flags = SkPictureRecorder::kComputeSaveLayerInfo_RecordFlag
+                   | SkPictureRecorder::kPlaybackDrawPicture_RecordFlag;
     for (int i = 0; i < loops; i++) {
         SkPictureRecorder recorder;
-        fSrc->playback(recorder.beginRecording(w, h, fUseBBH ? &factory : NULL,
-                                               SkPictureRecorder::kComputeSaveLayerInfo_RecordFlag));
+        fSrc->playback(recorder.beginRecording(w, h, fUseBBH ? &factory : NULL, flags));
         SkSafeUnref(recorder.endRecording());
     }
 }
index a84b721e44255813cc55cfdaf8cb9c99dadeceb5..811d02a36e141f6eff06a23cafc8d1f5fa7747dc 100644 (file)
@@ -33,7 +33,11 @@ public:
     enum RecordFlags {
         // This flag indicates that, if some BHH is being computed, saveLayer
         // information should also be extracted at the same time.
-        kComputeSaveLayerInfo_RecordFlag = 0x01
+        kComputeSaveLayerInfo_RecordFlag = 0x01,
+
+        // If you call drawPicture() on the recording canvas, this flag forces
+        // that to use SkPicture::playback() immediately rather than (e.g.) reffing the picture.
+        kPlaybackDrawPicture_RecordFlag  = 0x02,
     };
 
     /** Returns the canvas that records the drawing commands.
index c110e0a2db3e9b8b9282a841224478fa74054850..877314ccafd98bca89c89a19e97f3f5bcad3acef 100644 (file)
@@ -38,7 +38,10 @@ SkCanvas* SkPictureRecorder::beginRecording(const SkRect& cullRect,
     if (!fRecord) {
         fRecord.reset(SkNEW(SkRecord));
     }
-    fRecorder->reset(fRecord.get(), cullRect, &fMiniRecorder);
+    SkRecorder::DrawPictureMode dpm = (recordFlags & kPlaybackDrawPicture_RecordFlag)
+        ? SkRecorder::Playback_DrawPictureMode
+        : SkRecorder::Record_DrawPictureMode;
+    fRecorder->reset(fRecord.get(), cullRect, dpm, &fMiniRecorder);
     fActivelyRecording = true;
     return this->getRecordingCanvas();
 }
index 6d7e5ee90bf0e7a3e9fda2e41d94eda36db8ac62..a9d9ba9d14ea7d072e183879131ce68cf57816d4 100644 (file)
@@ -6,6 +6,7 @@
  */
 
 #include "SkBigPicture.h"
+#include "SkCanvasPriv.h"
 #include "SkPatchUtils.h"
 #include "SkPicture.h"
 #include "SkPictureUtils.h"
@@ -35,18 +36,22 @@ void SkDrawableList::append(SkDrawable* drawable) {
 
 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::onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y,
 }
 
 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,
index 3809ae239d059d015a60cbcc7e6f89aa7e12619e..688069bd502ef98b3ab3c3c8a5aca3e40c1d356f 100644 (file)
@@ -41,7 +41,8 @@ public:
     SkRecorder(SkRecord*, int width, int height, SkMiniRecorder* = nullptr);   // legacy version
     SkRecorder(SkRecord*, const SkRect& bounds, SkMiniRecorder* = nullptr);
 
-    void reset(SkRecord*, const SkRect& bounds, SkMiniRecorder* = nullptr);
+    enum DrawPictureMode { Record_DrawPictureMode, Playback_DrawPictureMode };
+    void reset(SkRecord*, const SkRect& bounds, DrawPictureMode, SkMiniRecorder* = nullptr);
 
     size_t approxBytesUsedBySubPictures() const { return fApproxBytesUsedBySubPictures; }
 
@@ -137,6 +138,7 @@ private:
         return devBounds;
     }
 
+    DrawPictureMode fDrawPictureMode;
     size_t fApproxBytesUsedBySubPictures;
     SkRecord* fRecord;
     SkAutoTDelete<SkDrawableList> fDrawableList;