1e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy/* 2e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy * Copyright (C) 2010 The Android Open Source Project 3e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy * 4e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy * Licensed under the Apache License, Version 2.0 (the "License"); 5e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy * you may not use this file except in compliance with the License. 6e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy * You may obtain a copy of the License at 7e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy * 8e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy * http://www.apache.org/licenses/LICENSE-2.0 9e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy * 10e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy * Unless required by applicable law or agreed to in writing, software 11e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy * distributed under the License is distributed on an "AS IS" BASIS, 12e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy * See the License for the specific language governing permissions and 14e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy * limitations under the License. 15e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy */ 16e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy 17e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy#define LOG_TAG "OpenGLRenderer" 18e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy 19eb99356a0548684a501766e6a524529ab93304c8Romain Guy#include <stdlib.h> 20eb99356a0548684a501766e6a524529ab93304c8Romain Guy 21c9855a53edfac818dc68714557185977556f849dRomain Guy#include "Debug.h" 22e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy#include "FboCache.h" 23e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy#include "Properties.h" 24e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy 25e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guynamespace android { 26e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guynamespace uirenderer { 27e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy 28e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy/////////////////////////////////////////////////////////////////////////////// 29e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy// Constructors/destructor 30e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy/////////////////////////////////////////////////////////////////////////////// 31e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy 32e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain GuyFboCache::FboCache(): mMaxSize(DEFAULT_FBO_CACHE_SIZE) { 33e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy char property[PROPERTY_VALUE_MAX]; 34e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy if (property_get(PROPERTY_FBO_CACHE_SIZE, property, NULL) > 0) { 35c9855a53edfac818dc68714557185977556f849dRomain Guy INIT_LOGD(" Setting fbo cache size to %s", property); 36e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy mMaxSize = atoi(property); 37e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy } else { 38c9855a53edfac818dc68714557185977556f849dRomain Guy INIT_LOGD(" Using default fbo cache size of %d", DEFAULT_FBO_CACHE_SIZE); 39e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy } 40e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy} 41e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy 42e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain GuyFboCache::~FboCache() { 43e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy clear(); 44e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy} 45e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy 46e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy/////////////////////////////////////////////////////////////////////////////// 47e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy// Size management 48e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy/////////////////////////////////////////////////////////////////////////////// 49e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy 50e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guyuint32_t FboCache::getSize() { 51e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy return mCache.size(); 52e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy} 53e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy 54e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guyuint32_t FboCache::getMaxSize() { 55e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy return mMaxSize; 56e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy} 57e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy 58e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy/////////////////////////////////////////////////////////////////////////////// 59e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy// Caching 60e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy/////////////////////////////////////////////////////////////////////////////// 61e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy 62e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guyvoid FboCache::clear() { 63eb99356a0548684a501766e6a524529ab93304c8Romain Guy for (size_t i = 0; i < mCache.size(); i++) { 64eb99356a0548684a501766e6a524529ab93304c8Romain Guy const GLuint fbo = mCache.itemAt(i); 65eb99356a0548684a501766e6a524529ab93304c8Romain Guy glDeleteFramebuffers(1, &fbo); 66eb99356a0548684a501766e6a524529ab93304c8Romain Guy } 67eb99356a0548684a501766e6a524529ab93304c8Romain Guy mCache.clear(); 68e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy} 69e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy 70e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain GuyGLuint FboCache::get() { 71eb99356a0548684a501766e6a524529ab93304c8Romain Guy GLuint fbo; 72eb99356a0548684a501766e6a524529ab93304c8Romain Guy if (mCache.size() > 0) { 73eb99356a0548684a501766e6a524529ab93304c8Romain Guy fbo = mCache.itemAt(mCache.size() - 1); 74eb99356a0548684a501766e6a524529ab93304c8Romain Guy mCache.removeAt(mCache.size() - 1); 75eb99356a0548684a501766e6a524529ab93304c8Romain Guy } else { 76eb99356a0548684a501766e6a524529ab93304c8Romain Guy glGenFramebuffers(1, &fbo); 77eb99356a0548684a501766e6a524529ab93304c8Romain Guy } 78eb99356a0548684a501766e6a524529ab93304c8Romain Guy return fbo; 79e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy} 80e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy 81e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guybool FboCache::put(GLuint fbo) { 82eb99356a0548684a501766e6a524529ab93304c8Romain Guy if (mCache.size() < mMaxSize) { 83eb99356a0548684a501766e6a524529ab93304c8Romain Guy mCache.add(fbo); 84eb99356a0548684a501766e6a524529ab93304c8Romain Guy return true; 85eb99356a0548684a501766e6a524529ab93304c8Romain Guy } 86eb99356a0548684a501766e6a524529ab93304c8Romain Guy 87eb99356a0548684a501766e6a524529ab93304c8Romain Guy glDeleteFramebuffers(1, &fbo); 88e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy return false; 89e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy} 90e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy 91e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy}; // namespace uirenderer 92e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy}; // namespace android 93