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
This commit is contained in:
parent
c0e80c139e
commit
d711d115d2
@ -33,10 +33,11 @@ void RecordingBench::onDraw(const int loops, SkCanvas*) {
|
|||||||
const SkScalar w = fSrc->cullRect().width(),
|
const SkScalar w = fSrc->cullRect().width(),
|
||||||
h = fSrc->cullRect().height();
|
h = fSrc->cullRect().height();
|
||||||
|
|
||||||
|
uint32_t flags = SkPictureRecorder::kComputeSaveLayerInfo_RecordFlag
|
||||||
|
| SkPictureRecorder::kPlaybackDrawPicture_RecordFlag;
|
||||||
for (int i = 0; i < loops; i++) {
|
for (int i = 0; i < loops; i++) {
|
||||||
SkPictureRecorder recorder;
|
SkPictureRecorder recorder;
|
||||||
fSrc->playback(recorder.beginRecording(w, h, fUseBBH ? &factory : NULL,
|
fSrc->playback(recorder.beginRecording(w, h, fUseBBH ? &factory : NULL, flags));
|
||||||
SkPictureRecorder::kComputeSaveLayerInfo_RecordFlag));
|
|
||||||
SkSafeUnref(recorder.endRecording());
|
SkSafeUnref(recorder.endRecording());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -33,7 +33,11 @@ public:
|
|||||||
enum RecordFlags {
|
enum RecordFlags {
|
||||||
// This flag indicates that, if some BHH is being computed, saveLayer
|
// This flag indicates that, if some BHH is being computed, saveLayer
|
||||||
// information should also be extracted at the same time.
|
// 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.
|
/** Returns the canvas that records the drawing commands.
|
||||||
|
@ -38,7 +38,10 @@ SkCanvas* SkPictureRecorder::beginRecording(const SkRect& cullRect,
|
|||||||
if (!fRecord) {
|
if (!fRecord) {
|
||||||
fRecord.reset(SkNEW(SkRecord));
|
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;
|
fActivelyRecording = true;
|
||||||
return this->getRecordingCanvas();
|
return this->getRecordingCanvas();
|
||||||
}
|
}
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "SkBigPicture.h"
|
#include "SkBigPicture.h"
|
||||||
|
#include "SkCanvasPriv.h"
|
||||||
#include "SkPatchUtils.h"
|
#include "SkPatchUtils.h"
|
||||||
#include "SkPicture.h"
|
#include "SkPicture.h"
|
||||||
#include "SkPictureUtils.h"
|
#include "SkPictureUtils.h"
|
||||||
@ -35,18 +36,22 @@ void SkDrawableList::append(SkDrawable* drawable) {
|
|||||||
|
|
||||||
SkRecorder::SkRecorder(SkRecord* record, int width, int height, SkMiniRecorder* mr)
|
SkRecorder::SkRecorder(SkRecord* record, int width, int height, SkMiniRecorder* mr)
|
||||||
: SkCanvas(SkIRect::MakeWH(width, height), SkCanvas::kConservativeRasterClip_InitFlag)
|
: SkCanvas(SkIRect::MakeWH(width, height), SkCanvas::kConservativeRasterClip_InitFlag)
|
||||||
|
, fDrawPictureMode(Record_DrawPictureMode)
|
||||||
, fApproxBytesUsedBySubPictures(0)
|
, fApproxBytesUsedBySubPictures(0)
|
||||||
, fRecord(record)
|
, fRecord(record)
|
||||||
, fMiniRecorder(mr) {}
|
, fMiniRecorder(mr) {}
|
||||||
|
|
||||||
SkRecorder::SkRecorder(SkRecord* record, const SkRect& bounds, SkMiniRecorder* mr)
|
SkRecorder::SkRecorder(SkRecord* record, const SkRect& bounds, SkMiniRecorder* mr)
|
||||||
: SkCanvas(bounds.roundOut(), SkCanvas::kConservativeRasterClip_InitFlag)
|
: SkCanvas(bounds.roundOut(), SkCanvas::kConservativeRasterClip_InitFlag)
|
||||||
|
, fDrawPictureMode(Record_DrawPictureMode)
|
||||||
, fApproxBytesUsedBySubPictures(0)
|
, fApproxBytesUsedBySubPictures(0)
|
||||||
, fRecord(record)
|
, fRecord(record)
|
||||||
, fMiniRecorder(mr) {}
|
, 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();
|
this->forgetRecord();
|
||||||
|
fDrawPictureMode = dpm;
|
||||||
fRecord = record;
|
fRecord = record;
|
||||||
this->resetForNextPicture(bounds.roundOut());
|
this->resetForNextPicture(bounds.roundOut());
|
||||||
fMiniRecorder = mr;
|
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) {
|
void SkRecorder::onDrawPicture(const SkPicture* pic, const SkMatrix* matrix, const SkPaint* paint) {
|
||||||
|
if (fDrawPictureMode == Record_DrawPictureMode) {
|
||||||
fApproxBytesUsedBySubPictures += SkPictureUtils::ApproximateBytesUsed(pic);
|
fApproxBytesUsedBySubPictures += SkPictureUtils::ApproximateBytesUsed(pic);
|
||||||
APPEND(DrawPicture, this->copy(paint), pic, matrix ? *matrix : SkMatrix::I());
|
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,
|
void SkRecorder::onDrawVertices(VertexMode vmode,
|
||||||
|
@ -41,7 +41,8 @@ public:
|
|||||||
SkRecorder(SkRecord*, int width, int height, SkMiniRecorder* = nullptr); // legacy version
|
SkRecorder(SkRecord*, int width, int height, SkMiniRecorder* = nullptr); // legacy version
|
||||||
SkRecorder(SkRecord*, const SkRect& bounds, SkMiniRecorder* = nullptr);
|
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; }
|
size_t approxBytesUsedBySubPictures() const { return fApproxBytesUsedBySubPictures; }
|
||||||
|
|
||||||
@ -137,6 +138,7 @@ private:
|
|||||||
return devBounds;
|
return devBounds;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DrawPictureMode fDrawPictureMode;
|
||||||
size_t fApproxBytesUsedBySubPictures;
|
size_t fApproxBytesUsedBySubPictures;
|
||||||
SkRecord* fRecord;
|
SkRecord* fRecord;
|
||||||
SkAutoTDelete<SkDrawableList> fDrawableList;
|
SkAutoTDelete<SkDrawableList> fDrawableList;
|
||||||
|
Loading…
Reference in New Issue
Block a user