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:
parent
63ba319483
commit
772443a3e6
@ -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,13 +238,19 @@ 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);
|
||||
if (fIsLocked) {
|
||||
fIsLocked = false;
|
||||
fDM->unlock();
|
||||
}
|
||||
}
|
||||
|
||||
size_t SkOneShotDiscardablePixelRef::getAllocatedSizeInBytes() const {
|
||||
return fInfo.fHeight * fRB;
|
||||
|
@ -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;
|
||||
};
|
||||
|
||||
|
@ -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
|
||||
|
||||
{
|
||||
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);
|
||||
|
Loading…
Reference in New Issue
Block a user