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
175b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#ifndef ANDROID_HWUI_FBO_CACHE_H
185b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#define ANDROID_HWUI_FBO_CACHE_H
19e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy
20e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy#include <GLES2/gl2.h>
21e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy
22e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy#include <utils/SortedVector.h>
23e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy
24e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guynamespace android {
25e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guynamespace uirenderer {
26e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy
27e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy///////////////////////////////////////////////////////////////////////////////
28e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy// Cache
29e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy///////////////////////////////////////////////////////////////////////////////
30e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy
31e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guyclass FboCache {
32e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guypublic:
33e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy    FboCache();
34e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy    ~FboCache();
35e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy
36e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy    /**
37e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy     * Returns an FBO from the cache. If no FBO is available, a new one
38e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy     * is created. If creating a new FBO fails, 0 is returned.
39e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy     *
40e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy     * When an FBO is obtained from the cache, it is removed and the
41e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy     * total number of FBOs available in the cache decreases.
42e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy     *
43e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy     * @return The name of the FBO, or 0 if no FBO can be obtained.
44e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy     */
45e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy    GLuint get();
46e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy
47e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy    /**
48e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy     * Adds the specified FBO to the cache.
49e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy     *
50e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy     * @param fbo The FBO to add to the cache.
51e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy     *
52e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy     * @return True if the FBO was added, false otherwise.
53e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy     */
54e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy    bool put(GLuint fbo);
55e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy
56e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy    /**
57e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy     * Clears the cache. This causes all FBOs to be deleted.
58e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy     */
59e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy    void clear();
60e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy
61e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy    /**
62e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy     * Returns the current size of the cache.
63e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy     */
64e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy    uint32_t getSize();
65e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy
66e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy    /**
67e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy     * Returns the maximum number of FBOs that the cache can hold.
68e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy     */
69e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy    uint32_t getMaxSize();
70e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy
71e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guyprivate:
72e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy    SortedVector<GLuint> mCache;
73e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy    uint32_t mMaxSize;
74e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy}; // class FboCache
75e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy
76e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy}; // namespace uirenderer
77e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy}; // namespace android
78e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy
795b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#endif // ANDROID_HWUI_FBO_CACHE_H
80