Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(251)

Unified Diff: src/gpu/GrTextBlobCache.h

Issue 1264283002: Add abliity to set textblob cache budget to GrContext (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: tweak Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/gpu/GrTest.cpp ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/gpu/GrTextBlobCache.h
diff --git a/src/gpu/GrTextBlobCache.h b/src/gpu/GrTextBlobCache.h
index 4c9cb14000e7c1642177bea8b185bc37898e4ac7..ac9ee2bf25f1928af8682d709e9a34e40fffeca9 100644
--- a/src/gpu/GrTextBlobCache.h
+++ b/src/gpu/GrTextBlobCache.h
@@ -23,7 +23,8 @@ public:
GrTextBlobCache(PFOverBudgetCB cb, void* data)
: fPool(kPreAllocSize, kMinGrowthSize)
, fCallback(cb)
- , fData(data) {
+ , fData(data)
+ , fBudget(kDefaultBudget) {
SkASSERT(cb && data);
}
~GrTextBlobCache();
@@ -81,13 +82,44 @@ public:
fCache.add(blob);
fBlobList.addToHead(blob);
+ this->checkPurge(blob);
+ }
+
+ void makeMRU(GrAtlasTextBlob* blob) {
+ if (fBlobList.head() == blob) {
+ return;
+ }
+
+ fBlobList.remove(blob);
+ fBlobList.addToHead(blob);
+ }
+
+ void freeAll();
+
+ // TODO move to SkTextBlob
+ static void BlobGlyphCount(int* glyphCount, int* runCount, const SkTextBlob* blob) {
+ SkTextBlob::RunIterator itCounter(blob);
+ for (; !itCounter.done(); itCounter.next(), (*runCount)++) {
+ *glyphCount += itCounter.glyphCount();
+ }
+ }
+
+ void setBudget(size_t budget) {
+ fBudget = budget;
+ this->checkPurge();
+ }
+
+private:
+ typedef SkTInternalLList<GrAtlasTextBlob> BitmapBlobList;
+
+ void checkPurge(GrAtlasTextBlob* blob = NULL) {
// If we are overbudget, then unref until we are below budget again
- if (fPool.size() > kBudget) {
+ if (fPool.size() > fBudget) {
BitmapBlobList::Iter iter;
iter.init(fBlobList, BitmapBlobList::Iter::kTail_IterStart);
GrAtlasTextBlob* lruBlob = iter.get();
SkASSERT(lruBlob);
- while (fPool.size() > kBudget && (lruBlob = iter.get()) && lruBlob != blob) {
+ while (fPool.size() > fBudget && (lruBlob = iter.get()) && lruBlob != blob) {
fCache.remove(lruBlob->fKey);
// Backup the iterator before removing and unrefing the blob
@@ -99,50 +131,29 @@ public:
// 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) {
+ if (blob && lruBlob == blob) {
(*fCallback)(fData);
}
-#ifdef SK_DEBUG
- if (fPool.size() > kBudget) {
+#ifdef SPEW_BUDGET_MESSAGE
+ if (fPool.size() > fBudget) {
SkDebugf("Single textblob is larger than our whole budget");
}
#endif
}
}
- void makeMRU(GrAtlasTextBlob* blob) {
- if (fBlobList.head() == blob) {
- return;
- }
-
- fBlobList.remove(blob);
- fBlobList.addToHead(blob);
- }
-
- void freeAll();
-
- // TODO move to SkTextBlob
- static void BlobGlyphCount(int* glyphCount, int* runCount, const SkTextBlob* blob) {
- SkTextBlob::RunIterator itCounter(blob);
- for (; !itCounter.done(); itCounter.next(), (*runCount)++) {
- *glyphCount += itCounter.glyphCount();
- }
- }
-
-private:
- typedef SkTInternalLList<GrAtlasTextBlob> BitmapBlobList;
-
// Budget was chosen to be ~4 megabytes. The min alloc and pre alloc sizes in the pool are
// 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 << 22;
+ static const int kDefaultBudget = 1 << 22;
BitmapBlobList fBlobList;
SkTDynamicHash<GrAtlasTextBlob, GrAtlasTextBlob::Key> fCache;
GrMemoryPool fPool;
PFOverBudgetCB fCallback;
void* fData;
+ size_t fBudget;
};
#endif
« no previous file with comments | « src/gpu/GrTest.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698