FboCache.cpp revision eb99356a0548684a501766e6a524529ab93304c8
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
21e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy#include "FboCache.h"
22e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy#include "Properties.h"
23e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy
24e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guynamespace android {
25e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guynamespace uirenderer {
26e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy
27e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy///////////////////////////////////////////////////////////////////////////////
28e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy// Constructors/destructor
29e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy///////////////////////////////////////////////////////////////////////////////
30e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy
31e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain GuyFboCache::FboCache(): mMaxSize(DEFAULT_FBO_CACHE_SIZE) {
32e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy    char property[PROPERTY_VALUE_MAX];
33e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy    if (property_get(PROPERTY_FBO_CACHE_SIZE, property, NULL) > 0) {
34e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy        LOGD("  Setting fbo cache size to %s", property);
35e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy        mMaxSize = atoi(property);
36e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy    } else {
37e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy        LOGD("  Using default fbo cache size of %d", DEFAULT_FBO_CACHE_SIZE);
38e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy    }
39e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy}
40e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy
41e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain GuyFboCache::~FboCache() {
42e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy    clear();
43e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy}
44e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy
45e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy///////////////////////////////////////////////////////////////////////////////
46e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy// Size management
47e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy///////////////////////////////////////////////////////////////////////////////
48e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy
49e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guyuint32_t FboCache::getSize() {
50e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy    return mCache.size();
51e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy}
52e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy
53e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guyuint32_t FboCache::getMaxSize() {
54e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy    return mMaxSize;
55e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy}
56e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy
57e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy///////////////////////////////////////////////////////////////////////////////
58e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy// Caching
59e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy///////////////////////////////////////////////////////////////////////////////
60e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy
61e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guyvoid FboCache::clear() {
62eb99356a0548684a501766e6a524529ab93304c8Romain Guy    for (size_t i = 0; i < mCache.size(); i++) {
63eb99356a0548684a501766e6a524529ab93304c8Romain Guy        const GLuint fbo = mCache.itemAt(i);
64eb99356a0548684a501766e6a524529ab93304c8Romain Guy        glDeleteFramebuffers(1, &fbo);
65eb99356a0548684a501766e6a524529ab93304c8Romain Guy    }
66eb99356a0548684a501766e6a524529ab93304c8Romain Guy    mCache.clear();
67e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy}
68e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy
69e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain GuyGLuint FboCache::get() {
70eb99356a0548684a501766e6a524529ab93304c8Romain Guy    GLuint fbo;
71eb99356a0548684a501766e6a524529ab93304c8Romain Guy    if (mCache.size() > 0) {
72eb99356a0548684a501766e6a524529ab93304c8Romain Guy        fbo = mCache.itemAt(mCache.size() - 1);
73eb99356a0548684a501766e6a524529ab93304c8Romain Guy        mCache.removeAt(mCache.size() - 1);
74eb99356a0548684a501766e6a524529ab93304c8Romain Guy    } else {
75eb99356a0548684a501766e6a524529ab93304c8Romain Guy        glGenFramebuffers(1, &fbo);
76eb99356a0548684a501766e6a524529ab93304c8Romain Guy    }
77eb99356a0548684a501766e6a524529ab93304c8Romain Guy    return fbo;
78e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy}
79e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy
80e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guybool FboCache::put(GLuint fbo) {
81eb99356a0548684a501766e6a524529ab93304c8Romain Guy    if (mCache.size() < mMaxSize) {
82eb99356a0548684a501766e6a524529ab93304c8Romain Guy        mCache.add(fbo);
83eb99356a0548684a501766e6a524529ab93304c8Romain Guy        return true;
84eb99356a0548684a501766e6a524529ab93304c8Romain Guy    }
85eb99356a0548684a501766e6a524529ab93304c8Romain Guy
86eb99356a0548684a501766e6a524529ab93304c8Romain Guy    glDeleteFramebuffers(1, &fbo);
87e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy    return false;
88e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy}
89e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy
90e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy}; // namespace uirenderer
91e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy}; // namespace android
92