Caches.h revision 8f85e80b64b89fd38cc23b129f61ec36ddde7f15
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 <cutils/compiler.h> 27 28#include "Extensions.h" 29#include "FontRenderer.h" 30#include "GammaFontRenderer.h" 31#include "TextureCache.h" 32#include "LayerCache.h" 33#include "GradientCache.h" 34#include "PatchCache.h" 35#include "ProgramCache.h" 36#include "ShapeCache.h" 37#include "PathCache.h" 38#include "TextDropShadowCache.h" 39#include "FboCache.h" 40#include "ResourceCache.h" 41 42namespace android { 43namespace uirenderer { 44 45/////////////////////////////////////////////////////////////////////////////// 46// Globals 47/////////////////////////////////////////////////////////////////////////////// 48 49#define REQUIRED_TEXTURE_UNITS_COUNT 3 50 51#define REGION_MESH_QUAD_COUNT 512 52 53// Generates simple and textured vertices 54#define FV(x, y, u, v) { { x, y }, { u, v } } 55 56// This array is never used directly but used as a memcpy source in the 57// OpenGLRenderer constructor 58static const TextureVertex gMeshVertices[] = { 59 FV(0.0f, 0.0f, 0.0f, 0.0f), 60 FV(1.0f, 0.0f, 1.0f, 0.0f), 61 FV(0.0f, 1.0f, 0.0f, 1.0f), 62 FV(1.0f, 1.0f, 1.0f, 1.0f) 63}; 64static const GLsizei gMeshStride = sizeof(TextureVertex); 65static const GLsizei gVertexStride = sizeof(Vertex); 66static const GLsizei gAlphaVertexStride = sizeof(AlphaVertex); 67static const GLsizei gAAVertexStride = sizeof(AAVertex); 68static const GLsizei gMeshTextureOffset = 2 * sizeof(float); 69static const GLsizei gVertexAAWidthOffset = 2 * sizeof(float); 70static const GLsizei gVertexAALengthOffset = 3 * sizeof(float); 71static const GLsizei gMeshCount = 4; 72 73static const GLenum gTextureUnits[] = { 74 GL_TEXTURE0, 75 GL_TEXTURE1, 76 GL_TEXTURE2 77}; 78 79/////////////////////////////////////////////////////////////////////////////// 80// Debug 81/////////////////////////////////////////////////////////////////////////////// 82 83struct CacheLogger { 84 CacheLogger() { 85 INIT_LOGD("Creating OpenGL renderer caches"); 86 } 87}; // struct CacheLogger 88 89/////////////////////////////////////////////////////////////////////////////// 90// Caches 91/////////////////////////////////////////////////////////////////////////////// 92 93class ANDROID_API Caches: public Singleton<Caches> { 94 Caches(); 95 96 friend class Singleton<Caches>; 97 98 CacheLogger mLogger; 99 100public: 101 enum FlushMode { 102 kFlushMode_Layers = 0, 103 kFlushMode_Moderate, 104 kFlushMode_Full 105 }; 106 107 /** 108 * Initializes the cache. 109 */ 110 void init(); 111 112 /** 113 * Flush the cache. 114 * 115 * @param mode Indicates how much of the cache should be flushed 116 */ 117 void flush(FlushMode mode); 118 119 /** 120 * Destroys all resources associated with this cache. This should 121 * be called after a flush(kFlushMode_Full). 122 */ 123 void terminate(); 124 125 /** 126 * Indicates whether the renderer is in debug mode. 127 * This debug mode provides limited information to app developers. 128 */ 129 DebugLevel getDebugLevel() const { 130 return mDebugLevel; 131 } 132 133 /** 134 * Call this on each frame to ensure that garbage is deleted from 135 * GPU memory. 136 */ 137 void clearGarbage(); 138 139 /** 140 * Can be used to delete a layer from a non EGL thread. 141 */ 142 void deleteLayerDeferred(Layer* layer); 143 144 /** 145 * Binds the VBO used to render simple textured quads. 146 */ 147 bool bindMeshBuffer(); 148 149 /** 150 * Binds the specified VBO if needed. 151 */ 152 bool bindMeshBuffer(const GLuint buffer); 153 154 /** 155 * Unbinds the VBO used to render simple textured quads. 156 */ 157 bool unbindMeshBuffer(); 158 159 bool bindIndicesBuffer(const GLuint buffer); 160 bool unbindIndicesBuffer(); 161 162 /** 163 * Binds an attrib to the specified float vertex pointer. 164 * Assumes a stride of gMeshStride and a size of 2. 165 */ 166 void bindPositionVertexPointer(bool force, GLuint slot, GLvoid* vertices, 167 GLsizei stride = gMeshStride); 168 169 /** 170 * Binds an attrib to the specified float vertex pointer. 171 * Assumes a stride of gMeshStride and a size of 2. 172 */ 173 void bindTexCoordsVertexPointer(bool force, GLuint slot, GLvoid* vertices); 174 175 /** 176 * Resets the vertex pointers. 177 */ 178 void resetVertexPointers(); 179 void resetTexCoordsVertexPointer(); 180 181 void enableTexCoordsVertexArray(); 182 void disbaleTexCoordsVertexArray(); 183 184 /** 185 * Activate the specified texture unit. The texture unit must 186 * be specified using an integer number (0 for GL_TEXTURE0 etc.) 187 */ 188 void activeTexture(GLuint textureUnit); 189 190 /** 191 * Sets the scissor for the current surface. 192 */ 193 void setScissor(GLint x, GLint y, GLint width, GLint height); 194 195 /** 196 * Returns the mesh used to draw regions. Calling this method will 197 * bind a VBO of type GL_ELEMENT_ARRAY_BUFFER that contains the 198 * indices for the region mesh. 199 */ 200 TextureVertex* getRegionMesh(); 201 202 /** 203 * Displays the memory usage of each cache and the total sum. 204 */ 205 void dumpMemoryUsage(); 206 void dumpMemoryUsage(String8& log); 207 208 bool blend; 209 GLenum lastSrcMode; 210 GLenum lastDstMode; 211 Program* currentProgram; 212 213 // VBO to draw with 214 GLuint meshBuffer; 215 216 // GL extensions 217 Extensions extensions; 218 219 // Misc 220 GLint maxTextureSize; 221 222 TextureCache textureCache; 223 LayerCache layerCache; 224 GradientCache gradientCache; 225 ProgramCache programCache; 226 PathCache pathCache; 227 RoundRectShapeCache roundRectShapeCache; 228 CircleShapeCache circleShapeCache; 229 OvalShapeCache ovalShapeCache; 230 RectShapeCache rectShapeCache; 231 ArcShapeCache arcShapeCache; 232 PatchCache patchCache; 233 TextDropShadowCache dropShadowCache; 234 FboCache fboCache; 235 GammaFontRenderer fontRenderer; 236 ResourceCache resourceCache; 237 238private: 239 GLuint mCurrentBuffer; 240 GLuint mCurrentIndicesBuffer; 241 void* mCurrentPositionPointer; 242 void* mCurrentTexCoordsPointer; 243 244 bool mTexCoordsArrayEnabled; 245 246 GLuint mTextureUnit; 247 248 GLint mScissorX; 249 GLint mScissorY; 250 GLint mScissorWidth; 251 GLint mScissorHeight; 252 253 // Used to render layers 254 TextureVertex* mRegionMesh; 255 GLuint mRegionMeshIndices; 256 257 mutable Mutex mGarbageLock; 258 Vector<Layer*> mLayerGarbage; 259 260 DebugLevel mDebugLevel; 261 bool mInitialized; 262}; // class Caches 263 264}; // namespace uirenderer 265}; // namespace android 266 267#endif // ANDROID_HWUI_CACHES_H 268