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