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"
410baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy#include "Stencil.h"
42211efea7376371ee755edd2ad03e83ef6eea464eRomain Guy#include "Dither.h"
43fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy
44fb8b763f762ae21923c58d64caa729b012f40e05Romain Guynamespace android {
45fb8b763f762ae21923c58d64caa729b012f40e05Romain Guynamespace uirenderer {
46fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy
4703750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy///////////////////////////////////////////////////////////////////////////////
4803750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy// Globals
4903750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy///////////////////////////////////////////////////////////////////////////////
5003750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy
5103750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy#define REQUIRED_TEXTURE_UNITS_COUNT 3
5203750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy
535b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#define REGION_MESH_QUAD_COUNT 512
545b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy
5503750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy// Generates simple and textured vertices
5603750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy#define FV(x, y, u, v) { { x, y }, { u, v } }
5703750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy
5803750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy// This array is never used directly but used as a memcpy source in the
5903750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy// OpenGLRenderer constructor
6003750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guystatic const TextureVertex gMeshVertices[] = {
6103750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy        FV(0.0f, 0.0f, 0.0f, 0.0f),
6203750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy        FV(1.0f, 0.0f, 1.0f, 0.0f),
6303750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy        FV(0.0f, 1.0f, 0.0f, 1.0f),
6403750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy        FV(1.0f, 1.0f, 1.0f, 1.0f)
6503750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy};
6603750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guystatic const GLsizei gMeshStride = sizeof(TextureVertex);
675b0200bd47e8a9a4dc8d2e6c3a110d522b30bf82Chet Haasestatic const GLsizei gVertexStride = sizeof(Vertex);
685b0200bd47e8a9a4dc8d2e6c3a110d522b30bf82Chet Haasestatic const GLsizei gAlphaVertexStride = sizeof(AlphaVertex);
6999585adeb4167ca357a72eb866f34c1af944f4b9Chet Haasestatic const GLsizei gAAVertexStride = sizeof(AAVertex);
7003750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guystatic const GLsizei gMeshTextureOffset = 2 * sizeof(float);
716ebdc114e0d72137394f02bc8ffe9d7a782a65c4Chris Craikstatic const GLsizei gVertexAlphaOffset = 2 * sizeof(float);
7299585adeb4167ca357a72eb866f34c1af944f4b9Chet Haasestatic const GLsizei gVertexAAWidthOffset = 2 * sizeof(float);
7399585adeb4167ca357a72eb866f34c1af944f4b9Chet Haasestatic const GLsizei gVertexAALengthOffset = 3 * sizeof(float);
7403750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guystatic const GLsizei gMeshCount = 4;
7503750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy
76a1d3c91afbd52c7e8b01f4a9060c5459f02ae7a5Romain Guystatic const GLenum gTextureUnits[] = {
77a1d3c91afbd52c7e8b01f4a9060c5459f02ae7a5Romain Guy    GL_TEXTURE0,
78a1d3c91afbd52c7e8b01f4a9060c5459f02ae7a5Romain Guy    GL_TEXTURE1,
79a1d3c91afbd52c7e8b01f4a9060c5459f02ae7a5Romain Guy    GL_TEXTURE2
80a1d3c91afbd52c7e8b01f4a9060c5459f02ae7a5Romain Guy};
81a1d3c91afbd52c7e8b01f4a9060c5459f02ae7a5Romain Guy
8203750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy///////////////////////////////////////////////////////////////////////////////
8303750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy// Debug
8403750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy///////////////////////////////////////////////////////////////////////////////
8503750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy
86fb8b763f762ae21923c58d64caa729b012f40e05Romain Guystruct CacheLogger {
87fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy    CacheLogger() {
88d6b2a00dd43257d1498b09175bff63663f6cb861Romain Guy        INIT_LOGD("Creating OpenGL renderer caches");
89fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy    }
90fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy}; // struct CacheLogger
91fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy
9203750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy///////////////////////////////////////////////////////////////////////////////
9303750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy// Caches
9403750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy///////////////////////////////////////////////////////////////////////////////
9503750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy
96bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guyclass DisplayList;
97bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy
987953745dd565167113f8cbfc461bc0521d32d870Romain Guyclass ANDROID_API Caches: public Singleton<Caches> {
99dd78ccacff83f0714ad90be98b58ad85f5d08c66Chet Haase    Caches();
100fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy
101fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy    friend class Singleton<Caches>;
102fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy
103e190aa69756aecfaffabdd4c6d32cb6b3220d842Romain Guy    CacheLogger mLogger;
1049bca4793a33d2714b306d69ceb870925a588fe71Romain Guy
105fb8b763f762ae21923c58d64caa729b012f40e05Romain Guypublic:
106bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy    enum FlushMode {
1076d7475d666baefaa3ba9f0dcee25238739454241Romain Guy        kFlushMode_Layers = 0,
1086d7475d666baefaa3ba9f0dcee25238739454241Romain Guy        kFlushMode_Moderate,
109bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy        kFlushMode_Full
110bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy    };
111bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy
112bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy    /**
113dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy     * Initialize caches.
1148ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy     */
1158ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy    void init();
1168ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy
1178ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy    /**
118bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy     * Flush the cache.
119bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy     *
120bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy     * @param mode Indicates how much of the cache should be flushed
121bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy     */
122bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy    void flush(FlushMode mode);
123bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy
1245b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    /**
1258ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy     * Destroys all resources associated with this cache. This should
1268ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy     * be called after a flush(kFlushMode_Full).
1278ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy     */
1288ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy    void terminate();
1298ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy
1308ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy    /**
131e190aa69756aecfaffabdd4c6d32cb6b3220d842Romain Guy     * Indicates whether the renderer is in debug mode.
132e190aa69756aecfaffabdd4c6d32cb6b3220d842Romain Guy     * This debug mode provides limited information to app developers.
133e190aa69756aecfaffabdd4c6d32cb6b3220d842Romain Guy     */
134e190aa69756aecfaffabdd4c6d32cb6b3220d842Romain Guy    DebugLevel getDebugLevel() const {
135e190aa69756aecfaffabdd4c6d32cb6b3220d842Romain Guy        return mDebugLevel;
136e190aa69756aecfaffabdd4c6d32cb6b3220d842Romain Guy    }
137e190aa69756aecfaffabdd4c6d32cb6b3220d842Romain Guy
138e190aa69756aecfaffabdd4c6d32cb6b3220d842Romain Guy    /**
139fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy     * Call this on each frame to ensure that garbage is deleted from
140fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy     * GPU memory.
141fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy     */
142fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy    void clearGarbage();
143fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy
144fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy    /**
145ada830f639591b99c3e40de22b07296c7932a33fRomain Guy     * Can be used to delete a layer from a non EGL thread.
14657066eb64c9a190d1afc87bb060bbb2d31e5b86cRomain Guy     */
147ada830f639591b99c3e40de22b07296c7932a33fRomain Guy    void deleteLayerDeferred(Layer* layer);
14857066eb64c9a190d1afc87bb060bbb2d31e5b86cRomain Guy
149bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy    /*
150bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy     * Can be used to delete a display list from a non EGL thread.
151bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy     */
152bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy    void deleteDisplayListDeferred(DisplayList* layer);
153bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy
15457066eb64c9a190d1afc87bb060bbb2d31e5b86cRomain Guy    /**
1555b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy     * Binds the VBO used to render simple textured quads.
1565b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy     */
157f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    bool bindMeshBuffer();
1585b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy
1595b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    /**
1605b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy     * Binds the specified VBO if needed.
1615b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy     */
162f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    bool bindMeshBuffer(const GLuint buffer);
1635b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy
1645b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    /**
1655b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy     * Unbinds the VBO used to render simple textured quads.
1665b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy     */
167f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    bool unbindMeshBuffer();
168f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
16915bc6437f8b4cf10dba55c7638d349e7b9563f4fRomain Guy    bool bindIndicesBuffer(const GLuint buffer);
17015bc6437f8b4cf10dba55c7638d349e7b9563f4fRomain Guy    bool unbindIndicesBuffer();
17115bc6437f8b4cf10dba55c7638d349e7b9563f4fRomain Guy
172f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    /**
173f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy     * Binds an attrib to the specified float vertex pointer.
174f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy     * Assumes a stride of gMeshStride and a size of 2.
175f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy     */
176cb4d6009576cf08195dc23f341a3f4939c0878bbChris Craik    void bindPositionVertexPointer(bool force, GLvoid* vertices, GLsizei stride = gMeshStride);
177f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
178f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    /**
179f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy     * Binds an attrib to the specified float vertex pointer.
180f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy     * Assumes a stride of gMeshStride and a size of 2.
181f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy     */
182cb4d6009576cf08195dc23f341a3f4939c0878bbChris Craik    void bindTexCoordsVertexPointer(bool force, GLvoid* vertices);
183f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
184f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    /**
185f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy     * Resets the vertex pointers.
186f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy     */
187f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    void resetVertexPointers();
188f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    void resetTexCoordsVertexPointer();
18903750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy
19015bc6437f8b4cf10dba55c7638d349e7b9563f4fRomain Guy    void enableTexCoordsVertexArray();
19115bc6437f8b4cf10dba55c7638d349e7b9563f4fRomain Guy    void disbaleTexCoordsVertexArray();
19215bc6437f8b4cf10dba55c7638d349e7b9563f4fRomain Guy
1935b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    /**
194a1d3c91afbd52c7e8b01f4a9060c5459f02ae7a5Romain Guy     * Activate the specified texture unit. The texture unit must
195a1d3c91afbd52c7e8b01f4a9060c5459f02ae7a5Romain Guy     * be specified using an integer number (0 for GL_TEXTURE0 etc.)
196a1d3c91afbd52c7e8b01f4a9060c5459f02ae7a5Romain Guy     */
197a1d3c91afbd52c7e8b01f4a9060c5459f02ae7a5Romain Guy    void activeTexture(GLuint textureUnit);
198a1d3c91afbd52c7e8b01f4a9060c5459f02ae7a5Romain Guy
199a1d3c91afbd52c7e8b01f4a9060c5459f02ae7a5Romain Guy    /**
2008f85e80b64b89fd38cc23b129f61ec36ddde7f15Romain Guy     * Sets the scissor for the current surface.
2018f85e80b64b89fd38cc23b129f61ec36ddde7f15Romain Guy     */
2028a4ac610e1aaf04931ac1af54b146a7fc8e66114Romain Guy    bool setScissor(GLint x, GLint y, GLint width, GLint height);
2038f85e80b64b89fd38cc23b129f61ec36ddde7f15Romain Guy
2048f85e80b64b89fd38cc23b129f61ec36ddde7f15Romain Guy    /**
20582bc7a772747fcf8a6fe7097f70bf2981429ffe9Romain Guy     * Resets the scissor state.
20682bc7a772747fcf8a6fe7097f70bf2981429ffe9Romain Guy     */
20782bc7a772747fcf8a6fe7097f70bf2981429ffe9Romain Guy    void resetScissor();
20882bc7a772747fcf8a6fe7097f70bf2981429ffe9Romain Guy
2098a4ac610e1aaf04931ac1af54b146a7fc8e66114Romain Guy    bool enableScissor();
2108a4ac610e1aaf04931ac1af54b146a7fc8e66114Romain Guy    bool disableScissor();
211586cae3ac69c0c667fbf8a954edbd399f620a717Romain Guy    void setScissorEnabled(bool enabled);
212586cae3ac69c0c667fbf8a954edbd399f620a717Romain Guy
21385ef80d8902afe8d26cb75fa7837fd9e6d019620Romain Guy    void startTiling(GLuint x, GLuint y, GLuint width, GLuint height, bool opaque);
21485ef80d8902afe8d26cb75fa7837fd9e6d019620Romain Guy    void endTiling();
21585ef80d8902afe8d26cb75fa7837fd9e6d019620Romain Guy
21682bc7a772747fcf8a6fe7097f70bf2981429ffe9Romain Guy    /**
2175b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy     * Returns the mesh used to draw regions. Calling this method will
2185b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy     * bind a VBO of type GL_ELEMENT_ARRAY_BUFFER that contains the
2195b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy     * indices for the region mesh.
2205b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy     */
2215b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    TextureVertex* getRegionMesh();
2225b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy
223c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy    /**
224c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy     * Displays the memory usage of each cache and the total sum.
225c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy     */
226c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy    void dumpMemoryUsage();
2279c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    void dumpMemoryUsage(String8& log);
228c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy
22954c1a64d5441a964890b44280e4457e11f4f924aRomain Guy    bool hasRegisteredFunctors();
23054c1a64d5441a964890b44280e4457e11f4f924aRomain Guy    void registerFunctors(uint32_t functorCount);
23154c1a64d5441a964890b44280e4457e11f4f924aRomain Guy    void unregisterFunctors(uint32_t functorCount);
23254c1a64d5441a964890b44280e4457e11f4f924aRomain Guy
233fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy    bool blend;
234fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy    GLenum lastSrcMode;
235fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy    GLenum lastDstMode;
236fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy    Program* currentProgram;
237586cae3ac69c0c667fbf8a954edbd399f620a717Romain Guy    bool scissorEnabled;
238fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy
239746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy    // VBO to draw with
24003750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy    GLuint meshBuffer;
24103750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy
242746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy    // GL extensions
243746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy    Extensions extensions;
244746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy
245746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy    // Misc
246746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy    GLint maxTextureSize;
2474ff0cf4b83605bff630c4e6f1fabe4f72a3f93a1Romain Guy    bool debugLayersUpdates;
2487c450aaa3caac2a05fcb20a177483d0e92378426Romain Guy    bool debugOverdraw;
249746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy
250fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy    TextureCache textureCache;
251fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy    LayerCache layerCache;
252fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy    GradientCache gradientCache;
253fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy    ProgramCache programCache;
254fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy    PathCache pathCache;
25501d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    RoundRectShapeCache roundRectShapeCache;
25601d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    CircleShapeCache circleShapeCache;
257c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    OvalShapeCache ovalShapeCache;
258c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    RectShapeCache rectShapeCache;
2598b2f5267f16c295f12faab810527cd6311997e34Romain Guy    ArcShapeCache arcShapeCache;
260fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy    PatchCache patchCache;
261fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy    TextDropShadowCache dropShadowCache;
262e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy    FboCache fboCache;
2635c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    ResourceCache resourceCache;
26429d8997bd43b7c4ad37fc3d6f91eaafa74913c88Romain Guy
265b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy    GammaFontRenderer* fontRenderer;
266b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy
2670baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy    Dither dither;
2680baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy#if STENCIL_BUFFER_SIZE
2690baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy    Stencil stencil;
2700baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy#endif
2710baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy
272dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy    // Debug methods
27313631f3da855f200a151e7837ed9f6b079622b58Romain Guy    PFNGLINSERTEVENTMARKEREXTPROC eventMark;
27413631f3da855f200a151e7837ed9f6b079622b58Romain Guy    PFNGLPUSHGROUPMARKEREXTPROC startMark;
27513631f3da855f200a151e7837ed9f6b079622b58Romain Guy    PFNGLPOPGROUPMARKEREXTPROC endMark;
27613631f3da855f200a151e7837ed9f6b079622b58Romain Guy
277dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy    PFNGLLABELOBJECTEXTPROC setLabel;
278dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy    PFNGLGETOBJECTLABELEXTPROC getLabel;
279dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy
280e190aa69756aecfaffabdd4c6d32cb6b3220d842Romain Guyprivate:
281b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy    void initFont();
282dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy    void initExtensions();
283dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy    void initConstraints();
2844ff0cf4b83605bff630c4e6f1fabe4f72a3f93a1Romain Guy    void initProperties();
285dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy
286dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy    static void eventMarkNull(GLsizei length, const GLchar* marker) { }
287dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy    static void startMarkNull(GLsizei length, const GLchar* marker) { }
28813631f3da855f200a151e7837ed9f6b079622b58Romain Guy    static void endMarkNull() { }
28913631f3da855f200a151e7837ed9f6b079622b58Romain Guy
290dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy    static void setLabelNull(GLenum type, uint object, GLsizei length,
291dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy            const char* label) { }
292dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy    static void getLabelNull(GLenum type, uint object, GLsizei bufferSize,
293dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy            GLsizei* length, char* label) {
294dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy        if (length) *length = 0;
295dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy        if (label) *label = '\0';
296dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy    }
297dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy
298f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    GLuint mCurrentBuffer;
29915bc6437f8b4cf10dba55c7638d349e7b9563f4fRomain Guy    GLuint mCurrentIndicesBuffer;
300f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    void* mCurrentPositionPointer;
30116b897c488a740e004bfce7d50b0d7602277fc0bChris Craik    GLsizei mCurrentPositionStride;
302f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    void* mCurrentTexCoordsPointer;
303f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
30415bc6437f8b4cf10dba55c7638d349e7b9563f4fRomain Guy    bool mTexCoordsArrayEnabled;
30515bc6437f8b4cf10dba55c7638d349e7b9563f4fRomain Guy
306a1d3c91afbd52c7e8b01f4a9060c5459f02ae7a5Romain Guy    GLuint mTextureUnit;
307a1d3c91afbd52c7e8b01f4a9060c5459f02ae7a5Romain Guy
3088f85e80b64b89fd38cc23b129f61ec36ddde7f15Romain Guy    GLint mScissorX;
3098f85e80b64b89fd38cc23b129f61ec36ddde7f15Romain Guy    GLint mScissorY;
3108f85e80b64b89fd38cc23b129f61ec36ddde7f15Romain Guy    GLint mScissorWidth;
3118f85e80b64b89fd38cc23b129f61ec36ddde7f15Romain Guy    GLint mScissorHeight;
3128f85e80b64b89fd38cc23b129f61ec36ddde7f15Romain Guy
313f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    // Used to render layers
314f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    TextureVertex* mRegionMesh;
315f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    GLuint mRegionMeshIndices;
316f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
317f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    mutable Mutex mGarbageLock;
318f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    Vector<Layer*> mLayerGarbage;
319bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy    Vector<DisplayList*> mDisplayListGarbage;
320f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
321e190aa69756aecfaffabdd4c6d32cb6b3220d842Romain Guy    DebugLevel mDebugLevel;
3228ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy    bool mInitialized;
32354c1a64d5441a964890b44280e4457e11f4f924aRomain Guy
32454c1a64d5441a964890b44280e4457e11f4f924aRomain Guy    uint32_t mFunctorsCount;
325fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy}; // class Caches
326fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy
327fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy}; // namespace uirenderer
328fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy}; // namespace android
329fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy
3305b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#endif // ANDROID_HWUI_CACHES_H
331