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