LayerCache.cpp revision 5f0c6a483900f3989f4d2a8f913cf5b6a9777d03
1dda570201ac851dd85af3861f7e575721d3345daRomain Guy/* 2dda570201ac851dd85af3861f7e575721d3345daRomain Guy * Copyright (C) 2010 The Android Open Source Project 3dda570201ac851dd85af3861f7e575721d3345daRomain Guy * 4dda570201ac851dd85af3861f7e575721d3345daRomain Guy * Licensed under the Apache License, Version 2.0 (the "License"); 5dda570201ac851dd85af3861f7e575721d3345daRomain Guy * you may not use this file except in compliance with the License. 6dda570201ac851dd85af3861f7e575721d3345daRomain Guy * You may obtain a copy of the License at 7dda570201ac851dd85af3861f7e575721d3345daRomain Guy * 8dda570201ac851dd85af3861f7e575721d3345daRomain Guy * http://www.apache.org/licenses/LICENSE-2.0 9dda570201ac851dd85af3861f7e575721d3345daRomain Guy * 10dda570201ac851dd85af3861f7e575721d3345daRomain Guy * Unless required by applicable law or agreed to in writing, software 11dda570201ac851dd85af3861f7e575721d3345daRomain Guy * distributed under the License is distributed on an "AS IS" BASIS, 12dda570201ac851dd85af3861f7e575721d3345daRomain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13dda570201ac851dd85af3861f7e575721d3345daRomain Guy * See the License for the specific language governing permissions and 14dda570201ac851dd85af3861f7e575721d3345daRomain Guy * limitations under the License. 15dda570201ac851dd85af3861f7e575721d3345daRomain Guy */ 16dda570201ac851dd85af3861f7e575721d3345daRomain Guy 17dda570201ac851dd85af3861f7e575721d3345daRomain Guy#define LOG_TAG "OpenGLRenderer" 18dda570201ac851dd85af3861f7e575721d3345daRomain Guy 19dda570201ac851dd85af3861f7e575721d3345daRomain Guy#include <GLES2/gl2.h> 20dda570201ac851dd85af3861f7e575721d3345daRomain Guy 21dda570201ac851dd85af3861f7e575721d3345daRomain Guy#include "LayerCache.h" 22dda570201ac851dd85af3861f7e575721d3345daRomain Guy 23dda570201ac851dd85af3861f7e575721d3345daRomain Guynamespace android { 24dda570201ac851dd85af3861f7e575721d3345daRomain Guynamespace uirenderer { 25dda570201ac851dd85af3861f7e575721d3345daRomain Guy 26dda570201ac851dd85af3861f7e575721d3345daRomain Guy/////////////////////////////////////////////////////////////////////////////// 27dda570201ac851dd85af3861f7e575721d3345daRomain Guy// Constructors/destructor 28dda570201ac851dd85af3861f7e575721d3345daRomain Guy/////////////////////////////////////////////////////////////////////////////// 29dda570201ac851dd85af3861f7e575721d3345daRomain Guy 30dda570201ac851dd85af3861f7e575721d3345daRomain GuyLayerCache::LayerCache(uint32_t maxByteSize): 315f0c6a483900f3989f4d2a8f913cf5b6a9777d03Romain Guy mCache(GenerationMultiCache<LayerSize, Layer*>::kUnlimitedCapacity), 32dda570201ac851dd85af3861f7e575721d3345daRomain Guy mSize(0), mMaxSize(maxByteSize) { 33dda570201ac851dd85af3861f7e575721d3345daRomain Guy} 34dda570201ac851dd85af3861f7e575721d3345daRomain Guy 35dda570201ac851dd85af3861f7e575721d3345daRomain GuyLayerCache::~LayerCache() { 365f0c6a483900f3989f4d2a8f913cf5b6a9777d03Romain Guy clear(); 37dda570201ac851dd85af3861f7e575721d3345daRomain Guy} 38dda570201ac851dd85af3861f7e575721d3345daRomain Guy 39dda570201ac851dd85af3861f7e575721d3345daRomain Guy/////////////////////////////////////////////////////////////////////////////// 40dda570201ac851dd85af3861f7e575721d3345daRomain Guy// Size management 41dda570201ac851dd85af3861f7e575721d3345daRomain Guy/////////////////////////////////////////////////////////////////////////////// 42dda570201ac851dd85af3861f7e575721d3345daRomain Guy 43dda570201ac851dd85af3861f7e575721d3345daRomain Guyuint32_t LayerCache::getSize() { 44dda570201ac851dd85af3861f7e575721d3345daRomain Guy return mSize; 45dda570201ac851dd85af3861f7e575721d3345daRomain Guy} 46dda570201ac851dd85af3861f7e575721d3345daRomain Guy 47dda570201ac851dd85af3861f7e575721d3345daRomain Guyuint32_t LayerCache::getMaxSize() { 48dda570201ac851dd85af3861f7e575721d3345daRomain Guy return mMaxSize; 49dda570201ac851dd85af3861f7e575721d3345daRomain Guy} 50dda570201ac851dd85af3861f7e575721d3345daRomain Guy 51dda570201ac851dd85af3861f7e575721d3345daRomain Guyvoid LayerCache::setMaxSize(uint32_t maxSize) { 52dda570201ac851dd85af3861f7e575721d3345daRomain Guy mMaxSize = maxSize; 53dda570201ac851dd85af3861f7e575721d3345daRomain Guy while (mSize > mMaxSize) { 54dda570201ac851dd85af3861f7e575721d3345daRomain Guy Layer* oldest = mCache.removeOldest(); 55dda570201ac851dd85af3861f7e575721d3345daRomain Guy deleteLayer(oldest); 56dda570201ac851dd85af3861f7e575721d3345daRomain Guy } 57dda570201ac851dd85af3861f7e575721d3345daRomain Guy} 58dda570201ac851dd85af3861f7e575721d3345daRomain Guy 59dda570201ac851dd85af3861f7e575721d3345daRomain Guy/////////////////////////////////////////////////////////////////////////////// 60dda570201ac851dd85af3861f7e575721d3345daRomain Guy// Callbacks 61dda570201ac851dd85af3861f7e575721d3345daRomain Guy/////////////////////////////////////////////////////////////////////////////// 62dda570201ac851dd85af3861f7e575721d3345daRomain Guy 63dda570201ac851dd85af3861f7e575721d3345daRomain Guyvoid LayerCache::operator()(LayerSize& size, Layer*& layer) { 64dda570201ac851dd85af3861f7e575721d3345daRomain Guy deleteLayer(layer); 65dda570201ac851dd85af3861f7e575721d3345daRomain Guy} 66dda570201ac851dd85af3861f7e575721d3345daRomain Guy 67dda570201ac851dd85af3861f7e575721d3345daRomain Guy/////////////////////////////////////////////////////////////////////////////// 68dda570201ac851dd85af3861f7e575721d3345daRomain Guy// Caching 69dda570201ac851dd85af3861f7e575721d3345daRomain Guy/////////////////////////////////////////////////////////////////////////////// 70dda570201ac851dd85af3861f7e575721d3345daRomain Guy 71dda570201ac851dd85af3861f7e575721d3345daRomain Guyvoid LayerCache::deleteLayer(Layer* layer) { 72dda570201ac851dd85af3861f7e575721d3345daRomain Guy if (layer) { 73dda570201ac851dd85af3861f7e575721d3345daRomain Guy mSize -= layer->layer.getWidth() * layer->layer.getHeight() * 4; 74dda570201ac851dd85af3861f7e575721d3345daRomain Guy 75dda570201ac851dd85af3861f7e575721d3345daRomain Guy glDeleteFramebuffers(1, &layer->fbo); 76dda570201ac851dd85af3861f7e575721d3345daRomain Guy glDeleteTextures(1, &layer->texture); 77dda570201ac851dd85af3861f7e575721d3345daRomain Guy delete layer; 78dda570201ac851dd85af3861f7e575721d3345daRomain Guy } 79dda570201ac851dd85af3861f7e575721d3345daRomain Guy} 80dda570201ac851dd85af3861f7e575721d3345daRomain Guy 81dda570201ac851dd85af3861f7e575721d3345daRomain Guyvoid LayerCache::clear() { 82dda570201ac851dd85af3861f7e575721d3345daRomain Guy mCache.setOnEntryRemovedListener(this); 83dda570201ac851dd85af3861f7e575721d3345daRomain Guy mCache.clear(); 84dda570201ac851dd85af3861f7e575721d3345daRomain Guy mCache.setOnEntryRemovedListener(NULL); 85dda570201ac851dd85af3861f7e575721d3345daRomain Guy} 86dda570201ac851dd85af3861f7e575721d3345daRomain Guy 87dda570201ac851dd85af3861f7e575721d3345daRomain GuyLayer* LayerCache::get(LayerSize& size) { 88dda570201ac851dd85af3861f7e575721d3345daRomain Guy Layer* layer = mCache.remove(size); 89dda570201ac851dd85af3861f7e575721d3345daRomain Guy if (layer) { 90dda570201ac851dd85af3861f7e575721d3345daRomain Guy mSize -= layer->layer.getWidth() * layer->layer.getHeight() * 4; 91dda570201ac851dd85af3861f7e575721d3345daRomain Guy } 92dda570201ac851dd85af3861f7e575721d3345daRomain Guy return layer; 93dda570201ac851dd85af3861f7e575721d3345daRomain Guy} 94dda570201ac851dd85af3861f7e575721d3345daRomain Guy 95dda570201ac851dd85af3861f7e575721d3345daRomain Guybool LayerCache::put(LayerSize& layerSize, Layer* layer) { 96dda570201ac851dd85af3861f7e575721d3345daRomain Guy const uint32_t size = layerSize.width * layerSize.height * 4; 97dda570201ac851dd85af3861f7e575721d3345daRomain Guy // Don't even try to cache a layer that's bigger than the cache 98dda570201ac851dd85af3861f7e575721d3345daRomain Guy if (size < mMaxSize) { 99dda570201ac851dd85af3861f7e575721d3345daRomain Guy while (mSize + size > mMaxSize) { 100dda570201ac851dd85af3861f7e575721d3345daRomain Guy Layer* oldest = mCache.removeOldest(); 101dda570201ac851dd85af3861f7e575721d3345daRomain Guy deleteLayer(oldest); 102dda570201ac851dd85af3861f7e575721d3345daRomain Guy } 103dda570201ac851dd85af3861f7e575721d3345daRomain Guy 104dda570201ac851dd85af3861f7e575721d3345daRomain Guy mCache.put(layerSize, layer); 105dda570201ac851dd85af3861f7e575721d3345daRomain Guy mSize += size; 106dda570201ac851dd85af3861f7e575721d3345daRomain Guy 107dda570201ac851dd85af3861f7e575721d3345daRomain Guy return true; 108dda570201ac851dd85af3861f7e575721d3345daRomain Guy } 109dda570201ac851dd85af3861f7e575721d3345daRomain Guy return false; 110dda570201ac851dd85af3861f7e575721d3345daRomain Guy} 111dda570201ac851dd85af3861f7e575721d3345daRomain Guy 112dda570201ac851dd85af3861f7e575721d3345daRomain Guy}; // namespace uirenderer 113dda570201ac851dd85af3861f7e575721d3345daRomain Guy}; // namespace android 114