aboutsummaryrefslogtreecommitdiffhomepage
path: root/tests
diff options
context:
space:
mode:
authorGravatar Mike Reed <reed@google.com>2017-04-11 12:03:44 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-04-11 16:38:17 +0000
commit7a542c559a6e584107b94e6254ac3c7f9f24b591 (patch)
tree9186b5ae154b580e20b3dc40f437e44f546c467b /tests
parent77443974ea96912fa39079a4bf82ab791ec3c922 (diff)
Change bitmapcache to not rely on lockpixels.
The Rec in the cache is the owner of the pixel memory - discardable or - malloc Each external client has a pixelref that just points to those pixels, and whose destructor will notify the rec. This eliminates the dependency on lockPixels in pixelref, freeing us to remove that entirely from pixelref. Bug: skia: Change-Id: If45ed0ae202a1211336626364235215253e8aa7c Reviewed-on: https://skia-review.googlesource.com/10300 Commit-Queue: Mike Reed <reed@google.com> Reviewed-by: Brian Osman <brianosman@google.com> Reviewed-by: Matt Sarett <msarett@google.com> Reviewed-by: Mike Klein <mtklein@google.com>
Diffstat (limited to 'tests')
-rw-r--r--tests/SkResourceCacheTest.cpp86
1 files changed, 86 insertions, 0 deletions
diff --git a/tests/SkResourceCacheTest.cpp b/tests/SkResourceCacheTest.cpp
index b260d89503..708c8d4d83 100644
--- a/tests/SkResourceCacheTest.cpp
+++ b/tests/SkResourceCacheTest.cpp
@@ -10,6 +10,7 @@
#include "SkCanvas.h"
#include "SkDiscardableMemoryPool.h"
#include "SkGraphics.h"
+#include "SkMakeUnique.h"
#include "SkMipMap.h"
#include "SkPicture.h"
#include "SkPictureRecorder.h"
@@ -201,3 +202,88 @@ DEF_TEST(BitmapCache_discarded_image, reporter) {
});
}
}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+static void* gTestNamespace;
+
+struct TestKey : SkResourceCache::Key {
+ int32_t fData;
+
+ TestKey(int sharedID, int32_t data) : fData(data) {
+ this->init(&gTestNamespace, sharedID, sizeof(fData));
+ }
+};
+
+struct TestRec : SkResourceCache::Rec {
+ enum {
+ kDidInstall = 1 << 0,
+ };
+
+ TestKey fKey;
+ int* fFlags;
+ bool fCanBePurged;
+
+ TestRec(int sharedID, int32_t data, int* flagPtr) : fKey(sharedID, data), fFlags(flagPtr) {
+ fCanBePurged = false;
+ }
+
+ const Key& getKey() const override { return fKey; }
+ size_t bytesUsed() const override { return 1024; /* just need a value */ }
+ bool canBePurged() override { return fCanBePurged; }
+ void postAddInstall(void*) override {
+ *fFlags |= kDidInstall;
+ }
+ const char* getCategory() const override { return "test-category"; }
+};
+
+static void test_duplicate_add(SkResourceCache* cache, skiatest::Reporter* reporter,
+ bool purgable) {
+ int sharedID = 1;
+ int data = 0;
+
+ int flags0 = 0, flags1 = 0;
+
+ auto rec0 = skstd::make_unique<TestRec>(sharedID, data, &flags0);
+ auto rec1 = skstd::make_unique<TestRec>(sharedID, data, &flags1);
+ SkASSERT(rec0->getKey() == rec1->getKey());
+
+ TestRec* r0 = rec0.get(); // save the bare-pointer since we will release rec0
+ r0->fCanBePurged = purgable;
+
+ REPORTER_ASSERT(reporter, !(flags0 & TestRec::kDidInstall));
+ REPORTER_ASSERT(reporter, !(flags1 & TestRec::kDidInstall));
+
+ cache->add(rec0.release(), nullptr);
+ REPORTER_ASSERT(reporter, flags0 & TestRec::kDidInstall);
+ REPORTER_ASSERT(reporter, !(flags1 & TestRec::kDidInstall));
+ flags0 = 0; // reset the flag
+
+ cache->add(rec1.release(), nullptr);
+ if (purgable) {
+ // we purged rec0, and did install rec1
+ REPORTER_ASSERT(reporter, !(flags0 & TestRec::kDidInstall));
+ REPORTER_ASSERT(reporter, flags1 & TestRec::kDidInstall);
+ } else {
+ // we re-used rec0 and did not install rec1
+ REPORTER_ASSERT(reporter, flags0 & TestRec::kDidInstall);
+ REPORTER_ASSERT(reporter, !(flags1 & TestRec::kDidInstall));
+ r0->fCanBePurged = true; // so we can cleanup the cache
+ }
+}
+
+/*
+ * Test behavior when the same key is added more than once.
+ */
+DEF_TEST(ResourceCache_purge, reporter) {
+ for (bool purgable : { false, true }) {
+ {
+ SkResourceCache cache(1024 * 1024);
+ test_duplicate_add(&cache, reporter, purgable);
+ }
+ {
+ SkResourceCache cache(SkDiscardableMemory::Create);
+ test_duplicate_add(&cache, reporter, purgable);
+ }
+ }
+}