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