| Index: src/gpu/GrTextBlobCache.h
|
| diff --git a/src/gpu/GrTextBlobCache.h b/src/gpu/GrTextBlobCache.h
|
| index 7a2b2a79a17ade040c3c93106b5b22cf8c590015..9ce4ec7af2553c0b291eee588aad44be91f9ffe9 100644
|
| --- a/src/gpu/GrTextBlobCache.h
|
| +++ b/src/gpu/GrTextBlobCache.h
|
| @@ -16,7 +16,18 @@ class GrTextBlobCache {
|
| public:
|
| typedef GrAtlasTextContext::BitmapTextBlob BitmapTextBlob;
|
|
|
| - GrTextBlobCache() : fPool(kPreAllocSize, kMinGrowthSize) {}
|
| + /**
|
| + * The callback function used by the cache when it is still over budget after a purge. The
|
| + * passed in 'data' is the same 'data' handed to setOverbudgetCallback.
|
| + */
|
| + typedef void (*PFOverBudgetCB)(void* data);
|
| +
|
| + GrTextBlobCache(PFOverBudgetCB cb, void* data)
|
| + : fPool(kPreAllocSize, kMinGrowthSize)
|
| + , fCallback(cb)
|
| + , fData(data) {
|
| + SkASSERT(cb && data);
|
| + }
|
| ~GrTextBlobCache();
|
|
|
| // creates an uncached blob
|
| @@ -52,12 +63,25 @@ public:
|
| iter.init(fBlobList, BitmapBlobList::Iter::kTail_IterStart);
|
| BitmapTextBlob* lruBlob = iter.get();
|
| SkASSERT(lruBlob);
|
| - do {
|
| + while (fPool.size() > kBudget && (lruBlob = iter.get()) && lruBlob != blob) {
|
| fCache.remove(lruBlob->fUniqueID);
|
| fBlobList.remove(lruBlob);
|
| - lruBlob->unref();
|
| iter.prev();
|
| - } while (fPool.size() > kBudget && (lruBlob = iter.get()));
|
| + lruBlob->unref();
|
| + }
|
| +
|
| + // If we break out of the loop with lruBlob == blob, then we haven't purged enough
|
| + // use the call back and try to free some more. If we are still overbudget after this,
|
| + // then this single textblob is over our budget
|
| + if (lruBlob == blob) {
|
| + (*fCallback)(fData);
|
| + }
|
| +
|
| +#ifdef SK_DEBUG
|
| + if (fPool.size() > kBudget) {
|
| + SkDebugf("Single textblob is larger than our whole budget");
|
| + }
|
| +#endif
|
| }
|
| }
|
|
|
| @@ -85,10 +109,12 @@ private:
|
| // based off of the largest cached textblob I have seen in the skps(a couple of kilobytes).
|
| static const int kPreAllocSize = 1 << 17;
|
| static const int kMinGrowthSize = 1 << 17;
|
| - static const int kBudget = 1 << 20;
|
| + static const int kBudget = 1 << 22;
|
| BitmapBlobList fBlobList;
|
| SkTDynamicHash<BitmapTextBlob, uint32_t> fCache;
|
| GrMemoryPool fPool;
|
| + PFOverBudgetCB fCallback;
|
| + void* fData;
|
| };
|
|
|
| #endif
|
|
|