Caches.h revision d6b2a00dd43257d1498b09175bff63663f6cb861
1fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy/* 2fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy * Copyright (C) 2010 The Android Open Source Project 3fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy * 4fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy * Licensed under the Apache License, Version 2.0 (the "License"); 5fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy * you may not use this file except in compliance with the License. 6fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy * You may obtain a copy of the License at 7fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy * 8fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy * http://www.apache.org/licenses/LICENSE-2.0 9fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy * 10fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy * Unless required by applicable law or agreed to in writing, software 11fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy * distributed under the License is distributed on an "AS IS" BASIS, 12fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy * See the License for the specific language governing permissions and 14fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy * limitations under the License. 15fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy */ 16fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy 175b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#ifndef ANDROID_HWUI_CACHES_H 185b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#define ANDROID_HWUI_CACHES_H 19fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy 20a2341a9f6addcd79723965ec5b1a1c5ae0f8bd65Romain Guy#ifndef LOG_TAG 21a2341a9f6addcd79723965ec5b1a1c5ae0f8bd65Romain Guy #define LOG_TAG "OpenGLRenderer" 22a2341a9f6addcd79723965ec5b1a1c5ae0f8bd65Romain Guy#endif 23fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy 24fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy#include <utils/Singleton.h> 25fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy 26746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy#include "Extensions.h" 2703750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy#include "FontRenderer.h" 2803750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy#include "GammaFontRenderer.h" 29fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy#include "TextureCache.h" 30fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy#include "LayerCache.h" 31fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy#include "GradientCache.h" 32fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy#include "PatchCache.h" 33fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy#include "ProgramCache.h" 3401d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy#include "ShapeCache.h" 35ff26a0c1c905dc1ec53b1bab860b80f2976d59beRomain Guy#include "PathCache.h" 36fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy#include "TextDropShadowCache.h" 37e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy#include "FboCache.h" 385c13d89c1332fcc499379b9064b891187b75ca32Chet Haase#include "ResourceCache.h" 39fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy 40fb8b763f762ae21923c58d64caa729b012f40e05Romain Guynamespace android { 41fb8b763f762ae21923c58d64caa729b012f40e05Romain Guynamespace uirenderer { 42fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy 4303750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy/////////////////////////////////////////////////////////////////////////////// 4403750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy// Globals 4503750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy/////////////////////////////////////////////////////////////////////////////// 4603750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy 4703750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy#define REQUIRED_TEXTURE_UNITS_COUNT 3 4803750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy 495b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#define REGION_MESH_QUAD_COUNT 512 505b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy 5103750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy// Generates simple and textured vertices 5203750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy#define FV(x, y, u, v) { { x, y }, { u, v } } 5303750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy 5403750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy// This array is never used directly but used as a memcpy source in the 5503750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy// OpenGLRenderer constructor 5603750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guystatic const TextureVertex gMeshVertices[] = { 5703750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy FV(0.0f, 0.0f, 0.0f, 0.0f), 5803750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy FV(1.0f, 0.0f, 1.0f, 0.0f), 5903750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy FV(0.0f, 1.0f, 0.0f, 1.0f), 6003750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy FV(1.0f, 1.0f, 1.0f, 1.0f) 6103750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy}; 6203750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guystatic const GLsizei gMeshStride = sizeof(TextureVertex); 635b0200bd47e8a9a4dc8d2e6c3a110d522b30bf82Chet Haasestatic const GLsizei gVertexStride = sizeof(Vertex); 645b0200bd47e8a9a4dc8d2e6c3a110d522b30bf82Chet Haasestatic const GLsizei gAlphaVertexStride = sizeof(AlphaVertex); 6599585adeb4167ca357a72eb866f34c1af944f4b9Chet Haasestatic const GLsizei gAAVertexStride = sizeof(AAVertex); 6603750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guystatic const GLsizei gMeshTextureOffset = 2 * sizeof(float); 6799585adeb4167ca357a72eb866f34c1af944f4b9Chet Haasestatic const GLsizei gVertexAAWidthOffset = 2 * sizeof(float); 6899585adeb4167ca357a72eb866f34c1af944f4b9Chet Haasestatic const GLsizei gVertexAALengthOffset = 3 * sizeof(float); 6903750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guystatic const GLsizei gMeshCount = 4; 7003750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy 7103750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy/////////////////////////////////////////////////////////////////////////////// 7203750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy// Debug 7303750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy/////////////////////////////////////////////////////////////////////////////// 7403750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy 75fb8b763f762ae21923c58d64caa729b012f40e05Romain Guystruct CacheLogger { 76fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy CacheLogger() { 77d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy INIT_LOGD("Creating OpenGL renderer caches"); 78fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy } 79fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy}; // struct CacheLogger 80fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy 8103750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy/////////////////////////////////////////////////////////////////////////////// 8203750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy// Caches 8303750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy/////////////////////////////////////////////////////////////////////////////// 8403750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy 85fb8b763f762ae21923c58d64caa729b012f40e05Romain Guyclass Caches: public Singleton<Caches> { 86dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase Caches(); 875b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy ~Caches(); 88fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy 89fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy friend class Singleton<Caches>; 90fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy 91e190aa69756aecfaffabdd4c6d32cb6b3220d842Romain Guy CacheLogger mLogger; 929bca4793a33d2714b306d69ceb870925a588fe71Romain Guy 939bca4793a33d2714b306d69ceb870925a588fe71Romain Guy GLuint mCurrentBuffer; 94fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy 955b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy // Used to render layers 965b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy TextureVertex* mRegionMesh; 975b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy GLuint mRegionMeshIndices; 985b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy 9957066eb64c9a190d1afc87bb060bbb2d31e5b86cRomain Guy mutable Mutex mGarbageLock; 100ada830f639591b99c3e40de22b07296c7932a33fRomain Guy Vector<Layer*> mLayerGarbage; 10157066eb64c9a190d1afc87bb060bbb2d31e5b86cRomain Guy 102fb8b763f762ae21923c58d64caa729b012f40e05Romain Guypublic: 1035b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy /** 104e190aa69756aecfaffabdd4c6d32cb6b3220d842Romain Guy * Indicates whether the renderer is in debug mode. 105e190aa69756aecfaffabdd4c6d32cb6b3220d842Romain Guy * This debug mode provides limited information to app developers. 106e190aa69756aecfaffabdd4c6d32cb6b3220d842Romain Guy */ 107e190aa69756aecfaffabdd4c6d32cb6b3220d842Romain Guy DebugLevel getDebugLevel() const { 108e190aa69756aecfaffabdd4c6d32cb6b3220d842Romain Guy return mDebugLevel; 109e190aa69756aecfaffabdd4c6d32cb6b3220d842Romain Guy } 110e190aa69756aecfaffabdd4c6d32cb6b3220d842Romain Guy 111e190aa69756aecfaffabdd4c6d32cb6b3220d842Romain Guy /** 112fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy * Call this on each frame to ensure that garbage is deleted from 113fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy * GPU memory. 114fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy */ 115fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy void clearGarbage(); 116fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy 117fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy /** 118ada830f639591b99c3e40de22b07296c7932a33fRomain Guy * Can be used to delete a layer from a non EGL thread. 11957066eb64c9a190d1afc87bb060bbb2d31e5b86cRomain Guy */ 120ada830f639591b99c3e40de22b07296c7932a33fRomain Guy void deleteLayerDeferred(Layer* layer); 12157066eb64c9a190d1afc87bb060bbb2d31e5b86cRomain Guy 12257066eb64c9a190d1afc87bb060bbb2d31e5b86cRomain Guy /** 1235b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy * Binds the VBO used to render simple textured quads. 1245b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy */ 125dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase void bindMeshBuffer(); 1265b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy 1275b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy /** 1285b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy * Binds the specified VBO if needed. 1295b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy */ 130dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase void bindMeshBuffer(const GLuint buffer); 1315b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy 1325b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy /** 1335b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy * Unbinds the VBO used to render simple textured quads. 1345b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy */ 135dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase void unbindMeshBuffer(); 13603750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy 1375b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy /** 1385b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy * Returns the mesh used to draw regions. Calling this method will 1395b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy * bind a VBO of type GL_ELEMENT_ARRAY_BUFFER that contains the 1405b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy * indices for the region mesh. 1415b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy */ 1425b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy TextureVertex* getRegionMesh(); 1435b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy 144c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy /** 145c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy * Displays the memory usage of each cache and the total sum. 146c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy */ 147c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy void dumpMemoryUsage(); 1489c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase void dumpMemoryUsage(String8& log); 149c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy 150fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy bool blend; 151fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy GLenum lastSrcMode; 152fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy GLenum lastDstMode; 153fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy Program* currentProgram; 154fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy 155746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy // VBO to draw with 15603750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy GLuint meshBuffer; 15703750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy 158746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy // GL extensions 159746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy Extensions extensions; 160746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy 161746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy // Misc 162746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy GLint maxTextureSize; 163746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy 164fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy TextureCache textureCache; 165fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy LayerCache layerCache; 166fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy GradientCache gradientCache; 167fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy ProgramCache programCache; 168fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy PathCache pathCache; 16901d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy RoundRectShapeCache roundRectShapeCache; 17001d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy CircleShapeCache circleShapeCache; 171c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy OvalShapeCache ovalShapeCache; 172c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy RectShapeCache rectShapeCache; 1738b2f5267f16c295f12faab810527cd6311997e34Romain Guy ArcShapeCache arcShapeCache; 174fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy PatchCache patchCache; 175fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy TextDropShadowCache dropShadowCache; 176e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy FboCache fboCache; 17711fd654a90359043e17ac78c1a3d6578c38b5c42Romain Guy GammaFontRenderer fontRenderer; 1785c13d89c1332fcc499379b9064b891187b75ca32Chet Haase ResourceCache resourceCache; 17929d8997bd43b7c4ad37fc3d6f91eaafa74913c88Romain Guy 180e190aa69756aecfaffabdd4c6d32cb6b3220d842Romain Guyprivate: 181e190aa69756aecfaffabdd4c6d32cb6b3220d842Romain Guy DebugLevel mDebugLevel; 182fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy}; // class Caches 183fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy 184fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy}; // namespace uirenderer 185fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy}; // namespace android 186fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy 1875b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#endif // ANDROID_HWUI_CACHES_H 188