diff options
| -rw-r--r-- | libs/hwui/LayerCache.cpp | 15 | ||||
| -rw-r--r-- | libs/hwui/LayerCache.h | 2 | ||||
| -rw-r--r-- | libs/hwui/OpenGLRenderer.cpp | 2 | ||||
| -rw-r--r-- | libs/hwui/Properties.h | 4 |
4 files changed, 15 insertions, 8 deletions
diff --git a/libs/hwui/LayerCache.cpp b/libs/hwui/LayerCache.cpp index 31da924b5a0b..9ce0359140bb 100644 --- a/libs/hwui/LayerCache.cpp +++ b/libs/hwui/LayerCache.cpp @@ -68,7 +68,6 @@ void LayerCache::setMaxSize(uint32_t maxSize) { void LayerCache::deleteLayer(Layer* layer) { if (layer) { mSize -= layer->width * layer->height * 4; - glDeleteTextures(1, &layer->texture); delete layer; } @@ -133,12 +132,16 @@ bool LayerCache::put(Layer* layer) { if (size < mMaxSize) { // TODO: Use an LRU while (mSize + size > mMaxSize) { - Layer* biggest = mCache.top().mLayer; - deleteLayer(biggest); - mCache.removeAt(mCache.size() - 1); + size_t position = 0; +#if LAYER_REMOVE_BIGGEST + position = mCache.size() - 1; +#endif + Layer* victim = mCache.itemAt(position).mLayer; + deleteLayer(victim); + mCache.removeAt(position); - LAYER_LOGD(" Deleting layer %.2fx%.2f", biggest->layer.getWidth(), - biggest->layer.getHeight()); + LAYER_LOGD(" Deleting layer %.2fx%.2f", victim->layer.getWidth(), + victim->layer.getHeight()); } LayerEntry entry(layer); diff --git a/libs/hwui/LayerCache.h b/libs/hwui/LayerCache.h index e64366f87a26..ae792ab518ce 100644 --- a/libs/hwui/LayerCache.h +++ b/libs/hwui/LayerCache.h @@ -30,6 +30,8 @@ namespace uirenderer { // Debug #define DEBUG_LAYERS 0 +// Indicates whether to remove the biggest layers first, or the smaller ones +#define LAYER_REMOVE_BIGGEST 0 // Textures used by layers must have dimensions multiples of this number #define LAYER_SIZE 64 diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp index e965e6119e82..585fa53039bd 100644 --- a/libs/hwui/OpenGLRenderer.cpp +++ b/libs/hwui/OpenGLRenderer.cpp @@ -441,6 +441,7 @@ bool OpenGLRenderer::createLayer(sp<Snapshot> snapshot, float left, float top, glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, layer->texture, 0); +#if DEBUG_LAYERS GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); if (status != GL_FRAMEBUFFER_COMPLETE) { LOGE("Framebuffer incomplete (GL error code 0x%x)", status); @@ -453,6 +454,7 @@ bool OpenGLRenderer::createLayer(sp<Snapshot> snapshot, float left, float top, return false; } +#endif // Clear the FBO glDisable(GL_SCISSOR_TEST); diff --git a/libs/hwui/Properties.h b/libs/hwui/Properties.h index 2c1a82b4ed76..db3cb4d1e460 100644 --- a/libs/hwui/Properties.h +++ b/libs/hwui/Properties.h @@ -44,8 +44,8 @@ // Converts a number of mega-bytes into bytes #define MB(s) s * 1024 * 1024 -#define DEFAULT_TEXTURE_CACHE_SIZE 22.0f -#define DEFAULT_LAYER_CACHE_SIZE 4.0f +#define DEFAULT_TEXTURE_CACHE_SIZE 20.0f +#define DEFAULT_LAYER_CACHE_SIZE 6.0f #define DEFAULT_PATH_CACHE_SIZE 4.0f #define DEFAULT_PATCH_CACHE_SIZE 512 #define DEFAULT_GRADIENT_CACHE_SIZE 0.5f |