Caches.h revision 5b0200bd47e8a9a4dc8d2e6c3a110d522b30bf82
1/*
2 * Copyright (C) 2010 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef ANDROID_HWUI_CACHES_H
18#define ANDROID_HWUI_CACHES_H
19
20#ifndef LOG_TAG
21    #define LOG_TAG "OpenGLRenderer"
22#endif
23
24#include <utils/Singleton.h>
25
26#include "Extensions.h"
27#include "FontRenderer.h"
28#include "GammaFontRenderer.h"
29#include "TextureCache.h"
30#include "LayerCache.h"
31#include "GradientCache.h"
32#include "PatchCache.h"
33#include "ProgramCache.h"
34#include "ShapeCache.h"
35#include "PathCache.h"
36#include "TextDropShadowCache.h"
37#include "FboCache.h"
38#include "ResourceCache.h"
39
40namespace android {
41namespace uirenderer {
42
43///////////////////////////////////////////////////////////////////////////////
44// Globals
45///////////////////////////////////////////////////////////////////////////////
46
47#define REQUIRED_TEXTURE_UNITS_COUNT 3
48
49#define REGION_MESH_QUAD_COUNT 512
50
51// Generates simple and textured vertices
52#define FV(x, y, u, v) { { x, y }, { u, v } }
53
54// This array is never used directly but used as a memcpy source in the
55// OpenGLRenderer constructor
56static const TextureVertex gMeshVertices[] = {
57        FV(0.0f, 0.0f, 0.0f, 0.0f),
58        FV(1.0f, 0.0f, 1.0f, 0.0f),
59        FV(0.0f, 1.0f, 0.0f, 1.0f),
60        FV(1.0f, 1.0f, 1.0f, 1.0f)
61};
62static const GLsizei gMeshStride = sizeof(TextureVertex);
63static const GLsizei gVertexStride = sizeof(Vertex);
64static const GLsizei gAlphaVertexStride = sizeof(AlphaVertex);
65static const GLsizei gMeshTextureOffset = 2 * sizeof(float);
66static const GLsizei gVertexAlphaOffset = 2 * sizeof(float);
67static const GLsizei gMeshCount = 4;
68
69///////////////////////////////////////////////////////////////////////////////
70// Debug
71///////////////////////////////////////////////////////////////////////////////
72
73struct CacheLogger {
74    CacheLogger() {
75        LOGD("Creating OpenGL renderer caches");
76    }
77}; // struct CacheLogger
78
79///////////////////////////////////////////////////////////////////////////////
80// Caches
81///////////////////////////////////////////////////////////////////////////////
82
83class Caches: public Singleton<Caches> {
84    Caches();
85    ~Caches();
86
87    friend class Singleton<Caches>;
88
89    CacheLogger mLogger;
90
91    GLuint mCurrentBuffer;
92
93    // Used to render layers
94    TextureVertex* mRegionMesh;
95    GLuint mRegionMeshIndices;
96
97    mutable Mutex mGarbageLock;
98    Vector<Layer*> mLayerGarbage;
99
100public:
101    /**
102     * Indicates whether the renderer is in debug mode.
103     * This debug mode provides limited information to app developers.
104     */
105    DebugLevel getDebugLevel() const {
106        return mDebugLevel;
107    }
108
109    /**
110     * Call this on each frame to ensure that garbage is deleted from
111     * GPU memory.
112     */
113    void clearGarbage();
114
115    /**
116     * Can be used to delete a layer from a non EGL thread.
117     */
118    void deleteLayerDeferred(Layer* layer);
119
120    /**
121     * Binds the VBO used to render simple textured quads.
122     */
123    void bindMeshBuffer();
124
125    /**
126     * Binds the specified VBO if needed.
127     */
128    void bindMeshBuffer(const GLuint buffer);
129
130    /**
131     * Unbinds the VBO used to render simple textured quads.
132     */
133    void unbindMeshBuffer();
134
135    /**
136     * Returns the mesh used to draw regions. Calling this method will
137     * bind a VBO of type GL_ELEMENT_ARRAY_BUFFER that contains the
138     * indices for the region mesh.
139     */
140    TextureVertex* getRegionMesh();
141
142    /**
143     * Displays the memory usage of each cache and the total sum.
144     */
145    void dumpMemoryUsage();
146    void dumpMemoryUsage(String8& log);
147
148    bool blend;
149    GLenum lastSrcMode;
150    GLenum lastDstMode;
151    Program* currentProgram;
152
153    // VBO to draw with
154    GLuint meshBuffer;
155
156    // GL extensions
157    Extensions extensions;
158
159    // Misc
160    GLint maxTextureSize;
161
162    TextureCache textureCache;
163    LayerCache layerCache;
164    GradientCache gradientCache;
165    ProgramCache programCache;
166    PathCache pathCache;
167    RoundRectShapeCache roundRectShapeCache;
168    CircleShapeCache circleShapeCache;
169    OvalShapeCache ovalShapeCache;
170    RectShapeCache rectShapeCache;
171    ArcShapeCache arcShapeCache;
172    PatchCache patchCache;
173    TextDropShadowCache dropShadowCache;
174    FboCache fboCache;
175    GammaFontRenderer fontRenderer;
176    ResourceCache resourceCache;
177
178private:
179    DebugLevel mDebugLevel;
180}; // class Caches
181
182}; // namespace uirenderer
183}; // namespace android
184
185#endif // ANDROID_HWUI_CACHES_H
186