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
267953745dd565167113f8cbfc461bc0521d32d870Romain Guy#include <cutils/compiler.h>
277953745dd565167113f8cbfc461bc0521d32d870Romain Guy
28746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy#include "Extensions.h"
2903750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy#include "FontRenderer.h"
3003750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy#include "GammaFontRenderer.h"
31fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy#include "TextureCache.h"
32fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy#include "LayerCache.h"
33fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy#include "GradientCache.h"
34fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy#include "PatchCache.h"
35fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy#include "ProgramCache.h"
3601d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy#include "ShapeCache.h"
37ff26a0c1c905dc1ec53b1bab860b80f2976d59beRomain Guy#include "PathCache.h"
38fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy#include "TextDropShadowCache.h"
39e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy#include "FboCache.h"
405c13d89c1332fcc499379b9064b891187b75ca32Chet Haase#include "ResourceCache.h"
41fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy
42fb8b763f762ae21923c58d64caa729b012f40e05Romain Guynamespace android {
43fb8b763f762ae21923c58d64caa729b012f40e05Romain Guynamespace uirenderer {
44fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy
4503750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy///////////////////////////////////////////////////////////////////////////////
4603750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy// Globals
4703750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy///////////////////////////////////////////////////////////////////////////////
4803750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy
4903750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy#define REQUIRED_TEXTURE_UNITS_COUNT 3
5003750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy
515b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#define REGION_MESH_QUAD_COUNT 512
525b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy
5303750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy// Generates simple and textured vertices
5403750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy#define FV(x, y, u, v) { { x, y }, { u, v } }
5503750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy
5603750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy// This array is never used directly but used as a memcpy source in the
5703750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy// OpenGLRenderer constructor
5803750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guystatic const TextureVertex gMeshVertices[] = {
5903750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy        FV(0.0f, 0.0f, 0.0f, 0.0f),
6003750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy        FV(1.0f, 0.0f, 1.0f, 0.0f),
6103750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy        FV(0.0f, 1.0f, 0.0f, 1.0f),
6203750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy        FV(1.0f, 1.0f, 1.0f, 1.0f)
6303750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy};
6403750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guystatic const GLsizei gMeshStride = sizeof(TextureVertex);
655b0200bd47e8a9a4dc8d2e6c3a110d522b30bf82Chet Haasestatic const GLsizei gVertexStride = sizeof(Vertex);
665b0200bd47e8a9a4dc8d2e6c3a110d522b30bf82Chet Haasestatic const GLsizei gAlphaVertexStride = sizeof(AlphaVertex);
6799585adeb4167ca357a72eb866f34c1af944f4b9Chet Haasestatic const GLsizei gAAVertexStride = sizeof(AAVertex);
6803750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guystatic const GLsizei gMeshTextureOffset = 2 * sizeof(float);
6999585adeb4167ca357a72eb866f34c1af944f4b9Chet Haasestatic const GLsizei gVertexAAWidthOffset = 2 * sizeof(float);
7099585adeb4167ca357a72eb866f34c1af944f4b9Chet Haasestatic const GLsizei gVertexAALengthOffset = 3 * sizeof(float);
7103750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guystatic const GLsizei gMeshCount = 4;
7203750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy
7303750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy///////////////////////////////////////////////////////////////////////////////
7403750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy// Debug
7503750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy///////////////////////////////////////////////////////////////////////////////
7603750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy
77fb8b763f762ae21923c58d64caa729b012f40e05Romain Guystruct CacheLogger {
78fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy    CacheLogger() {
79d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy        INIT_LOGD("Creating OpenGL renderer caches");
80fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy    }
81fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy}; // struct CacheLogger
82fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy
8303750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy///////////////////////////////////////////////////////////////////////////////
8403750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy// Caches
8503750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy///////////////////////////////////////////////////////////////////////////////
8603750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy
877953745dd565167113f8cbfc461bc0521d32d870Romain Guyclass ANDROID_API Caches: public Singleton<Caches> {
88dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase    Caches();
89fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy
90fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy    friend class Singleton<Caches>;
91fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy
92e190aa69756aecfaffabdd4c6d32cb6b3220d842Romain Guy    CacheLogger mLogger;
939bca4793a33d2714b306d69ceb870925a588fe71Romain Guy
949bca4793a33d2714b306d69ceb870925a588fe71Romain Guy    GLuint mCurrentBuffer;
95fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy
965b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    // Used to render layers
975b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    TextureVertex* mRegionMesh;
985b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    GLuint mRegionMeshIndices;
995b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy
10057066eb64c9a190d1afc87bb060bbb2d31e5b86cRomain Guy    mutable Mutex mGarbageLock;
101ada830f639591b99c3e40de22b07296c7932a33fRomain Guy    Vector<Layer*> mLayerGarbage;
10257066eb64c9a190d1afc87bb060bbb2d31e5b86cRomain Guy
103fb8b763f762ae21923c58d64caa729b012f40e05Romain Guypublic:
104bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy    enum FlushMode {
1056d7475d666baefaa3ba9f0dcee25238739454241Romain Guy        kFlushMode_Layers = 0,
1066d7475d666baefaa3ba9f0dcee25238739454241Romain Guy        kFlushMode_Moderate,
107bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy        kFlushMode_Full
108bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy    };
109bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy
110bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy    /**
1118ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy     * Initializes the cache.
1128ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy     */
1138ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy    void init();
1148ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy
1158ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy    /**
116bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy     * Flush the cache.
117bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy     *
118bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy     * @param mode Indicates how much of the cache should be flushed
119bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy     */
120bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy    void flush(FlushMode mode);
121bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy
1225b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    /**
1238ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy     * Destroys all resources associated with this cache. This should
1248ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy     * be called after a flush(kFlushMode_Full).
1258ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy     */
1268ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy    void terminate();
1278ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy
1288ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy    /**
129e190aa69756aecfaffabdd4c6d32cb6b3220d842Romain Guy     * Indicates whether the renderer is in debug mode.
130e190aa69756aecfaffabdd4c6d32cb6b3220d842Romain Guy     * This debug mode provides limited information to app developers.
131e190aa69756aecfaffabdd4c6d32cb6b3220d842Romain Guy     */
132e190aa69756aecfaffabdd4c6d32cb6b3220d842Romain Guy    DebugLevel getDebugLevel() const {
133e190aa69756aecfaffabdd4c6d32cb6b3220d842Romain Guy        return mDebugLevel;
134e190aa69756aecfaffabdd4c6d32cb6b3220d842Romain Guy    }
135e190aa69756aecfaffabdd4c6d32cb6b3220d842Romain Guy
136e190aa69756aecfaffabdd4c6d32cb6b3220d842Romain Guy    /**
137fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy     * Call this on each frame to ensure that garbage is deleted from
138fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy     * GPU memory.
139fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy     */
140fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy    void clearGarbage();
141fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy
142fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy    /**
143ada830f639591b99c3e40de22b07296c7932a33fRomain Guy     * Can be used to delete a layer from a non EGL thread.
14457066eb64c9a190d1afc87bb060bbb2d31e5b86cRomain Guy     */
145ada830f639591b99c3e40de22b07296c7932a33fRomain Guy    void deleteLayerDeferred(Layer* layer);
14657066eb64c9a190d1afc87bb060bbb2d31e5b86cRomain Guy
14757066eb64c9a190d1afc87bb060bbb2d31e5b86cRomain Guy    /**
1485b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy     * Binds the VBO used to render simple textured quads.
1495b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy     */
150dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase    void bindMeshBuffer();
1515b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy
1525b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    /**
1535b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy     * Binds the specified VBO if needed.
1545b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy     */
155dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase    void bindMeshBuffer(const GLuint buffer);
1565b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy
1575b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    /**
1585b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy     * Unbinds the VBO used to render simple textured quads.
1595b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy     */
160dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase    void unbindMeshBuffer();
16103750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy
1625b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    /**
1635b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy     * Returns the mesh used to draw regions. Calling this method will
1645b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy     * bind a VBO of type GL_ELEMENT_ARRAY_BUFFER that contains the
1655b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy     * indices for the region mesh.
1665b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy     */
1675b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    TextureVertex* getRegionMesh();
1685b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy
169c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy    /**
170c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy     * Displays the memory usage of each cache and the total sum.
171c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy     */
172c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy    void dumpMemoryUsage();
1739c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    void dumpMemoryUsage(String8& log);
174c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy
175fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy    bool blend;
176fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy    GLenum lastSrcMode;
177fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy    GLenum lastDstMode;
178fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy    Program* currentProgram;
179fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy
180746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy    // VBO to draw with
18103750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy    GLuint meshBuffer;
18203750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy
183746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy    // GL extensions
184746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy    Extensions extensions;
185746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy
186746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy    // Misc
187746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy    GLint maxTextureSize;
188746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy
189fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy    TextureCache textureCache;
190fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy    LayerCache layerCache;
191fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy    GradientCache gradientCache;
192fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy    ProgramCache programCache;
193fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy    PathCache pathCache;
19401d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    RoundRectShapeCache roundRectShapeCache;
19501d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    CircleShapeCache circleShapeCache;
196c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    OvalShapeCache ovalShapeCache;
197c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    RectShapeCache rectShapeCache;
1988b2f5267f16c295f12faab810527cd6311997e34Romain Guy    ArcShapeCache arcShapeCache;
199fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy    PatchCache patchCache;
200fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy    TextDropShadowCache dropShadowCache;
201e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy    FboCache fboCache;
20211fd654a90359043e17ac78c1a3d6578c38b5c42Romain Guy    GammaFontRenderer fontRenderer;
2035c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    ResourceCache resourceCache;
20429d8997bd43b7c4ad37fc3d6f91eaafa74913c88Romain Guy
205e190aa69756aecfaffabdd4c6d32cb6b3220d842Romain Guyprivate:
206e190aa69756aecfaffabdd4c6d32cb6b3220d842Romain Guy    DebugLevel mDebugLevel;
2078ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy    bool mInitialized;
208fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy}; // class Caches
209fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy
210fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy}; // namespace uirenderer
211fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy}; // namespace android
212fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy
2135b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#endif // ANDROID_HWUI_CACHES_H
214