bb281f7f96
SkPurgeableImageCache: New image cache that uses virtual memory to store the pixels. Combines features of SkAshmemImageCache (which has been removed) with SkPurgeableMemoryBlock, which has android and Mac versions. SkImageCache: Modified the API. pinCache now returns a status out parameter which states whether the pinned memory retained the old data. This allows allocAndPinCache to only be used for allocations. Add a new debug only interface to purge unpinned data. Updates to documentation, clarifying behavior. Changed CachedStatus to MemoryStatus SkLruImageCache: Implement the new function purgeAllUnpinnedCaches and change implementation of pinCache for the new behavior. SkLazyPixelRef: Rewrite onLockPixels to account for the new behavior of pinCache. BitmapFactoryTest: Test the new SkPurgeableImageCache. Write tests which directly test the SkImageCaches. Create a larger bitmap, since some of the SkImageCaches are designed to handle large bitmaps. bench_ and render_pictures: Consolidate lazy_decode_bitmap into one function. Allow using a flag to specify using the purgeable image cache. Clean up some #includes. Review URL: https://codereview.chromium.org/12433020 git-svn-id: http://skia.googlecode.com/svn/trunk@8207 2bbb7eff-a529-9590-31e7-b0007b416f81
90 lines
2.7 KiB
C++
90 lines
2.7 KiB
C++
/*
|
|
* Copyright 2013 Google Inc.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license that can be
|
|
* found in the LICENSE file.
|
|
*/
|
|
|
|
#ifndef SkLruImageCache_DEFINED
|
|
#define SkLruImageCache_DEFINED
|
|
|
|
#include "SkImageCache.h"
|
|
#include "SkThread.h"
|
|
#include "SkTInternalLList.h"
|
|
|
|
class CachedPixels;
|
|
|
|
/**
|
|
* SkImageCache implementation that uses an LRU cache to age out old images.
|
|
*/
|
|
class SkLruImageCache : public SkImageCache {
|
|
|
|
public:
|
|
SkLruImageCache(size_t budget);
|
|
|
|
virtual ~SkLruImageCache();
|
|
|
|
#ifdef SK_DEBUG
|
|
virtual MemoryStatus getMemoryStatus(intptr_t ID) const SK_OVERRIDE;
|
|
virtual void purgeAllUnpinnedCaches() SK_OVERRIDE;
|
|
#endif
|
|
|
|
/**
|
|
* Set the byte limit on cached pixels. If more bytes are used than this, the cache will free
|
|
* unpinned memory until under the new limit or until all unpinned memory is freed. This will
|
|
* never free pinned memory, so the cache can potentially remain over the limit. The limit is
|
|
* enforced each time memory is allocated or released.
|
|
* 0 is a special flag for an infinite budget.
|
|
* @return size_t The previous limit.
|
|
*/
|
|
size_t setImageCacheLimit(size_t newLimit);
|
|
|
|
/**
|
|
* Return the number of bytes of memory currently in use by the cache. Can include memory that
|
|
* is no longer pinned, but has not been freed.
|
|
*/
|
|
size_t getImageCacheUsed() const { return fRamUsed; }
|
|
|
|
virtual void* allocAndPinCache(size_t bytes, intptr_t* ID) SK_OVERRIDE;
|
|
virtual void* pinCache(intptr_t ID, SkImageCache::DataStatus*) SK_OVERRIDE;
|
|
virtual void releaseCache(intptr_t ID) SK_OVERRIDE;
|
|
virtual void throwAwayCache(intptr_t ID) SK_OVERRIDE;
|
|
|
|
private:
|
|
// Linked list of recently used. Head is the most recently used, and tail is the least.
|
|
SkTInternalLList<CachedPixels> fLRU;
|
|
typedef SkTInternalLList<CachedPixels>::Iter Iter;
|
|
|
|
#ifdef SK_DEBUG
|
|
// fMutex is mutable so that getMemoryStatus can be const
|
|
mutable
|
|
#endif
|
|
SkMutex fMutex;
|
|
size_t fRamBudget;
|
|
size_t fRamUsed;
|
|
|
|
/**
|
|
* Find the CachedPixels represented by ID, or NULL if not in the cache. Mutex must be locked
|
|
* before calling.
|
|
*/
|
|
CachedPixels* findByID(intptr_t ID) const;
|
|
|
|
/**
|
|
* If over budget, throw away pixels which are not currently in use until below budget or there
|
|
* are no more pixels eligible to be thrown away. Mutex must be locked before calling.
|
|
*/
|
|
void purgeIfNeeded();
|
|
|
|
/**
|
|
* Purge until below limit. Mutex must be locked before calling.
|
|
*/
|
|
void purgeTilAtOrBelow(size_t limit);
|
|
|
|
/**
|
|
* Remove a set of CachedPixels. Mutex must be locked before calling.
|
|
*/
|
|
void removePixels(CachedPixels*);
|
|
};
|
|
|
|
#endif // SkLruImageCache_DEFINED
|