add getter/setter for TextureCache, so that clients can make their budget
decisions at runtime or per-context, rather than just at compile-time. Leaving
in the default values as is.



git-svn-id: http://skia.googlecode.com/svn/trunk@709 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/gpu/src/GrContext.cpp b/gpu/src/GrContext.cpp
index 5128602..ee78848 100644
--- a/gpu/src/GrContext.cpp
+++ b/gpu/src/GrContext.cpp
@@ -232,6 +232,17 @@
     return fGpu->createTexture(desc, srcData, rowBytes);

 }

 

+void GrContext::getTextureCacheLimits(int* maxTextures,

+                                      size_t* maxTextureBytes) const {

+    fTextureCache->getLimits(maxTextures, maxTextureBytes);

+}

+

+void GrContext::setTextureCacheLimits(int maxTextures, size_t maxTextureBytes) {

+    fTextureCache->setLimits(maxTextures, maxTextureBytes);

+}

+

+///////////////////////////////////////////////////////////////////////////////

+

 GrRenderTarget* GrContext::createPlatformRenderTarget(intptr_t platformRenderTarget,

                                                       int width, int height) {

     return fGpu->createPlatformRenderTarget(platformRenderTarget,

diff --git a/gpu/src/GrTextureCache.cpp b/gpu/src/GrTextureCache.cpp
index 3ba3339..bc2a904 100644
--- a/gpu/src/GrTextureCache.cpp
+++ b/gpu/src/GrTextureCache.cpp
@@ -41,7 +41,7 @@
 
 ///////////////////////////////////////////////////////////////////////////////
 
-GrTextureCache::GrTextureCache(int maxCount, size_t maxBytes) : 
+GrTextureCache::GrTextureCache(int maxCount, size_t maxBytes) :
         fMaxCount(maxCount),
         fMaxBytes(maxBytes) {
     fEntryCount          = 0;
@@ -54,11 +54,31 @@
 
 GrTextureCache::~GrTextureCache() {
     GrAutoTextureCacheValidate atcv(this);
-    
+
     this->deleteAll(kFreeTexture_DeleteMode);
 }
 
-void GrTextureCache::internalDetach(GrTextureEntry* entry, 
+void GrTextureCache::getLimits(int* maxTextures, size_t* maxTextureBytes) const{
+    if (maxTextures) {
+        *maxTextures = fMaxCount;
+    }
+    if (maxTextureBytes) {
+        *maxTextureBytes = fMaxBytes;
+    }
+}
+
+void GrTextureCache::setLimits(int maxTextures, size_t maxTextureBytes) {
+    bool smaller = (maxTextures < fMaxCount) || (maxTextureBytes < fMaxBytes);
+
+    fMaxCount = maxTextures;
+    fMaxBytes = maxTextureBytes;
+
+    if (smaller) {
+        this->purgeAsNeeded();
+    }
+}
+
+void GrTextureCache::internalDetach(GrTextureEntry* entry,
                                     bool clientDetach) {
     GrTextureEntry* prev = entry->fPrev;
     GrTextureEntry* next = entry->fNext;
@@ -84,7 +104,7 @@
     }
 }
 
-void GrTextureCache::attachToHead(GrTextureEntry* entry, 
+void GrTextureCache::attachToHead(GrTextureEntry* entry,
                                   bool clientReattach) {
     entry->fPrev = NULL;
     entry->fNext = fHead;
@@ -114,7 +134,7 @@
     Key(const GrTextureKey& key) : fKey(key) {}
 
     uint32_t getHash() const { return fKey.hashIndex(); }
-    
+
     static bool LT(const T& entry, const Key& key) {
         return entry.key() < key.fKey;
     }
@@ -180,7 +200,7 @@
 
 void GrTextureCache::unlock(GrTextureEntry* entry) {
     GrAutoTextureCacheValidate atcv(this);
-    
+
     GrAssert(entry);
     GrAssert(entry->isLocked());
     GrAssert(fCache.find(entry->key()));
@@ -191,7 +211,7 @@
 
 void GrTextureCache::purgeAsNeeded() {
     GrAutoTextureCacheValidate atcv(this);
-    
+
     GrTextureEntry* entry = fTail;
     while (entry) {
         if (fEntryCount <= fMaxCount && fEntryBytes <= fMaxBytes) {
@@ -202,7 +222,7 @@
         if (!entry->isLocked()) {
             // remove from our cache
             fCache.remove(entry->fKey, entry);
-            
+
             // remove from our llist
             this->internalDetach(entry, false);
 
@@ -220,7 +240,7 @@
 void GrTextureCache::deleteAll(DeleteMode mode) {
     GrAssert(!fClientDetachedCount);
     GrAssert(!fClientDetachedBytes);
-    
+
     GrTextureEntry* entry = fHead;
     while (entry) {
         GrAssert(!entry->isLocked());
@@ -257,7 +277,7 @@
 void GrTextureCache::validate() const {
     GrAssert(!fHead == !fTail);
     GrAssert(!fEntryCount == !fEntryBytes);
-    GrAssert(!fClientDetachedBytes == !fClientDetachedBytes); 
+    GrAssert(!fClientDetachedBytes == !fClientDetachedBytes);
     GrAssert(fClientDetachedBytes <= fEntryBytes);
     GrAssert(fClientDetachedCount <= fEntryCount);
     GrAssert((fEntryCount - fClientDetachedCount) == fCache.count());
@@ -265,7 +285,7 @@
     GrAssert(fEntryCount >= 0);
     GrAssert(fClientDetachedCount >= 0);
     GrAssert(fClientDetachedBytes >= 0);
-    
+
     fCache.validate();
 
     GrTextureEntry* entry = fHead;