The rest of: Add purgeAsNeeded calls before addResource calls
https://codereview.chromium.org/19591003/ git-svn-id: http://skia.googlecode.com/svn/trunk@10146 2bbb7eff-a529-9590-31e7-b0007b416f81
This commit is contained in:
parent
1622a6d950
commit
41d2532931
@ -276,28 +276,33 @@ void GrResourceCache::makeNonExclusive(GrResourceEntry* entry) {
|
||||
* resource's destructor inserting new resources into the cache. If these
|
||||
* new resources were unlocked before purgeAsNeeded completed it could
|
||||
* potentially make purgeAsNeeded loop infinitely.
|
||||
*
|
||||
* extraCount and extraBytes are added to the current resource totals to account
|
||||
* for incoming resources (e.g., GrContext is about to add 10MB split between
|
||||
* 10 textures).
|
||||
*/
|
||||
void GrResourceCache::purgeAsNeeded() {
|
||||
void GrResourceCache::purgeAsNeeded(int extraCount, size_t extraBytes) {
|
||||
if (fPurging) {
|
||||
return;
|
||||
}
|
||||
|
||||
fPurging = true;
|
||||
|
||||
this->internalPurge();
|
||||
if ((fEntryCount > fMaxCount || fEntryBytes > fMaxBytes) &&
|
||||
this->internalPurge(extraCount, extraBytes);
|
||||
if (((fEntryCount+extraCount) > fMaxCount ||
|
||||
(fEntryBytes+extraBytes) > fMaxBytes) &&
|
||||
NULL != fOverbudgetCB) {
|
||||
// Despite the purge we're still over budget. See if Ganesh can
|
||||
// release some resources and purge again.
|
||||
if ((*fOverbudgetCB)(fOverbudgetData)) {
|
||||
this->internalPurge();
|
||||
this->internalPurge(extraCount, extraBytes);
|
||||
}
|
||||
}
|
||||
|
||||
fPurging = false;
|
||||
}
|
||||
|
||||
void GrResourceCache::internalPurge() {
|
||||
void GrResourceCache::internalPurge(int extraCount, size_t extraBytes) {
|
||||
SkASSERT(fPurging);
|
||||
|
||||
bool withinBudget = false;
|
||||
@ -319,7 +324,8 @@ void GrResourceCache::internalPurge() {
|
||||
while (NULL != entry) {
|
||||
GrAutoResourceCacheValidate atcv(this);
|
||||
|
||||
if (fEntryCount <= fMaxCount && fEntryBytes <= fMaxBytes) {
|
||||
if ((fEntryCount+extraCount) <= fMaxCount &&
|
||||
(fEntryBytes+extraBytes) <= fMaxBytes) {
|
||||
withinBudget = true;
|
||||
break;
|
||||
}
|
||||
|
@ -326,8 +326,12 @@ public:
|
||||
* Allow cache to purge unused resources to obey resource limitations
|
||||
* Note: this entry point will be hidden (again) once totally ref-driven
|
||||
* cache maintenance is implemented
|
||||
*
|
||||
* extraCount and extraBytes are added to the current resource allocation
|
||||
* to make sure enough room is available for future additions (e.g,
|
||||
* 10MB across 10 textures is about to be added).
|
||||
*/
|
||||
void purgeAsNeeded();
|
||||
void purgeAsNeeded(int extraCount = 0, size_t extraBytes = 0);
|
||||
|
||||
#if GR_DEBUG
|
||||
void validate() const;
|
||||
@ -384,7 +388,7 @@ private:
|
||||
PFOverbudgetCB fOverbudgetCB;
|
||||
void* fOverbudgetData;
|
||||
|
||||
void internalPurge();
|
||||
void internalPurge(int extraCount, size_t extraBytes);
|
||||
|
||||
#if GR_DEBUG
|
||||
static size_t countBytes(const SkTInternalLList<GrResourceEntry>& list);
|
||||
|
Loading…
Reference in New Issue
Block a user