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
17eb99356a0548684a501766e6a524529ab93304c8Romain Guy#include <stdlib.h>
18eb99356a0548684a501766e6a524529ab93304c8Romain Guy
19c9855a53edfac818dc68714557185977556f849dRomain Guy#include "Debug.h"
20e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy#include "FboCache.h"
21e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy#include "Properties.h"
22e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy
23e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guynamespace android {
24e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guynamespace uirenderer {
25e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy
26e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy///////////////////////////////////////////////////////////////////////////////
27e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy// Constructors/destructor
28e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy///////////////////////////////////////////////////////////////////////////////
29e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy
3048a8f431fa52ae2ee25ffba9d20676f03bb710ffChris CraikFboCache::FboCache()
3148a8f431fa52ae2ee25ffba9d20676f03bb710ffChris Craik        : mMaxSize(Properties::fboCacheSize) {}
32e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy
33e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain GuyFboCache::~FboCache() {
34e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy    clear();
35e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy}
36e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy
37e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy///////////////////////////////////////////////////////////////////////////////
38e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy// Size management
39e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy///////////////////////////////////////////////////////////////////////////////
40e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy
41e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guyuint32_t FboCache::getSize() {
42e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy    return mCache.size();
43e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy}
44e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy
45e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guyuint32_t FboCache::getMaxSize() {
46e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy    return mMaxSize;
47e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy}
48e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy
49e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy///////////////////////////////////////////////////////////////////////////////
50e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy// Caching
51e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy///////////////////////////////////////////////////////////////////////////////
52e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy
53e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guyvoid FboCache::clear() {
54eb99356a0548684a501766e6a524529ab93304c8Romain Guy    for (size_t i = 0; i < mCache.size(); i++) {
55eb99356a0548684a501766e6a524529ab93304c8Romain Guy        const GLuint fbo = mCache.itemAt(i);
56eb99356a0548684a501766e6a524529ab93304c8Romain Guy        glDeleteFramebuffers(1, &fbo);
57eb99356a0548684a501766e6a524529ab93304c8Romain Guy    }
58eb99356a0548684a501766e6a524529ab93304c8Romain Guy    mCache.clear();
59e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy}
60e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy
61e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain GuyGLuint FboCache::get() {
62eb99356a0548684a501766e6a524529ab93304c8Romain Guy    GLuint fbo;
63eb99356a0548684a501766e6a524529ab93304c8Romain Guy    if (mCache.size() > 0) {
64eb99356a0548684a501766e6a524529ab93304c8Romain Guy        fbo = mCache.itemAt(mCache.size() - 1);
65eb99356a0548684a501766e6a524529ab93304c8Romain Guy        mCache.removeAt(mCache.size() - 1);
66eb99356a0548684a501766e6a524529ab93304c8Romain Guy    } else {
67eb99356a0548684a501766e6a524529ab93304c8Romain Guy        glGenFramebuffers(1, &fbo);
68eb99356a0548684a501766e6a524529ab93304c8Romain Guy    }
69eb99356a0548684a501766e6a524529ab93304c8Romain Guy    return fbo;
70e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy}
71e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy
72e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guybool FboCache::put(GLuint fbo) {
73eb99356a0548684a501766e6a524529ab93304c8Romain Guy    if (mCache.size() < mMaxSize) {
74eb99356a0548684a501766e6a524529ab93304c8Romain Guy        mCache.add(fbo);
75eb99356a0548684a501766e6a524529ab93304c8Romain Guy        return true;
76eb99356a0548684a501766e6a524529ab93304c8Romain Guy    }
77eb99356a0548684a501766e6a524529ab93304c8Romain Guy
78eb99356a0548684a501766e6a524529ab93304c8Romain Guy    glDeleteFramebuffers(1, &fbo);
79e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy    return false;
80e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy}
81e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy
82e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy}; // namespace uirenderer
83e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy}; // namespace android
84