diff options
Diffstat (limited to 'libs/hwui/TextureCache.cpp')
| -rw-r--r-- | libs/hwui/TextureCache.cpp | 69 | 
1 files changed, 60 insertions, 9 deletions
| diff --git a/libs/hwui/TextureCache.cpp b/libs/hwui/TextureCache.cpp index 7b8b31398188..10e4f9e5df53 100644 --- a/libs/hwui/TextureCache.cpp +++ b/libs/hwui/TextureCache.cpp @@ -14,6 +14,8 @@   * limitations under the License.   */ +#define LOG_TAG "OpenGLRenderer" +  #include <GLES2/gl2.h>  #include "TextureCache.h" @@ -21,7 +23,13 @@  namespace android {  namespace uirenderer { -TextureCache::TextureCache(unsigned int maxEntries): mCache(maxEntries) { +/////////////////////////////////////////////////////////////////////////////// +// Constructors/destructor +/////////////////////////////////////////////////////////////////////////////// + +TextureCache::TextureCache(unsigned int maxByteSize): +        mCache(GenerationCache<SkBitmap, Texture>::kUnlimitedCapacity), +        mSize(0), mMaxSize(maxByteSize) {      mCache.setOnEntryRemovedListener(this);  } @@ -29,28 +37,71 @@ TextureCache::~TextureCache() {      mCache.clear();  } -void TextureCache::operator()(SkBitmap* key, Texture* value) { -    LOGD("Entry removed"); -    if (value) { -        glDeleteTextures(1, &value->id); -        delete value; +/////////////////////////////////////////////////////////////////////////////// +// Size management +/////////////////////////////////////////////////////////////////////////////// + +unsigned int TextureCache::getSize() { +    return mSize; +} + +unsigned int TextureCache::getMaxSize() { +    return mMaxSize; +} + +void TextureCache::setMaxSize(unsigned int maxSize) { +    mMaxSize = maxSize; +    while (mSize > mMaxSize) { +        mCache.removeOldest(); +    } +} + +/////////////////////////////////////////////////////////////////////////////// +// Callbacks +/////////////////////////////////////////////////////////////////////////////// + +void TextureCache::operator()(SkBitmap* bitmap, Texture* texture) { +    if (bitmap) { +        const unsigned int size = bitmap->rowBytes() * bitmap->height(); +        mSize -= size; +    } + +    if (texture) { +        glDeleteTextures(1, &texture->id); +        delete texture;      }  } +/////////////////////////////////////////////////////////////////////////////// +// Caching +/////////////////////////////////////////////////////////////////////////////// +  Texture* TextureCache::get(SkBitmap* bitmap) {      Texture* texture = mCache.get(bitmap);      if (!texture) { +        const unsigned int size = bitmap->rowBytes() * bitmap->height(); +        // Don't even try to cache a bitmap that's bigger than the cache +        if (size < mMaxSize) { +            while (mSize + size > mMaxSize) { +                mCache.removeOldest(); +            } +        } +          texture = new Texture;          generateTexture(bitmap, texture, false); -        mCache.put(bitmap, texture); + +        if (size < mMaxSize) { +            mSize += size; +            mCache.put(bitmap, texture); +        }      } else if (bitmap->getGenerationID() != texture->generation) {          generateTexture(bitmap, texture, true);      }      return texture;  } -Texture* TextureCache::remove(SkBitmap* bitmap) { -    return mCache.remove(bitmap); +void TextureCache::remove(SkBitmap* bitmap) { +    mCache.remove(bitmap);  }  void TextureCache::clear() { |