Caches.h revision 211efea7376371ee755edd2ad03e83ef6eea464e
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"
41211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy#include "Dither.h"
42fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy
43fb8b763f762ae21923c58d64caa729b012f40e05Romain Guynamespace android {
44fb8b763f762ae21923c58d64caa729b012f40e05Romain Guynamespace uirenderer {
45fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy
4603750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy///////////////////////////////////////////////////////////////////////////////
4703750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy// Globals
4803750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy///////////////////////////////////////////////////////////////////////////////
4903750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy
5003750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy#define REQUIRED_TEXTURE_UNITS_COUNT 3
5103750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy
525b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#define REGION_MESH_QUAD_COUNT 512
535b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy
5403750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy// Generates simple and textured vertices
5503750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy#define FV(x, y, u, v) { { x, y }, { u, v } }
5603750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy
5703750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy// This array is never used directly but used as a memcpy source in the
5803750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy// OpenGLRenderer constructor
5903750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guystatic const TextureVertex gMeshVertices[] = {
6003750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy        FV(0.0f, 0.0f, 0.0f, 0.0f),
6103750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy        FV(1.0f, 0.0f, 1.0f, 0.0f),
6203750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy        FV(0.0f, 1.0f, 0.0f, 1.0f),
6303750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy        FV(1.0f, 1.0f, 1.0f, 1.0f)
6403750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy};
6503750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guystatic const GLsizei gMeshStride = sizeof(TextureVertex);
665b0200bd47e8a9a4dc8d2e6c3a110d522b30bf82Chet Haasestatic const GLsizei gVertexStride = sizeof(Vertex);
675b0200bd47e8a9a4dc8d2e6c3a110d522b30bf82Chet Haasestatic const GLsizei gAlphaVertexStride = sizeof(AlphaVertex);
6899585adeb4167ca357a72eb866f34c1af944f4b9Chet Haasestatic const GLsizei gAAVertexStride = sizeof(AAVertex);
6903750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guystatic const GLsizei gMeshTextureOffset = 2 * sizeof(float);
7099585adeb4167ca357a72eb866f34c1af944f4b9Chet Haasestatic const GLsizei gVertexAAWidthOffset = 2 * sizeof(float);
7199585adeb4167ca357a72eb866f34c1af944f4b9Chet Haasestatic const GLsizei gVertexAALengthOffset = 3 * sizeof(float);
7203750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guystatic const GLsizei gMeshCount = 4;
7303750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy
74a1d3c91afbd52c7e8b01f4a9060c5459f02ae7a5Romain Guystatic const GLenum gTextureUnits[] = {
75a1d3c91afbd52c7e8b01f4a9060c5459f02ae7a5Romain Guy    GL_TEXTURE0,
76a1d3c91afbd52c7e8b01f4a9060c5459f02ae7a5Romain Guy    GL_TEXTURE1,
77a1d3c91afbd52c7e8b01f4a9060c5459f02ae7a5Romain Guy    GL_TEXTURE2
78a1d3c91afbd52c7e8b01f4a9060c5459f02ae7a5Romain Guy};
79a1d3c91afbd52c7e8b01f4a9060c5459f02ae7a5Romain Guy
8003750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy///////////////////////////////////////////////////////////////////////////////
8103750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy// Debug
8203750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy///////////////////////////////////////////////////////////////////////////////
8303750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy
84fb8b763f762ae21923c58d64caa729b012f40e05Romain Guystruct CacheLogger {
85fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy    CacheLogger() {
86d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy        INIT_LOGD("Creating OpenGL renderer caches");
87fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy    }
88fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy}; // struct CacheLogger
89fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy
9003750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy///////////////////////////////////////////////////////////////////////////////
9103750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy// Caches
9203750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy///////////////////////////////////////////////////////////////////////////////
9303750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy
94bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guyclass DisplayList;
95bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy
967953745dd565167113f8cbfc461bc0521d32d870Romain Guyclass ANDROID_API Caches: public Singleton<Caches> {
97dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase    Caches();
98fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy
99fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy    friend class Singleton<Caches>;
100fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy
101e190aa69756aecfaffabdd4c6d32cb6b3220d842Romain Guy    CacheLogger mLogger;
1029bca4793a33d2714b306d69ceb870925a588fe71Romain 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    /**
111dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy     * Initialize caches.
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
147bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy    /*
148bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy     * Can be used to delete a display list from a non EGL thread.
149bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy     */
150bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy    void deleteDisplayListDeferred(DisplayList* layer);
151bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy
15257066eb64c9a190d1afc87bb060bbb2d31e5b86cRomain Guy    /**
1535b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy     * Binds the VBO used to render simple textured quads.
1545b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy     */
155f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    bool bindMeshBuffer();
1565b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy
1575b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    /**
1585b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy     * Binds the specified VBO if needed.
1595b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy     */
160f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    bool bindMeshBuffer(const GLuint buffer);
1615b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy
1625b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    /**
1635b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy     * Unbinds the VBO used to render simple textured quads.
1645b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy     */
165f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    bool unbindMeshBuffer();
166f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
16715bc6437f8b4cf10dba55c7638d349e7b9563f4fRomain Guy    bool bindIndicesBuffer(const GLuint buffer);
16815bc6437f8b4cf10dba55c7638d349e7b9563f4fRomain Guy    bool unbindIndicesBuffer();
16915bc6437f8b4cf10dba55c7638d349e7b9563f4fRomain Guy
170f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    /**
171f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy     * Binds an attrib to the specified float vertex pointer.
172f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy     * Assumes a stride of gMeshStride and a size of 2.
173f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy     */
174f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    void bindPositionVertexPointer(bool force, GLuint slot, GLvoid* vertices,
175f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy            GLsizei stride = gMeshStride);
176f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
177f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    /**
178f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy     * Binds an attrib to the specified float vertex pointer.
179f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy     * Assumes a stride of gMeshStride and a size of 2.
180f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy     */
181f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    void bindTexCoordsVertexPointer(bool force, GLuint slot, GLvoid* vertices);
182f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
183f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    /**
184f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy     * Resets the vertex pointers.
185f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy     */
186f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    void resetVertexPointers();
187f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    void resetTexCoordsVertexPointer();
18803750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy
18915bc6437f8b4cf10dba55c7638d349e7b9563f4fRomain Guy    void enableTexCoordsVertexArray();
19015bc6437f8b4cf10dba55c7638d349e7b9563f4fRomain Guy    void disbaleTexCoordsVertexArray();
19115bc6437f8b4cf10dba55c7638d349e7b9563f4fRomain Guy
1925b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    /**
193a1d3c91afbd52c7e8b01f4a9060c5459f02ae7a5Romain Guy     * Activate the specified texture unit. The texture unit must
194a1d3c91afbd52c7e8b01f4a9060c5459f02ae7a5Romain Guy     * be specified using an integer number (0 for GL_TEXTURE0 etc.)
195a1d3c91afbd52c7e8b01f4a9060c5459f02ae7a5Romain Guy     */
196a1d3c91afbd52c7e8b01f4a9060c5459f02ae7a5Romain Guy    void activeTexture(GLuint textureUnit);
197a1d3c91afbd52c7e8b01f4a9060c5459f02ae7a5Romain Guy
198a1d3c91afbd52c7e8b01f4a9060c5459f02ae7a5Romain Guy    /**
1998f85e80b64b89fd38cc23b129f61ec36ddde7f15Romain Guy     * Sets the scissor for the current surface.
2008f85e80b64b89fd38cc23b129f61ec36ddde7f15Romain Guy     */
2018a4ac610e1aaf04931ac1af54b146a7fc8e66114Romain Guy    bool setScissor(GLint x, GLint y, GLint width, GLint height);
2028f85e80b64b89fd38cc23b129f61ec36ddde7f15Romain Guy
2038f85e80b64b89fd38cc23b129f61ec36ddde7f15Romain Guy    /**
20482bc7a772747fcf8a6fe7097f70bf2981429ffe9Romain Guy     * Resets the scissor state.
20582bc7a772747fcf8a6fe7097f70bf2981429ffe9Romain Guy     */
20682bc7a772747fcf8a6fe7097f70bf2981429ffe9Romain Guy    void resetScissor();
20782bc7a772747fcf8a6fe7097f70bf2981429ffe9Romain Guy
2088a4ac610e1aaf04931ac1af54b146a7fc8e66114Romain Guy    bool enableScissor();
2098a4ac610e1aaf04931ac1af54b146a7fc8e66114Romain Guy    bool disableScissor();
210586cae3ac69c0c667fbf8a954edbd399f620a717Romain Guy    void setScissorEnabled(bool enabled);
211586cae3ac69c0c667fbf8a954edbd399f620a717Romain Guy
21282bc7a772747fcf8a6fe7097f70bf2981429ffe9Romain Guy    /**
2135b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy     * Returns the mesh used to draw regions. Calling this method will
2145b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy     * bind a VBO of type GL_ELEMENT_ARRAY_BUFFER that contains the
2155b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy     * indices for the region mesh.
2165b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy     */
2175b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    TextureVertex* getRegionMesh();
2185b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy
219c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy    /**
220c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy     * Displays the memory usage of each cache and the total sum.
221c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy     */
222c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy    void dumpMemoryUsage();
2239c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    void dumpMemoryUsage(String8& log);
224c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy
225fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy    bool blend;
226fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy    GLenum lastSrcMode;
227fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy    GLenum lastDstMode;
228fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy    Program* currentProgram;
229586cae3ac69c0c667fbf8a954edbd399f620a717Romain Guy    bool scissorEnabled;
230fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy
231746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy    // VBO to draw with
23203750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy    GLuint meshBuffer;
23303750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy
234746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy    // GL extensions
235746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy    Extensions extensions;
236746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy
237746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy    // Misc
238746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy    GLint maxTextureSize;
239746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy
240fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy    TextureCache textureCache;
241fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy    LayerCache layerCache;
242fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy    GradientCache gradientCache;
243fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy    ProgramCache programCache;
244fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy    PathCache pathCache;
24501d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    RoundRectShapeCache roundRectShapeCache;
24601d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    CircleShapeCache circleShapeCache;
247c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    OvalShapeCache ovalShapeCache;
248c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    RectShapeCache rectShapeCache;
2498b2f5267f16c295f12faab810527cd6311997e34Romain Guy    ArcShapeCache arcShapeCache;
250fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy    PatchCache patchCache;
251fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy    TextDropShadowCache dropShadowCache;
252e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy    FboCache fboCache;
2535c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    ResourceCache resourceCache;
254211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy    Dither dither;
25529d8997bd43b7c4ad37fc3d6f91eaafa74913c88Romain Guy
256b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy    GammaFontRenderer* fontRenderer;
257b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy
258dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy    // Debug methods
25913631f3da855f200a151e7837ed9f6b079622b58Romain Guy    PFNGLINSERTEVENTMARKEREXTPROC eventMark;
26013631f3da855f200a151e7837ed9f6b079622b58Romain Guy    PFNGLPUSHGROUPMARKEREXTPROC startMark;
26113631f3da855f200a151e7837ed9f6b079622b58Romain Guy    PFNGLPOPGROUPMARKEREXTPROC endMark;
26213631f3da855f200a151e7837ed9f6b079622b58Romain Guy
263dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy    PFNGLLABELOBJECTEXTPROC setLabel;
264dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy    PFNGLGETOBJECTLABELEXTPROC getLabel;
265dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy
266e190aa69756aecfaffabdd4c6d32cb6b3220d842Romain Guyprivate:
267b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy    void initFont();
268dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy    void initExtensions();
269dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy    void initConstraints();
270dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy
271dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy    static void eventMarkNull(GLsizei length, const GLchar* marker) { }
272dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy    static void startMarkNull(GLsizei length, const GLchar* marker) { }
27313631f3da855f200a151e7837ed9f6b079622b58Romain Guy    static void endMarkNull() { }
27413631f3da855f200a151e7837ed9f6b079622b58Romain Guy
275dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy    static void setLabelNull(GLenum type, uint object, GLsizei length,
276dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy            const char* label) { }
277dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy    static void getLabelNull(GLenum type, uint object, GLsizei bufferSize,
278dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy            GLsizei* length, char* label) {
279dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy        if (length) *length = 0;
280dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy        if (label) *label = '\0';
281dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy    }
282dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy
283f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    GLuint mCurrentBuffer;
28415bc6437f8b4cf10dba55c7638d349e7b9563f4fRomain Guy    GLuint mCurrentIndicesBuffer;
285f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    void* mCurrentPositionPointer;
286f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    void* mCurrentTexCoordsPointer;
287f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
28815bc6437f8b4cf10dba55c7638d349e7b9563f4fRomain Guy    bool mTexCoordsArrayEnabled;
28915bc6437f8b4cf10dba55c7638d349e7b9563f4fRomain Guy
290a1d3c91afbd52c7e8b01f4a9060c5459f02ae7a5Romain Guy    GLuint mTextureUnit;
291a1d3c91afbd52c7e8b01f4a9060c5459f02ae7a5Romain Guy
2928f85e80b64b89fd38cc23b129f61ec36ddde7f15Romain Guy    GLint mScissorX;
2938f85e80b64b89fd38cc23b129f61ec36ddde7f15Romain Guy    GLint mScissorY;
2948f85e80b64b89fd38cc23b129f61ec36ddde7f15Romain Guy    GLint mScissorWidth;
2958f85e80b64b89fd38cc23b129f61ec36ddde7f15Romain Guy    GLint mScissorHeight;
2968f85e80b64b89fd38cc23b129f61ec36ddde7f15Romain Guy
297f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    // Used to render layers
298f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    TextureVertex* mRegionMesh;
299f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    GLuint mRegionMeshIndices;
300f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
301f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    mutable Mutex mGarbageLock;
302f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    Vector<Layer*> mLayerGarbage;
303bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy    Vector<DisplayList*> mDisplayListGarbage;
304f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
305e190aa69756aecfaffabdd4c6d32cb6b3220d842Romain Guy    DebugLevel mDebugLevel;
3068ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy    bool mInitialized;
307fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy}; // class Caches
308fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy
309fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy}; // namespace uirenderer
310fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy}; // namespace android
311fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy
3125b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#endif // ANDROID_HWUI_CACHES_H
313