add more tests for discardable caches

BUG=
R=halcanary@google.com

Review URL: https://codereview.chromium.org/112833003

git-svn-id: http://skia.googlecode.com/svn/trunk@12618 2bbb7eff-a529-9590-31e7-b0007b416f81
This commit is contained in:
reed@google.com 2013-12-11 15:30:24 +00:00
parent 63ba319483
commit 772443a3e6
3 changed files with 59 additions and 14 deletions

View File

@ -209,6 +209,7 @@ private:
SkDiscardableMemory* fDM;
size_t fRB;
bool fFirstTime;
bool fIsLocked;
typedef SkPixelRef INHERITED;
};
@ -224,6 +225,7 @@ SkOneShotDiscardablePixelRef::SkOneShotDiscardablePixelRef(const SkImageInfo& in
SkASSERT(dm->data());
fFirstTime = true;
fIsLocked = false;
}
SkOneShotDiscardablePixelRef::~SkOneShotDiscardablePixelRef() {
@ -236,12 +238,18 @@ void* SkOneShotDiscardablePixelRef::onLockPixels(SkColorTable** ctable) {
fFirstTime = false;
return fDM->data();
}
return fDM->lock() ? fDM->data() : NULL;
SkASSERT(!fIsLocked);
fIsLocked = fDM->lock();
return fIsLocked ? fDM->data() : NULL;
}
void SkOneShotDiscardablePixelRef::onUnlockPixels() {
SkASSERT(!fFirstTime);
fDM->unlock();
if (fIsLocked) {
fIsLocked = false;
fDM->unlock();
}
}
size_t SkOneShotDiscardablePixelRef::getAllocatedSizeInBytes() const {

View File

@ -12,6 +12,8 @@
#include "SkTInternalLList.h"
#include "SkThread.h"
class SkPoolDiscardableMemory;
#ifdef SK_DEBUG
#define LAZY_CACHE_STATS 1
#elif !defined(LAZY_CACHE_STATS)
@ -22,20 +24,22 @@
* This non-global pool can be used for unit tests to verify that the
* pool works.
*/
class SkPoolDiscardableMemory;
class SkDiscardableMemoryPool : public SkDiscardableMemory::Factory {
public:
/**
* Without mutex, will be not be thread safe.
*/
SkDiscardableMemoryPool(size_t budget, SkBaseMutex* mutex = NULL);
~SkDiscardableMemoryPool();
SkDiscardableMemory* create(size_t bytes) SK_OVERRIDE;
virtual ~SkDiscardableMemoryPool();
virtual SkDiscardableMemory* create(size_t bytes) SK_OVERRIDE;
size_t getRAMUsed();
void setRAMBudget(size_t budget);
/** purges all unlocked DMs */
void dumpPool();
friend class SkPoolDiscardableMemory;
#if LAZY_CACHE_STATS
int fCacheHits;
int fCacheMisses;
@ -46,6 +50,7 @@ private:
size_t fBudget;
size_t fUsed;
SkTInternalLList<SkPoolDiscardableMemory> fList;
/** Function called to free memory if needed */
void dumpDownTo(size_t budget);
/** called by SkDiscardableMemoryPool upon destruction */
@ -54,6 +59,9 @@ private:
bool lock(SkPoolDiscardableMemory* dm);
/** called by SkDiscardableMemoryPool::unlock() */
void unlock(SkPoolDiscardableMemory* dm);
friend class SkPoolDiscardableMemory;
typedef SkDiscardableMemory::Factory INHERITED;
};

View File

@ -1,4 +1,4 @@
/*
/*
* Copyright 2013 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
@ -23,12 +23,15 @@ static void test_cache(skiatest::Reporter* reporter, SkScaledImageCache& cache,
SkBitmap bm[COUNT];
SkScalar scale = 2;
const SkScalar scale = 2;
for (int i = 0; i < COUNT; ++i) {
make_bm(&bm[i], DIM, DIM);
}
for (int i = 0; i < COUNT; ++i) {
SkBitmap tmp;
make_bm(&bm[i], DIM, DIM);
id = cache.findAndLock(bm[i], scale, scale, &tmp);
SkScaledImageCache::ID* id = cache.findAndLock(bm[i], scale, scale, &tmp);
REPORTER_ASSERT(reporter, NULL == id);
make_bm(&tmp, DIM, DIM);
@ -49,26 +52,52 @@ static void test_cache(skiatest::Reporter* reporter, SkScaledImageCache& cache,
if (testPurge) {
// stress test, should trigger purges
float incScale = 2;
for (size_t i = 0; i < COUNT * 100; ++i) {
scale += 1;
incScale += 1;
SkBitmap tmp;
make_bm(&tmp, DIM, DIM);
id = cache.addAndLock(bm[0], scale, scale, tmp);
SkScaledImageCache::ID* id = cache.addAndLock(bm[0], incScale,
incScale, tmp);
REPORTER_ASSERT(reporter, NULL != id);
cache.unlock(id);
}
}
// test the originals after all that purging
for (int i = 0; i < COUNT; ++i) {
SkBitmap tmp;
id = cache.findAndLock(bm[i], scale, scale, &tmp);
if (id) {
cache.unlock(id);
}
}
cache.setByteLimit(0);
}
#include "SkDiscardableMemoryPool.h"
static SkDiscardableMemoryPool* gPool;
static SkDiscardableMemory* pool_factory(size_t bytes) {
return gPool->create(bytes);
}
static void TestImageCache(skiatest::Reporter* reporter) {
static const size_t defLimit = DIM * DIM * 4 * COUNT + 1024; // 1K slop
{
static const size_t defLimit = DIM * DIM * 4 * COUNT + 1024; // 1K slop
SkScaledImageCache cache(defLimit);
test_cache(reporter, cache, true);
}
{
SkDiscardableMemoryPool pool(defLimit);
gPool = &pool;
SkScaledImageCache cache(pool_factory);
test_cache(reporter, cache, true);
}
{
SkScaledImageCache cache(SkDiscardableMemory::Create);
test_cache(reporter, cache, false);