diff options
author | Florin Malita <fmalita@chromium.org> | 2017-07-13 22:34:04 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-07-14 14:19:34 +0000 |
commit | b00a36050a7144903b4bc0ad37108cb5c8fc6934 (patch) | |
tree | 9edf5d3bc52618a948344b8e2583b15ec0d19637 /tests/PictureShaderTest.cpp | |
parent | 2811aa25f1f7c5f5b31eb0cb7dabcbab90d9709d (diff) |
Purge cached SkPictureShader entries on shader deletion
We're currently adding picture shader cache entries to the resource
cache, but we don't ever purge. To avoid exhausting the budget, add
logic to associate cached entries with their owning picture shader, and
purge when the shader is deleted.
-- Side note --
The current cache key is
K(pictureID, ...)
so technically the cache entries are associated with the picture, not the
shader. One could resonably argue we should only purge when the
*picture* is deleted. Unfortunately, this doesn't work: the cache entries
contain indirect refs to the picture (SkImageShader -> SkImage_Generated
-> SkPictureImageGenerator -> SkPicture), so the picture is always kept
alive.
Associating the cache entries with the shader itself seems like a
reasonable alternative, even if we give up some cache persistence in the
process.
Change-Id: Ia115dbb5ae627e5ee171da7c4430fecfd42f4292
Reviewed-on: https://skia-review.googlesource.com/23380
Reviewed-by: Mike Reed <reed@google.com>
Commit-Queue: Florin Malita <fmalita@chromium.org>
Diffstat (limited to 'tests/PictureShaderTest.cpp')
-rw-r--r-- | tests/PictureShaderTest.cpp | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/tests/PictureShaderTest.cpp b/tests/PictureShaderTest.cpp index 78d59afd41..742b72db16 100644 --- a/tests/PictureShaderTest.cpp +++ b/tests/PictureShaderTest.cpp @@ -8,7 +8,9 @@ #include "SkCanvas.h" #include "SkPicture.h" #include "SkPictureRecorder.h" +#include "SkPictureShader.h" #include "SkShader.h" +#include "SkSurface.h" #include "Test.h" // Test that attempting to create a picture shader with a nullptr picture or @@ -38,3 +40,41 @@ DEF_TEST(PictureShader_empty, reporter) { canvas.drawRect(SkRect::MakeWH(1,1), paint); REPORTER_ASSERT(reporter, *bitmap.getAddr32(0,0) == SK_ColorGREEN); } + +// Test that the SkPictureShader cache is purged on shader deletion. +DEF_TEST(PictureShader_caching, reporter) { + auto makePicture = [] () { + SkPictureRecorder recorder; + recorder.beginRecording(100, 100)->drawColor(SK_ColorGREEN); + return recorder.finishRecordingAsPicture(); + }; + + sk_sp<SkPicture> picture = makePicture(); + REPORTER_ASSERT(reporter, picture->unique()); + + sk_sp<SkSurface> surface = SkSurface::MakeRasterN32Premul(100, 100); + + { + SkPaint paint; + paint.setShader(SkPictureShader::Make(picture, + SkShader::kRepeat_TileMode, + SkShader::kRepeat_TileMode, nullptr, nullptr)); + surface->getCanvas()->drawPaint(paint); + + // We should have about 3 refs by now: local + shader + shader cache. + REPORTER_ASSERT(reporter, !picture->unique()); + } + + // Draw another picture shader to have a chance to purge. + { + SkPaint paint; + paint.setShader(SkPictureShader::Make(makePicture(), + SkShader::kRepeat_TileMode, + SkShader::kRepeat_TileMode, nullptr, nullptr)); + surface->getCanvas()->drawPaint(paint); + + } + + // All but the local ref should be gone now. + REPORTER_ASSERT(reporter, picture->unique()); +} |