*/
void freeGpuResources();
+ /**
+ * Returns the number of bytes of GPU memory hosted by the texture cache.
+ */
+ size_t getGpuTextureCacheBytes() const;
+
///////////////////////////////////////////////////////////////////////////
// Textures
int height) const;
/**
- * Return the current texture cache budget in bytes.
+ * Return the current texture cache limits.
+ *
+ * @param maxTextures If non-null, returns maximum number of textures that
+ * can be held in the cache.
+ * @param maxTextureBytes If non-null, returns maximum number of bytes of
+ * texture memory that can be held in the cache.
*/
- size_t getTextureCacheBudget() const;
+ void getTextureCacheLimits(int* maxTextures, size_t* maxTextureBytes) const;
/**
- * Specify the texture cache budget. If the current cache size exceeds the
- * budget it will immediately be purged to be within the budget.
+ * Specify the texture cache limits. If the current cache exceeds either
+ * of these, it will be purged (LRU) to keep the cache within these limits.
*
+ * @param maxTextures The maximum number of textures that can be held in
+ * the cache.
* @param maxTextureBytes The maximum number of bytes of texture memory
* that can be held in the cache.
*/
- void setTextureCacheBudget(size_t maxTextureBytes);
- // DEPRECATED, this will be deleted soon.
- void setTextureCacheLimits(int ignored, size_t maxTextureBytes) {
- this->setTextureCacheBudget(maxTextureBytes);
- }
-
- /**
- * Returns the current number of bytes of GPU memory hosted by the texture
- * cache.
- */
- size_t getGpuTextureCacheBytes() const;
+ void setTextureCacheLimits(int maxTextures, size_t maxTextureBytes);
/**
* Return the max width or height of a texture supported by the current gpu
#define GR_DEBUG_PARTIAL_COVERAGE_CHECK 0
#endif
-static const size_t kDefaultTextureCacheBudget = 16 * 1024 * 1024;
+static const size_t MAX_TEXTURE_CACHE_COUNT = 256;
+static const size_t MAX_TEXTURE_CACHE_BYTES = 16 * 1024 * 1024;
static const size_t DRAW_BUFFER_VBPOOL_BUFFER_SIZE = 1 << 15;
static const int DRAW_BUFFER_VBPOOL_PREALLOC_BUFFERS = 4;
return fGpu->createTexture(descCopy, srcData, rowBytes);
}
-size_t GrContext::getTextureCacheBudget() const {
- return fTextureCache->getBudget();
+void GrContext::getTextureCacheLimits(int* maxTextures,
+ size_t* maxTextureBytes) const {
+ fTextureCache->getLimits(maxTextures, maxTextureBytes);
}
-void GrContext::setTextureCacheBudget(size_t maxTextureBytes) {
- fTextureCache->setBudget(maxTextureBytes);
+void GrContext::setTextureCacheLimits(int maxTextures, size_t maxTextureBytes) {
+ fTextureCache->setLimits(maxTextures, maxTextureBytes);
}
int GrContext::getMaxTextureSize() const {
fPathRendererChain = NULL;
fSoftwarePathRenderer = NULL;
- fTextureCache = new GrResourceCache(kDefaultTextureCacheBudget);
+ fTextureCache = new GrResourceCache(MAX_TEXTURE_CACHE_COUNT,
+ MAX_TEXTURE_CACHE_BYTES);
fFontCache = new GrFontCache(fGpu);
fLastDrawCategory = kUnbuffered_DrawCategory;
///////////////////////////////////////////////////////////////////////////////
-GrResourceCache::GrResourceCache(size_t maxBytes) {
- fMaxBytes = maxBytes;
+GrResourceCache::GrResourceCache(int maxCount, size_t maxBytes) :
+ fMaxCount(maxCount),
+ fMaxBytes(maxBytes) {
fEntryCount = 0;
fUnlockedEntryCount = 0;
fEntryBytes = 0;
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) {
fClientDetachedCount -= 1;
fEntryCount -= 1;
size_t size = entry->resource()->sizeInBytes();
- GrAssert(size > 0);
fClientDetachedBytes -= size;
fEntryBytes -= size;
}
GrResourceEntry* entry = fTail;
while (entry && fUnlockedEntryCount) {
GrAutoResourceCacheValidate atcv(this);
- if (fEntryBytes <= fMaxBytes) {
+ if (fEntryCount <= fMaxCount && fEntryBytes <= fMaxBytes) {
withinBudget = true;
break;
}
// 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
#endif
fMaxBytes = savedMaxBytes;
+ fMaxCount = savedMaxCount;
}
///////////////////////////////////////////////////////////////////////////////
*/
class GrResourceCache {
public:
- GrResourceCache(size_t maxResourceBytes);
+ GrResourceCache(int maxCount, size_t maxBytes);
~GrResourceCache();
/**
- * Returns the cache budget in bytes.
+ * Return the current resource cache limits.
+ *
+ * @param maxResource If non-null, returns maximum number of resources
+ * that can be held in the cache.
+ * @param maxBytes If non-null, returns maximum number of bytes of
+ * gpu memory that can be held in the cache.
*/
- size_t getBudget() const { return fMaxBytes; }
+ void getLimits(int* maxResources, size_t* maxBytes) const;
/**
- * Specify the resource cache budget in bytes of GPU memory. If the current
- * cache exceeds the budget it will be purged to be within the budget.
+ * Specify the resource cache limits. If the current cache exceeds either
+ * of these, it will be purged (LRU) to keep the cache within these limits.
*
- * @param maxResourceBytes The maximum number of bytes of GPU memory that
- * can be held in the cache.
+ * @param maxResources The maximum number of resources that can be held in
+ * the cache.
+ * @param maxBytes The maximum number of bytes of resource memory that
+ * can be held in the cache.
*/
- void setBudget(size_t maxResourceBytes);
+ void setLimits(int maxResource, size_t maxResourceBytes);
/**
* Returns the number of bytes consumed by cached resources.
GrResourceEntry* fTail;
// our budget, used in purgeAsNeeded()
+ int fMaxCount;
size_t fMaxBytes;
// our current stats, related to our budget
// assumption here is that sw bitmap size is a good proxy for its size as
// a texture
size_t bmpSize = bitmap.getSize();
- size_t cacheSize = fContext->getTextureCacheBudget();
+ size_t cacheSize;
+ fContext->getTextureCacheLimits(NULL, &cacheSize);
if (bmpSize < cacheSize / 2) {
return false;
}