aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--bench/nanobench.cpp6
-rw-r--r--include/core/SkPicture.h3
-rw-r--r--src/core/SkBigPicture.cpp11
-rw-r--r--src/core/SkBigPicture.h5
-rw-r--r--src/core/SkMiniRecorder.cpp2
-rw-r--r--src/core/SkPictureRecorder.cpp7
-rw-r--r--src/core/SkRecordedDrawable.cpp7
-rw-r--r--src/core/SkRecorder.cpp1
8 files changed, 36 insertions, 6 deletions
diff --git a/bench/nanobench.cpp b/bench/nanobench.cpp
index 8cd8e8171f..a50138a624 100644
--- a/bench/nanobench.cpp
+++ b/bench/nanobench.cpp
@@ -738,6 +738,7 @@ public:
SkString name = SkOSPath::Basename(path.c_str());
fSourceType = "skp";
fBenchType = "recording";
+ fSKPBytes = static_cast<double>(pic->approximateBytesUsed());
fSKPOps = pic->approximateOpCount();
return new RecordingBench(name.c_str(), pic.get(), FLAGS_bbh, FLAGS_lite);
}
@@ -752,6 +753,7 @@ public:
SkString name = SkOSPath::Basename(path.c_str());
fSourceType = "skp";
fBenchType = "piping";
+ fSKPBytes = static_cast<double>(pic->approximateBytesUsed());
fSKPOps = pic->approximateOpCount();
return new PipingBench(name.c_str(), pic.get());
}
@@ -766,6 +768,7 @@ public:
SkString name = SkOSPath::Basename(path.c_str());
fSourceType = "skp";
fBenchType = "deserial";
+ fSKPBytes = static_cast<double>(data->size());
fSKPOps = 0;
return new DeserializePictureBench(name.c_str(), std::move(data));
}
@@ -1059,6 +1062,7 @@ public:
}
}
if (0 == strcmp(fBenchType, "recording")) {
+ log->metric("bytes", fSKPBytes);
log->metric("ops", fSKPOps);
}
}
@@ -1089,7 +1093,7 @@ private:
SkScalar fZoomMax;
double fZoomPeriodMs;
- double fSKPOps;
+ double fSKPBytes, fSKPOps;
const char* fSourceType; // What we're benching: bench, GM, SKP, ...
const char* fBenchType; // How we bench it: micro, recording, playback, ...
diff --git a/include/core/SkPicture.h b/include/core/SkPicture.h
index 1a02a36750..5ca60ca82c 100644
--- a/include/core/SkPicture.h
+++ b/include/core/SkPicture.h
@@ -102,6 +102,9 @@ public:
*/
virtual int approximateOpCount() const = 0;
+ /** Returns the approximate byte size of this picture, not including large ref'd objects. */
+ virtual size_t approximateBytesUsed() const = 0;
+
// Returns NULL if this is not an SkBigPicture.
virtual const SkBigPicture* asSkBigPicture() const { return nullptr; }
diff --git a/src/core/SkBigPicture.cpp b/src/core/SkBigPicture.cpp
index 62f54e08bb..2ae9248d47 100644
--- a/src/core/SkBigPicture.cpp
+++ b/src/core/SkBigPicture.cpp
@@ -15,8 +15,10 @@
SkBigPicture::SkBigPicture(const SkRect& cull,
SkRecord* record,
SnapshotArray* drawablePicts,
- SkBBoxHierarchy* bbh)
+ SkBBoxHierarchy* bbh,
+ size_t approxBytesUsedBySubPictures)
: fCullRect(cull)
+ , fApproxBytesUsedBySubPictures(approxBytesUsedBySubPictures)
, fRecord(record) // Take ownership of caller's ref.
, fDrawablePicts(drawablePicts) // Take ownership.
, fBBH(bbh) // Take ownership of caller's ref.
@@ -52,7 +54,12 @@ void SkBigPicture::partialPlayback(SkCanvas* canvas,
}
SkRect SkBigPicture::cullRect() const { return fCullRect; }
-int SkBigPicture::approximateOpCount() const { return fRecord->count(); }
+int SkBigPicture::approximateOpCount() const { return fRecord->count(); }
+size_t SkBigPicture::approximateBytesUsed() const {
+ size_t bytes = sizeof(*this) + fRecord->bytesUsed() + fApproxBytesUsedBySubPictures;
+ if (fBBH) { bytes += fBBH->bytesUsed(); }
+ return bytes;
+}
int SkBigPicture::drawableCount() const {
return fDrawablePicts ? fDrawablePicts->count() : 0;
diff --git a/src/core/SkBigPicture.h b/src/core/SkBigPicture.h
index 6edf4004c1..cbe492cc22 100644
--- a/src/core/SkBigPicture.h
+++ b/src/core/SkBigPicture.h
@@ -36,13 +36,15 @@ public:
SkBigPicture(const SkRect& cull,
SkRecord*, // We take ownership of the caller's ref.
SnapshotArray*, // We take exclusive ownership.
- SkBBoxHierarchy*); // We take ownership of the caller's ref.
+ SkBBoxHierarchy*, // We take ownership of the caller's ref.
+ size_t approxBytesUsedBySubPictures);
// SkPicture overrides
void playback(SkCanvas*, AbortCallback*) const override;
SkRect cullRect() const override;
int approximateOpCount() const override;
+ size_t approximateBytesUsed() const override;
const SkBigPicture* asSkBigPicture() const override { return this; }
// Used by GrLayerHoister
@@ -59,6 +61,7 @@ private:
SkPicture const* const* drawablePicts() const;
const SkRect fCullRect;
+ const size_t fApproxBytesUsedBySubPictures;
sk_sp<const SkRecord> fRecord;
std::unique_ptr<const SnapshotArray> fDrawablePicts;
sk_sp<const SkBBoxHierarchy> fBBH;
diff --git a/src/core/SkMiniRecorder.cpp b/src/core/SkMiniRecorder.cpp
index deda976bd0..ec089373e1 100644
--- a/src/core/SkMiniRecorder.cpp
+++ b/src/core/SkMiniRecorder.cpp
@@ -20,6 +20,7 @@ class SkEmptyPicture final : public SkPicture {
public:
void playback(SkCanvas*, AbortCallback*) const override { }
+ size_t approximateBytesUsed() const override { return sizeof(*this); }
int approximateOpCount() const override { return 0; }
SkRect cullRect() const override { return SkRect::MakeEmpty(); }
};
@@ -52,6 +53,7 @@ public:
SkRecords::Draw(c, nullptr, nullptr, 0, nullptr)(fOp);
}
+ size_t approximateBytesUsed() const override { return sizeof(*this); }
int approximateOpCount() const override { return 1; }
SkRect cullRect() const override { return fCull; }
diff --git a/src/core/SkPictureRecorder.cpp b/src/core/SkPictureRecorder.cpp
index 6c23cc075e..a37cd4826c 100644
--- a/src/core/SkPictureRecorder.cpp
+++ b/src/core/SkPictureRecorder.cpp
@@ -83,7 +83,12 @@ sk_sp<SkPicture> SkPictureRecorder::finishRecordingAsPicture(uint32_t finishFlag
fCullRect = bbhBound;
}
- return sk_make_sp<SkBigPicture>(fCullRect, fRecord.release(), pictList, fBBH.release());
+ size_t subPictureBytes = fRecorder->approxBytesUsedBySubPictures();
+ for (int i = 0; pictList && i < pictList->count(); i++) {
+ subPictureBytes += pictList->begin()[i]->approximateBytesUsed();
+ }
+ return sk_make_sp<SkBigPicture>(fCullRect, fRecord.release(), pictList, fBBH.release(),
+ subPictureBytes);
}
sk_sp<SkPicture> SkPictureRecorder::finishRecordingAsPictureWithCull(const SkRect& cullRect,
diff --git a/src/core/SkRecordedDrawable.cpp b/src/core/SkRecordedDrawable.cpp
index bb57885d5d..342701a365 100644
--- a/src/core/SkRecordedDrawable.cpp
+++ b/src/core/SkRecordedDrawable.cpp
@@ -31,9 +31,14 @@ SkPicture* SkRecordedDrawable::onNewPictureSnapshot() {
pictList = fDrawableList->newDrawableSnapshot();
}
+ size_t subPictureBytes = 0;
+ for (int i = 0; pictList && i < pictList->count(); i++) {
+ subPictureBytes += pictList->begin()[i]->approximateBytesUsed();
+ }
// SkBigPicture will take ownership of a ref on both fRecord and fBBH.
// We're not willing to give up our ownership, so we must ref them for SkPicture.
- return new SkBigPicture(fBounds, SkRef(fRecord.get()), pictList, SkSafeRef(fBBH.get()));
+ return new SkBigPicture(fBounds, SkRef(fRecord.get()), pictList, SkSafeRef(fBBH.get()),
+ subPictureBytes);
}
void SkRecordedDrawable::flatten(SkWriteBuffer& buffer) const {
diff --git a/src/core/SkRecorder.cpp b/src/core/SkRecorder.cpp
index 26fcaa4af4..9374b60264 100644
--- a/src/core/SkRecorder.cpp
+++ b/src/core/SkRecorder.cpp
@@ -302,6 +302,7 @@ void SkRecorder::onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y,
void SkRecorder::onDrawPicture(const SkPicture* pic, const SkMatrix* matrix, const SkPaint* paint) {
if (fDrawPictureMode == Record_DrawPictureMode) {
+ fApproxBytesUsedBySubPictures += pic->approximateBytesUsed();
APPEND(DrawPicture, this->copy(paint), sk_ref_sp(pic), matrix ? *matrix : SkMatrix::I());
} else {
SkASSERT(fDrawPictureMode == Playback_DrawPictureMode);