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
diff --git a/src/gpu/GrResourceCache.cpp b/src/gpu/GrResourceCache.cpp
index baae6bd..9dab021 100644
--- a/src/gpu/GrResourceCache.cpp
+++ b/src/gpu/GrResourceCache.cpp
@@ -276,28 +276,33 @@
  * 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 @@
         while (NULL != entry) {
             GrAutoResourceCacheValidate atcv(this);
 
-            if (fEntryCount <= fMaxCount && fEntryBytes <= fMaxBytes) {
+            if ((fEntryCount+extraCount) <= fMaxCount && 
+                (fEntryBytes+extraBytes) <= fMaxBytes) {
                 withinBudget = true;
                 break;
             }