The rest of: Add purgeAsNeeded calls before addResource calls
authorrobertphillips@google.com <robertphillips@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>
Thu, 18 Jul 2013 17:12:57 +0000 (17:12 +0000)
committerrobertphillips@google.com <robertphillips@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>
Thu, 18 Jul 2013 17:12:57 +0000 (17:12 +0000)
https://codereview.chromium.org/19591003/

git-svn-id: http://skia.googlecode.com/svn/trunk@10146 2bbb7eff-a529-9590-31e7-b0007b416f81

src/gpu/GrResourceCache.cpp
src/gpu/GrResourceCache.h

index baae6bd..9dab021 100644 (file)
@@ -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;
             }
index debd064..b27219e 100644 (file)
@@ -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);