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
2096a5c4c7bab6718524de7253da8309143ab48befChris Craik#include "AssetAtlas.h"
2196a5c4c7bab6718524de7253da8309143ab48befChris Craik#include "Dither.h"
2296a5c4c7bab6718524de7253da8309143ab48befChris Craik#include "Extensions.h"
2396a5c4c7bab6718524de7253da8309143ab48befChris Craik#include "FboCache.h"
24c08820f587ad94698691a6657e87712de07e484cChris Craik#include "GammaFontRenderer.h"
2596a5c4c7bab6718524de7253da8309143ab48befChris Craik#include "GradientCache.h"
2696a5c4c7bab6718524de7253da8309143ab48befChris Craik#include "LayerCache.h"
2796a5c4c7bab6718524de7253da8309143ab48befChris Craik#include "PatchCache.h"
2896a5c4c7bab6718524de7253da8309143ab48befChris Craik#include "ProgramCache.h"
2996a5c4c7bab6718524de7253da8309143ab48befChris Craik#include "PathCache.h"
3096a5c4c7bab6718524de7253da8309143ab48befChris Craik#include "RenderBufferCache.h"
3196a5c4c7bab6718524de7253da8309143ab48befChris Craik#include "renderstate/PixelBufferState.h"
3244eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik#include "renderstate/TextureState.h"
3396a5c4c7bab6718524de7253da8309143ab48befChris Craik#include "ResourceCache.h"
3496a5c4c7bab6718524de7253da8309143ab48befChris Craik#include "TessellationCache.h"
3596a5c4c7bab6718524de7253da8309143ab48befChris Craik#include "TextDropShadowCache.h"
3696a5c4c7bab6718524de7253da8309143ab48befChris Craik#include "TextureCache.h"
3796a5c4c7bab6718524de7253da8309143ab48befChris Craik#include "thread/TaskProcessor.h"
3896a5c4c7bab6718524de7253da8309143ab48befChris Craik#include "thread/TaskManager.h"
3996a5c4c7bab6718524de7253da8309143ab48befChris Craik
4059744b79ec302000802cd56d30a1bf70f0183c80Chris Craik#include <vector>
4196a5c4c7bab6718524de7253da8309143ab48befChris Craik#include <memory>
4259744b79ec302000802cd56d30a1bf70f0183c80Chris Craik
433b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy#include <GLES3/gl3.h>
443b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
453b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy#include <utils/KeyedVector.h>
46fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy
477953745dd565167113f8cbfc461bc0521d32d870Romain Guy#include <cutils/compiler.h>
487953745dd565167113f8cbfc461bc0521d32d870Romain Guy
492dc236b2bae13b9a0ed9b3f7320502aecd7983b3Tom Hudson#include <SkPath.h>
502dc236b2bae13b9a0ed9b3f7320502aecd7983b3Tom Hudson
51272a685f17cc4828257e521a6f62b7b17870f75eJohn Reck#include <vector>
52272a685f17cc4828257e521a6f62b7b17870f75eJohn Reck
53fb8b763f762ae21923c58d64caa729b012f40e05Romain Guynamespace android {
54fb8b763f762ae21923c58d64caa729b012f40e05Romain Guynamespace uirenderer {
55fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy
5603750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy///////////////////////////////////////////////////////////////////////////////
5703750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy// Caches
5803750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy///////////////////////////////////////////////////////////////////////////////
5903750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy
60e18264b079481a244b30e3f71012c53bbd861f92John Reckclass RenderNode;
6117035b0211a3c9d45ea46a99217a6acbe76e8fbeJohn Reckclass RenderState;
62bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy
6396a5c4c7bab6718524de7253da8309143ab48befChris Craikclass ANDROID_API Caches {
6496a5c4c7bab6718524de7253da8309143ab48befChris Craikpublic:
6596a5c4c7bab6718524de7253da8309143ab48befChris Craik    static Caches& createInstance(RenderState& renderState) {
6696a5c4c7bab6718524de7253da8309143ab48befChris Craik        LOG_ALWAYS_FATAL_IF(sInstance, "double create of Caches attempted");
6796a5c4c7bab6718524de7253da8309143ab48befChris Craik        sInstance = new Caches(renderState);
6896a5c4c7bab6718524de7253da8309143ab48befChris Craik        return *sInstance;
6996a5c4c7bab6718524de7253da8309143ab48befChris Craik    }
70fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy
7196a5c4c7bab6718524de7253da8309143ab48befChris Craik    static Caches& getInstance() {
7296a5c4c7bab6718524de7253da8309143ab48befChris Craik        LOG_ALWAYS_FATAL_IF(!sInstance, "instance not yet created");
7396a5c4c7bab6718524de7253da8309143ab48befChris Craik        return *sInstance;
7496a5c4c7bab6718524de7253da8309143ab48befChris Craik    }
75fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy
7696a5c4c7bab6718524de7253da8309143ab48befChris Craik    static bool hasInstance() {
772507c34d91bb0d722b6012e85cb47387b2aa6873Chris Craik        return sInstance != nullptr;
7896a5c4c7bab6718524de7253da8309143ab48befChris Craik    }
7996a5c4c7bab6718524de7253da8309143ab48befChris Craikprivate:
8096a5c4c7bab6718524de7253da8309143ab48befChris Craik    Caches(RenderState& renderState);
8196a5c4c7bab6718524de7253da8309143ab48befChris Craik    static Caches* sInstance;
829bca4793a33d2714b306d69ceb870925a588fe71Romain Guy
83fb8b763f762ae21923c58d64caa729b012f40e05Romain Guypublic:
84b9ce116dac378b4cf4490f265dcbd5704a1dd43cChris Craik    enum class FlushMode {
85b9ce116dac378b4cf4490f265dcbd5704a1dd43cChris Craik        Layers = 0,
86b9ce116dac378b4cf4490f265dcbd5704a1dd43cChris Craik        Moderate,
87b9ce116dac378b4cf4490f265dcbd5704a1dd43cChris Craik        Full
88bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy    };
89bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy
90bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy    /**
91dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy     * Initialize caches.
928ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy     */
933b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    bool init();
948ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy
95db009173f800bb0d626c42786b5bd0f57cc6545aJohn Reck    bool isInitialized() { return mInitialized; }
96db009173f800bb0d626c42786b5bd0f57cc6545aJohn Reck
978ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy    /**
98bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy     * Flush the cache.
99bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy     *
100bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy     * @param mode Indicates how much of the cache should be flushed
101bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy     */
102bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy    void flush(FlushMode mode);
103bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy
1045b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    /**
1058ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy     * Destroys all resources associated with this cache. This should
106b9ce116dac378b4cf4490f265dcbd5704a1dd43cChris Craik     * be called after a flush(FlushMode::Full).
1078ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy     */
1088ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy    void terminate();
1098ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy
1108ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy    /**
111627c6fd91377ead85f74a365438e25610ef1e2eeRomain Guy     * Returns a non-premultiplied ARGB color for the specified
112627c6fd91377ead85f74a365438e25610ef1e2eeRomain Guy     * amount of overdraw (1 for 1x, 2 for 2x, etc.)
113627c6fd91377ead85f74a365438e25610ef1e2eeRomain Guy     */
114627c6fd91377ead85f74a365438e25610ef1e2eeRomain Guy    uint32_t getOverdrawColor(uint32_t amount) const;
115627c6fd91377ead85f74a365438e25610ef1e2eeRomain Guy
116627c6fd91377ead85f74a365438e25610ef1e2eeRomain Guy    /**
117fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy     * Call this on each frame to ensure that garbage is deleted from
118fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy     * GPU memory.
119fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy     */
120fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy    void clearGarbage();
121fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy
122fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy    /**
123ada830f639591b99c3e40de22b07296c7932a33fRomain Guy     * Can be used to delete a layer from a non EGL thread.
12457066eb64c9a190d1afc87bb060bbb2d31e5b86cRomain Guy     */
125ada830f639591b99c3e40de22b07296c7932a33fRomain Guy    void deleteLayerDeferred(Layer* layer);
12657066eb64c9a190d1afc87bb060bbb2d31e5b86cRomain Guy
12782bc7a772747fcf8a6fe7097f70bf2981429ffe9Romain Guy    /**
1285b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy     * Returns the mesh used to draw regions. Calling this method will
1295b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy     * bind a VBO of type GL_ELEMENT_ARRAY_BUFFER that contains the
1305b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy     * indices for the region mesh.
1315b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy     */
1325b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    TextureVertex* getRegionMesh();
1335b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy
134c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy    /**
135c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy     * Displays the memory usage of each cache and the total sum.
136c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy     */
137c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy    void dumpMemoryUsage();
1389c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    void dumpMemoryUsage(String8& log);
139c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy
140746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy    // Misc
141746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy    GLint maxTextureSize;
1423ff0bfdd144bba3b023eda8c49b25fb0d0de8653Romain Guy
143117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craikprivate:
144117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik    // Declared before gradientCache and programCache which need this to initialize.
145117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik    // TODO: cleanup / move elsewhere
146117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik    Extensions mExtensions;
147117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craikpublic:
148fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy    TextureCache textureCache;
149fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy    LayerCache layerCache;
1508d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy    RenderBufferCache renderBufferCache;
151fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy    GradientCache gradientCache;
152fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy    PatchCache patchCache;
153117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik    PathCache pathCache;
154117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik    ProgramCache programCache;
15505f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik    TessellationCache tessellationCache;
156fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy    TextDropShadowCache dropShadowCache;
157e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy    FboCache fboCache;
15829d8997bd43b7c4ad37fc3d6f91eaafa74913c88Romain Guy
159c08820f587ad94698691a6657e87712de07e484cChris Craik    GammaFontRenderer fontRenderer;
160b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy
1615dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy    TaskManager tasks;
1625dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy
1630baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy    Dither dither;
1640baaac5e9adf3ee280ae1239e2e58754a9d2b099Romain Guy
165f9f0016b1ff816eb2c7561eed482c056189005f8Romain Guy    bool gpuPixelBuffersEnabled;
166f9f0016b1ff816eb2c7561eed482c056189005f8Romain Guy
167dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy    // Debug methods
16813631f3da855f200a151e7837ed9f6b079622b58Romain Guy    PFNGLINSERTEVENTMARKEREXTPROC eventMark;
16913631f3da855f200a151e7837ed9f6b079622b58Romain Guy    PFNGLPUSHGROUPMARKEREXTPROC startMark;
17013631f3da855f200a151e7837ed9f6b079622b58Romain Guy    PFNGLPOPGROUPMARKEREXTPROC endMark;
17113631f3da855f200a151e7837ed9f6b079622b58Romain Guy
1726c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik    void setProgram(const ProgramDescription& description);
1736c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik    void setProgram(Program* program);
1746c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik
175117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik    Extensions& extensions() { return mExtensions; }
1766c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik    Program& program() { return *mProgram; }
17744eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik    PixelBufferState& pixelBufferState() { return *mPixelBufferState; }
17844eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik    TextureState& textureState() { return *mTextureState; }
17996a5c4c7bab6718524de7253da8309143ab48befChris Craik
180e190aa69756aecfaffabdd4c6d32cb6b3220d842Romain Guyprivate:
181dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy    void initExtensions();
182dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy    void initConstraints();
183f9f0016b1ff816eb2c7561eed482c056189005f8Romain Guy    void initStaticProperties();
184dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy
18564bb413a664001c95c8439cf097dc3033f4ed733Andreas Gampe    static void eventMarkNull(GLsizei length, const GLchar* marker) { }
18664bb413a664001c95c8439cf097dc3033f4ed733Andreas Gampe    static void startMarkNull(GLsizei length, const GLchar* marker) { }
18713631f3da855f200a151e7837ed9f6b079622b58Romain Guy    static void endMarkNull() { }
18813631f3da855f200a151e7837ed9f6b079622b58Romain Guy
18996a5c4c7bab6718524de7253da8309143ab48befChris Craik    RenderState* mRenderState;
1903bbacf27c0be1bae4e4483577fc89ae3113abe5dRomain Guy
191f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    // Used to render layers
19251d6a3db97bdd5315f1a17a4b447d10a92217b98Chris Craik    std::unique_ptr<TextureVertex[]> mRegionMesh;
1933b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
194f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    mutable Mutex mGarbageLock;
195272a685f17cc4828257e521a6f62b7b17870f75eJohn Reck    std::vector<Layer*> mLayerGarbage;
196f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
1978ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy    bool mInitialized;
19854c1a64d5441a964890b44280e4457e11f4f924aRomain Guy
1996c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik    // TODO: move below to RenderState
2006c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik    PixelBufferState* mPixelBufferState = nullptr;
2016c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik    TextureState* mTextureState = nullptr;
2026c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik    Program* mProgram = nullptr; // note: object owned by ProgramCache
2036c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik
204fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy}; // class Caches
205fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy
206fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy}; // namespace uirenderer
207fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy}; // namespace android
208fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy
2095b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#endif // ANDROID_HWUI_CACHES_H
210