diff options
author | 2015-05-18 13:47:17 -0700 | |
---|---|---|
committer | 2015-05-18 13:47:17 -0700 | |
commit | 15877b6eae33a9282458bdb904a6d00440eca0ec (patch) | |
tree | 9aee7fa5144cc7039eff79fef5a1c82a59b740f3 /tests | |
parent | cfa90a1aaff2ffbb71a8597905607287856601e5 (diff) |
Sketch splitting SkPicture into an interface and SkBigPicture.
Adds small pictures for drawRect(), drawTextBlob(), and drawPath().
These cover about 89% of draw calls from Blink SKPs,
and about 25% of draw calls from our GMs.
SkPicture handles:
- serialization and deserialization
- unique IDs
Everything else is left to the subclasses:
- playback(), cullRect()
- hasBitmap(), hasText(), suitableForGPU(), etc.
- LayerInfo / AccelData if applicable.
The time to record a 1-op picture improves a good chunk
(2 mallocs to 1), and the time to record a 0-op picture
greatly improves (2 mallocs to none):
picture_overhead_draw: 450ns -> 350ns
picture_overhead_nodraw: 300ns -> 90ns
BUG=skia:
Committed: https://skia.googlesource.com/skia/+/c92c129ff85b05a714bd1bf921c02d5e14651f8b
Latest blink_linux_rel:
http://build.chromium.org/p/tryserver.blink/builders/linux_blink_rel/builds/61248
Review URL: https://codereview.chromium.org/1112523006
Diffstat (limited to 'tests')
-rw-r--r-- | tests/GpuLayerCacheTest.cpp | 5 | ||||
-rw-r--r-- | tests/PictureTest.cpp | 46 |
2 files changed, 22 insertions, 29 deletions
diff --git a/tests/GpuLayerCacheTest.cpp b/tests/GpuLayerCacheTest.cpp index 6b3084b641..efb1ec1c20 100644 --- a/tests/GpuLayerCacheTest.cpp +++ b/tests/GpuLayerCacheTest.cpp @@ -111,7 +111,10 @@ DEF_GPUTEST(GpuLayerCache, reporter, factory) { } SkPictureRecorder recorder; - recorder.beginRecording(1, 1); + SkCanvas* c = recorder.beginRecording(1, 1); + // Draw something, anything, to prevent an empty-picture optimization, + // which is a singleton and never purged. + c->drawRect(SkRect::MakeWH(1,1), SkPaint()); SkAutoTUnref<const SkPicture> picture(recorder.endRecording()); GrLayerCache cache(context); diff --git a/tests/PictureTest.cpp b/tests/PictureTest.cpp index 16d98b3245..0ccef3f0a9 100644 --- a/tests/PictureTest.cpp +++ b/tests/PictureTest.cpp @@ -23,6 +23,7 @@ #include "SkPictureUtils.h" #include "SkPixelRef.h" #include "SkPixelSerializer.h" +#include "SkMiniRecorder.h" #include "SkRRect.h" #include "SkRandom.h" #include "SkRecord.h" @@ -363,9 +364,10 @@ static void test_savelayer_extraction(skiatest::Reporter* reporter) { // Now test out the SaveLayer extraction if (!SkCanvas::Internal_Private_GetIgnoreSaveLayerBounds()) { - SkPicture::AccelData::Key key = SkLayerInfo::ComputeKey(); + const SkBigPicture* bp = pict->asSkBigPicture(); + REPORTER_ASSERT(reporter, bp); - const SkPicture::AccelData* data = pict->EXPERIMENTAL_getAccelData(key); + const SkBigPicture::AccelData* data = bp->accelData(); REPORTER_ASSERT(reporter, data); const SkLayerInfo *gpuData = static_cast<const SkLayerInfo*>(data); @@ -1107,30 +1109,6 @@ static void test_gen_id(skiatest::Reporter* reporter) { REPORTER_ASSERT(reporter, hasData->uniqueID() != empty->uniqueID()); } -static void test_bytes_used(skiatest::Reporter* reporter) { - SkPictureRecorder recorder; - - recorder.beginRecording(0, 0); - SkAutoTUnref<SkPicture> empty(recorder.endRecording()); - - // Sanity check to make sure we aren't under-measuring. - REPORTER_ASSERT(reporter, SkPictureUtils::ApproximateBytesUsed(empty.get()) >= - sizeof(SkPicture) + sizeof(SkRecord)); - - // Protect against any unintentional bloat. - size_t approxUsed = SkPictureUtils::ApproximateBytesUsed(empty.get()); - REPORTER_ASSERT(reporter, approxUsed <= 432); - - // Sanity check of nested SkPictures. - SkPictureRecorder r2; - r2.beginRecording(0, 0); - r2.getRecordingCanvas()->drawPicture(empty.get()); - SkAutoTUnref<SkPicture> nested(r2.endRecording()); - - REPORTER_ASSERT(reporter, SkPictureUtils::ApproximateBytesUsed(nested.get()) >= - SkPictureUtils::ApproximateBytesUsed(empty.get())); -} - DEF_TEST(Picture, reporter) { #ifdef SK_DEBUG test_deleting_empty_picture(); @@ -1151,7 +1129,6 @@ DEF_TEST(Picture, reporter) { test_hierarchical(reporter); test_gen_id(reporter); test_savelayer_extraction(reporter); - test_bytes_used(reporter); } static void draw_bitmaps(const SkBitmap bitmap, SkCanvas* canvas) { @@ -1267,7 +1244,10 @@ DEF_TEST(Picture_SkipBBH, r) { SpoonFedBBHFactory factory(&bbh); SkPictureRecorder recorder; - recorder.beginRecording(bound, &factory); + SkCanvas* c = recorder.beginRecording(bound, &factory); + // Record a few ops so we don't hit a small- or empty- picture optimization. + c->drawRect(bound, SkPaint()); + c->drawRect(bound, SkPaint()); SkAutoTUnref<const SkPicture> picture(recorder.endRecording()); SkCanvas big(640, 480), small(300, 200); @@ -1323,3 +1303,13 @@ DEF_TEST(Picture_getRecordingCanvas, r) { REPORTER_ASSERT(r, !rec.getRecordingCanvas()); } } + +DEF_TEST(MiniRecorderLeftHanging, r) { + // Any shader or other ref-counted effect will do just fine here. + SkPaint paint; + paint.setShader(SkShader::CreateColorShader(SK_ColorRED))->unref(); + + SkMiniRecorder rec; + REPORTER_ASSERT(r, rec.drawRect(SkRect::MakeWH(20,30), paint)); + // Don't call rec.detachPicture(). Test succeeds by not asserting or leaking the shader. +} |