• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
40 namespace android {
41 namespace 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
56 static 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 };
62 static const GLsizei gMeshStride = sizeof(TextureVertex);
63 static const GLsizei gVertexStride = sizeof(Vertex);
64 static const GLsizei gAlphaVertexStride = sizeof(AlphaVertex);
65 static const GLsizei gAAVertexStride = sizeof(AAVertex);
66 static const GLsizei gMeshTextureOffset = 2 * sizeof(float);
67 static const GLsizei gVertexAAWidthOffset = 2 * sizeof(float);
68 static const GLsizei gVertexAALengthOffset = 3 * sizeof(float);
69 static const GLsizei gMeshCount = 4;
70 
71 ///////////////////////////////////////////////////////////////////////////////
72 // Debug
73 ///////////////////////////////////////////////////////////////////////////////
74 
75 struct CacheLogger {
CacheLoggerCacheLogger76     CacheLogger() {
77         INIT_LOGD("Creating OpenGL renderer caches");
78     }
79 }; // struct CacheLogger
80 
81 ///////////////////////////////////////////////////////////////////////////////
82 // Caches
83 ///////////////////////////////////////////////////////////////////////////////
84 
85 class Caches: public Singleton<Caches> {
86     Caches();
87     ~Caches();
88 
89     friend class Singleton<Caches>;
90 
91     CacheLogger mLogger;
92 
93     GLuint mCurrentBuffer;
94 
95     // Used to render layers
96     TextureVertex* mRegionMesh;
97     GLuint mRegionMeshIndices;
98 
99     mutable Mutex mGarbageLock;
100     Vector<Layer*> mLayerGarbage;
101 
102 public:
103     enum FlushMode {
104         kFlushMode_Layers = 0,
105         kFlushMode_Moderate,
106         kFlushMode_Full
107     };
108 
109     /**
110      * Flush the cache.
111      *
112      * @param mode Indicates how much of the cache should be flushed
113      */
114     void flush(FlushMode mode);
115 
116     /**
117      * Indicates whether the renderer is in debug mode.
118      * This debug mode provides limited information to app developers.
119      */
getDebugLevel()120     DebugLevel getDebugLevel() const {
121         return mDebugLevel;
122     }
123 
124     /**
125      * Call this on each frame to ensure that garbage is deleted from
126      * GPU memory.
127      */
128     void clearGarbage();
129 
130     /**
131      * Can be used to delete a layer from a non EGL thread.
132      */
133     void deleteLayerDeferred(Layer* layer);
134 
135     /**
136      * Binds the VBO used to render simple textured quads.
137      */
138     void bindMeshBuffer();
139 
140     /**
141      * Binds the specified VBO if needed.
142      */
143     void bindMeshBuffer(const GLuint buffer);
144 
145     /**
146      * Unbinds the VBO used to render simple textured quads.
147      */
148     void unbindMeshBuffer();
149 
150     /**
151      * Returns the mesh used to draw regions. Calling this method will
152      * bind a VBO of type GL_ELEMENT_ARRAY_BUFFER that contains the
153      * indices for the region mesh.
154      */
155     TextureVertex* getRegionMesh();
156 
157     /**
158      * Displays the memory usage of each cache and the total sum.
159      */
160     void dumpMemoryUsage();
161     void dumpMemoryUsage(String8& log);
162 
163     bool blend;
164     GLenum lastSrcMode;
165     GLenum lastDstMode;
166     Program* currentProgram;
167 
168     // VBO to draw with
169     GLuint meshBuffer;
170 
171     // GL extensions
172     Extensions extensions;
173 
174     // Misc
175     GLint maxTextureSize;
176 
177     TextureCache textureCache;
178     LayerCache layerCache;
179     GradientCache gradientCache;
180     ProgramCache programCache;
181     PathCache pathCache;
182     RoundRectShapeCache roundRectShapeCache;
183     CircleShapeCache circleShapeCache;
184     OvalShapeCache ovalShapeCache;
185     RectShapeCache rectShapeCache;
186     ArcShapeCache arcShapeCache;
187     PatchCache patchCache;
188     TextDropShadowCache dropShadowCache;
189     FboCache fboCache;
190     GammaFontRenderer fontRenderer;
191     ResourceCache resourceCache;
192 
193 private:
194     DebugLevel mDebugLevel;
195 }; // class Caches
196 
197 }; // namespace uirenderer
198 }; // namespace android
199 
200 #endif // ANDROID_HWUI_CACHES_H
201