Revert r4287. Large numbers of textures created by random gradients can cause poor driver performance (at least on Mac)

BUG=670



git-svn-id: http://skia.googlecode.com/svn/trunk@4306 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/gpu/GrResourceCache.cpp b/src/gpu/GrResourceCache.cpp
index 8c93971..2ad5d6f 100644
--- a/src/gpu/GrResourceCache.cpp
+++ b/src/gpu/GrResourceCache.cpp
@@ -34,8 +34,9 @@
 
 ///////////////////////////////////////////////////////////////////////////////
 
-GrResourceCache::GrResourceCache(size_t maxBytes) {
-    fMaxBytes            = maxBytes;
+GrResourceCache::GrResourceCache(int maxCount, size_t maxBytes) :
+        fMaxCount(maxCount),
+        fMaxBytes(maxBytes) {
     fEntryCount          = 0;
     fUnlockedEntryCount  = 0;
     fEntryBytes          = 0;
@@ -52,9 +53,19 @@
     this->removeAll();
 }
 
-void GrResourceCache::setBudget(size_t maxResourceBytes) {
-    bool smaller = maxResourceBytes < fMaxBytes;
+void GrResourceCache::getLimits(int* maxResources, size_t* maxResourceBytes) const{
+    if (maxResources) {
+        *maxResources = fMaxCount;
+    }
+    if (maxResourceBytes) {
+        *maxResourceBytes = fMaxBytes;
+    }
+}
 
+void GrResourceCache::setLimits(int maxResources, size_t maxResourceBytes) {
+    bool smaller = (maxResources < fMaxCount) || (maxResourceBytes < fMaxBytes);
+
+    fMaxCount = maxResources;
     fMaxBytes = maxResourceBytes;
 
     if (smaller) {
@@ -233,7 +244,6 @@
         fClientDetachedCount -= 1;
         fEntryCount -= 1;
         size_t size = entry->resource()->sizeInBytes();
-        GrAssert(size > 0);
         fClientDetachedBytes -= size;
         fEntryBytes -= size;
     }
@@ -272,7 +282,7 @@
             GrResourceEntry* entry = fTail;
             while (entry && fUnlockedEntryCount) {
                 GrAutoResourceCacheValidate atcv(this);
-                if (fEntryBytes <= fMaxBytes) {
+                if (fEntryCount <= fMaxCount && fEntryBytes <= fMaxBytes) {
                     withinBudget = true;
                     break;
                 }
@@ -308,7 +318,9 @@
     // entry out. Instead change the budget and purge.
 
     int savedMaxBytes = fMaxBytes;
-    fMaxBytes = 0;
+    int savedMaxCount = fMaxCount;
+    fMaxBytes = (size_t) -1;
+    fMaxCount = 0;
     this->purgeAsNeeded();
 
 #if GR_DEBUG
@@ -325,6 +337,7 @@
 #endif
 
     fMaxBytes = savedMaxBytes;
+    fMaxCount = savedMaxCount;
 }
 
 ///////////////////////////////////////////////////////////////////////////////