Revert "Revert "Use SkImage to manage mip map cache purging, not Bitmap/PixelRef""
This reverts commit f7ddaa8a1bb305b679632c5b52e3a9e0f9be987a.
Bug: skia:
Change-Id: Idc0459e119cefbf580aea1f27dda9836d16bb293
Reviewed-on: https://skia-review.googlesource.com/c/162039
Reviewed-by: Brian Osman <brianosman@google.com>
Commit-Queue: Brian Osman <brianosman@google.com>
diff --git a/tests/SkResourceCacheTest.cpp b/tests/SkResourceCacheTest.cpp
index 341eb07..9701ae1 100644
--- a/tests/SkResourceCacheTest.cpp
+++ b/tests/SkResourceCacheTest.cpp
@@ -7,6 +7,7 @@
#include "Test.h"
#include "SkBitmapCache.h"
+#include "SkBitmapProvider.h"
#include "SkCanvas.h"
#include "SkDiscardableMemoryPool.h"
#include "SkGraphics.h"
@@ -43,15 +44,18 @@
SkBitmap src;
src.allocN32Pixels(5, 5);
src.setImmutable();
+ sk_sp<SkImage> img = SkImage::MakeFromBitmap(src);
+ SkBitmapProvider provider(img.get());
+ const auto desc = provider.makeCacheDesc();
- const SkMipMap* mipmap = SkMipMapCache::FindAndRef(SkBitmapCacheDesc::Make(src), cache);
+ const SkMipMap* mipmap = SkMipMapCache::FindAndRef(desc, cache);
REPORTER_ASSERT(reporter, nullptr == mipmap);
- mipmap = SkMipMapCache::AddAndRef(src, cache);
+ mipmap = SkMipMapCache::AddAndRef(provider, cache);
REPORTER_ASSERT(reporter, mipmap);
{
- const SkMipMap* mm = SkMipMapCache::FindAndRef(SkBitmapCacheDesc::Make(src), cache);
+ const SkMipMap* mm = SkMipMapCache::FindAndRef(desc, cache);
REPORTER_ASSERT(reporter, mm);
REPORTER_ASSERT(reporter, mm == mipmap);
mm->unref();
@@ -65,7 +69,7 @@
check_data(reporter, mipmap, 1, kInCache, kNotLocked);
// find us again
- mipmap = SkMipMapCache::FindAndRef(SkBitmapCacheDesc::Make(src), cache);
+ mipmap = SkMipMapCache::FindAndRef(desc, cache);
check_data(reporter, mipmap, 2, kInCache, kLocked);
cache->purgeAll();
@@ -78,25 +82,30 @@
const int N = 3;
SkBitmap src[N];
+ sk_sp<SkImage> img[N];
+ SkBitmapCacheDesc desc[N];
for (int i = 0; i < N; ++i) {
src[i].allocN32Pixels(5, 5);
src[i].setImmutable();
- SkMipMapCache::AddAndRef(src[i], cache)->unref();
+ img[i] = SkImage::MakeFromBitmap(src[i]);
+ SkBitmapProvider provider(img[i].get());
+ SkMipMapCache::AddAndRef(provider, cache)->unref();
+ desc[i] = provider.makeCacheDesc();
}
for (int i = 0; i < N; ++i) {
- const auto desc = SkBitmapCacheDesc::Make(src[i]);
- const SkMipMap* mipmap = SkMipMapCache::FindAndRef(desc, cache);
- if (cache) {
- // if cache is null, we're working on the global cache, and other threads might purge
- // it, making this check fragile.
- REPORTER_ASSERT(reporter, mipmap);
- }
+ const SkMipMap* mipmap = SkMipMapCache::FindAndRef(desc[i], cache);
+ // We're always using a local cache, so we know we won't be purged by other threads
+ REPORTER_ASSERT(reporter, mipmap);
+ SkSafeUnref(mipmap);
+
+ img[i].reset(); // delete the image, which *should not* remove us from the cache
+ mipmap = SkMipMapCache::FindAndRef(desc[i], cache);
+ REPORTER_ASSERT(reporter, mipmap);
SkSafeUnref(mipmap);
src[i].reset(); // delete the underlying pixelref, which *should* remove us from the cache
-
- mipmap = SkMipMapCache::FindAndRef(desc, cache);
+ mipmap = SkMipMapCache::FindAndRef(desc[i], cache);
REPORTER_ASSERT(reporter, !mipmap);
}
}