diff options
author | reed <reed@google.com> | 2015-01-26 11:24:37 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-01-26 11:24:37 -0800 |
commit | 1d9e80f02b8260ffe2eb1944042cd79f10e38d43 (patch) | |
tree | 3d4d7d57dac5d0debc91ec23076e71e1133940a0 /src | |
parent | 878fa0204bc246ec5fbaca4aa3c81aaefccc30a1 (diff) |
check effective cache-size for fixed-budget caches
BUG=skia:
Review URL: https://codereview.chromium.org/876743002
Diffstat (limited to 'src')
-rw-r--r-- | src/core/SkBitmapProcState.cpp | 2 | ||||
-rw-r--r-- | src/core/SkResourceCache.cpp | 21 | ||||
-rw-r--r-- | src/core/SkResourceCache.h | 5 |
3 files changed, 27 insertions, 1 deletions
diff --git a/src/core/SkBitmapProcState.cpp b/src/core/SkBitmapProcState.cpp index 367b3ff9f9..30a64ed5a8 100644 --- a/src/core/SkBitmapProcState.cpp +++ b/src/core/SkBitmapProcState.cpp @@ -113,7 +113,7 @@ static SkScalar effective_matrix_scale_sqrd(const SkMatrix& mat) { // Check to see that the size of the bitmap that would be produced by // scaling by the given inverted matrix is less than the maximum allowed. static inline bool cache_size_okay(const SkBitmap& bm, const SkMatrix& invMat) { - size_t maximumAllocation = SkResourceCache::GetSingleAllocationByteLimit(); + size_t maximumAllocation = SkResourceCache::GetEffectiveSingleAllocationByteLimit(); if (0 == maximumAllocation) { return true; } diff --git a/src/core/SkResourceCache.cpp b/src/core/SkResourceCache.cpp index efcff26c1a..4ed889a0ab 100644 --- a/src/core/SkResourceCache.cpp +++ b/src/core/SkResourceCache.cpp @@ -435,6 +435,22 @@ size_t SkResourceCache::getSingleAllocationByteLimit() const { return fSingleAllocationByteLimit; } +size_t SkResourceCache::getEffectiveSingleAllocationByteLimit() const { + // fSingleAllocationByteLimit == 0 means the caller is asking for our default + size_t limit = fSingleAllocationByteLimit; + + // if we're not discardable (i.e. we are fixed-budget) then cap the single-limit + // to our budget. + if (NULL == fDiscardableFactory) { + if (0 == limit) { + limit = fTotalByteLimit; + } else { + limit = SkTMin(limit, fTotalByteLimit); + } + } + return limit; +} + /////////////////////////////////////////////////////////////////////////////// #include "SkThread.h" @@ -511,6 +527,11 @@ size_t SkResourceCache::GetSingleAllocationByteLimit() { return get_cache()->getSingleAllocationByteLimit(); } +size_t SkResourceCache::GetEffectiveSingleAllocationByteLimit() { + SkAutoMutexAcquire am(gMutex); + return get_cache()->getEffectiveSingleAllocationByteLimit(); +} + void SkResourceCache::PurgeAll() { SkAutoMutexAcquire am(gMutex); return get_cache()->purgeAll(); diff --git a/src/core/SkResourceCache.h b/src/core/SkResourceCache.h index 883ed189de..88ccb87ed8 100644 --- a/src/core/SkResourceCache.h +++ b/src/core/SkResourceCache.h @@ -123,6 +123,7 @@ public: static size_t SetSingleAllocationByteLimit(size_t); static size_t GetSingleAllocationByteLimit(); + static size_t GetEffectiveSingleAllocationByteLimit(); static void PurgeAll(); @@ -186,6 +187,10 @@ public: */ size_t setSingleAllocationByteLimit(size_t maximumAllocationSize); size_t getSingleAllocationByteLimit() const; + // returns the logical single allocation size (pinning against the budget when the cache + // is not backed by discardable memory. + size_t getEffectiveSingleAllocationByteLimit() const; + /** * Set the maximum number of bytes available to this cache. If the current * cache exceeds this new value, it will be purged to try to fit within |