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
175e00c7ce063116c11315639f0035aca8ad73e8ccChris Craik#pragma once
18fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy
19642ebea6e14b72c512ef1168dc6edb061035ddedJohn Reck#include "DeviceInfo.h"
2096a5c4c7bab6718524de7253da8309143ab48befChris Craik#include "Extensions.h"
2196a5c4c7bab6718524de7253da8309143ab48befChris Craik#include "FboCache.h"
22c08820f587ad94698691a6657e87712de07e484cChris Craik#include "GammaFontRenderer.h"
2396a5c4c7bab6718524de7253da8309143ab48befChris Craik#include "GradientCache.h"
2496a5c4c7bab6718524de7253da8309143ab48befChris Craik#include "PatchCache.h"
2596a5c4c7bab6718524de7253da8309143ab48befChris Craik#include "ProgramCache.h"
2696a5c4c7bab6718524de7253da8309143ab48befChris Craik#include "PathCache.h"
2796a5c4c7bab6718524de7253da8309143ab48befChris Craik#include "RenderBufferCache.h"
2896a5c4c7bab6718524de7253da8309143ab48befChris Craik#include "renderstate/PixelBufferState.h"
2944eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik#include "renderstate/TextureState.h"
3096a5c4c7bab6718524de7253da8309143ab48befChris Craik#include "ResourceCache.h"
3196a5c4c7bab6718524de7253da8309143ab48befChris Craik#include "TessellationCache.h"
3296a5c4c7bab6718524de7253da8309143ab48befChris Craik#include "TextDropShadowCache.h"
3396a5c4c7bab6718524de7253da8309143ab48befChris Craik#include "TextureCache.h"
3496a5c4c7bab6718524de7253da8309143ab48befChris Craik#include "thread/TaskProcessor.h"
3596a5c4c7bab6718524de7253da8309143ab48befChris Craik#include "thread/TaskManager.h"
3696a5c4c7bab6718524de7253da8309143ab48befChris Craik
3759744b79ec302000802cd56d30a1bf70f0183c80Chris Craik#include <vector>
3896a5c4c7bab6718524de7253da8309143ab48befChris Craik#include <memory>
3959744b79ec302000802cd56d30a1bf70f0183c80Chris Craik
403b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy#include <GLES3/gl3.h>
413b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
423b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy#include <utils/KeyedVector.h>
43fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy
447953745dd565167113f8cbfc461bc0521d32d870Romain Guy#include <cutils/compiler.h>
457953745dd565167113f8cbfc461bc0521d32d870Romain Guy
462dc236b2bae13b9a0ed9b3f7320502aecd7983b3Tom Hudson#include <SkPath.h>
472dc236b2bae13b9a0ed9b3f7320502aecd7983b3Tom Hudson
48272a685f17cc4828257e521a6f62b7b17870f75eJohn Reck#include <vector>
49272a685f17cc4828257e521a6f62b7b17870f75eJohn Reck
50fb8b763f762ae21923c58d64caa729b012f40e05Romain Guynamespace android {
51fb8b763f762ae21923c58d64caa729b012f40e05Romain Guynamespace uirenderer {
52fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy
5303750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy///////////////////////////////////////////////////////////////////////////////
5403750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy// Caches
5503750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy///////////////////////////////////////////////////////////////////////////////
5603750a067e818ca7fbd0f590e2ff6a8fded21e6cRomain Guy
57e18264b079481a244b30e3f71012c53bbd861f92John Reckclass RenderNode;
5817035b0211a3c9d45ea46a99217a6acbe76e8fbeJohn Reckclass RenderState;
59bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy
6096a5c4c7bab6718524de7253da8309143ab48befChris Craikclass ANDROID_API Caches {
6196a5c4c7bab6718524de7253da8309143ab48befChris Craikpublic:
6296a5c4c7bab6718524de7253da8309143ab48befChris Craik    static Caches& createInstance(RenderState& renderState) {
6396a5c4c7bab6718524de7253da8309143ab48befChris Craik        LOG_ALWAYS_FATAL_IF(sInstance, "double create of Caches attempted");
6496a5c4c7bab6718524de7253da8309143ab48befChris Craik        sInstance = new Caches(renderState);
6596a5c4c7bab6718524de7253da8309143ab48befChris Craik        return *sInstance;
6696a5c4c7bab6718524de7253da8309143ab48befChris Craik    }
67fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy
6896a5c4c7bab6718524de7253da8309143ab48befChris Craik    static Caches& getInstance() {
6996a5c4c7bab6718524de7253da8309143ab48befChris Craik        LOG_ALWAYS_FATAL_IF(!sInstance, "instance not yet created");
7096a5c4c7bab6718524de7253da8309143ab48befChris Craik        return *sInstance;
7196a5c4c7bab6718524de7253da8309143ab48befChris Craik    }
72fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy
7396a5c4c7bab6718524de7253da8309143ab48befChris Craik    static bool hasInstance() {
742507c34d91bb0d722b6012e85cb47387b2aa6873Chris Craik        return sInstance != nullptr;
7596a5c4c7bab6718524de7253da8309143ab48befChris Craik    }
7696a5c4c7bab6718524de7253da8309143ab48befChris Craikprivate:
77faecb78a6b11c780db47bc940ca7662899ab5d5eChih-Hung Hsieh    explicit Caches(RenderState& renderState);
7896a5c4c7bab6718524de7253da8309143ab48befChris Craik    static Caches* sInstance;
799bca4793a33d2714b306d69ceb870925a588fe71Romain Guy
80fb8b763f762ae21923c58d64caa729b012f40e05Romain Guypublic:
81b9ce116dac378b4cf4490f265dcbd5704a1dd43cChris Craik    enum class FlushMode {
82b9ce116dac378b4cf4490f265dcbd5704a1dd43cChris Craik        Layers = 0,
83b9ce116dac378b4cf4490f265dcbd5704a1dd43cChris Craik        Moderate,
84b9ce116dac378b4cf4490f265dcbd5704a1dd43cChris Craik        Full
85bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy    };
86bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy
87bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy    /**
88dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy     * Initialize caches.
898ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy     */
903b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    bool init();
918ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy
92db009173f800bb0d626c42786b5bd0f57cc6545aJohn Reck    bool isInitialized() { return mInitialized; }
93db009173f800bb0d626c42786b5bd0f57cc6545aJohn Reck
948ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy    /**
95bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy     * Flush the cache.
96bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy     *
97bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy     * @param mode Indicates how much of the cache should be flushed
98bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy     */
99bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy    void flush(FlushMode mode);
100bdf7609867a3f886455c51dba91623a86cceb6e2Romain Guy
1015b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    /**
1028ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy     * Destroys all resources associated with this cache. This should
103b9ce116dac378b4cf4490f265dcbd5704a1dd43cChris Craik     * be called after a flush(FlushMode::Full).
1048ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy     */
1058ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy    void terminate();
1068ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy
1078ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy    /**
108627c6fd91377ead85f74a365438e25610ef1e2eeRomain Guy     * Returns a non-premultiplied ARGB color for the specified
109627c6fd91377ead85f74a365438e25610ef1e2eeRomain Guy     * amount of overdraw (1 for 1x, 2 for 2x, etc.)
110627c6fd91377ead85f74a365438e25610ef1e2eeRomain Guy     */
111627c6fd91377ead85f74a365438e25610ef1e2eeRomain Guy    uint32_t getOverdrawColor(uint32_t amount) const;
112627c6fd91377ead85f74a365438e25610ef1e2eeRomain Guy
113627c6fd91377ead85f74a365438e25610ef1e2eeRomain Guy    /**
114fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy     * Call this on each frame to ensure that garbage is deleted from
115fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy     * GPU memory.
116fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy     */
117fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy    void clearGarbage();
118fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy
119fe48f65922d4a3cc4aefe058cee5acec51504a20Romain Guy    /**
120ada830f639591b99c3e40de22b07296c7932a33fRomain Guy     * Can be used to delete a layer from a non EGL thread.
12157066eb64c9a190d1afc87bb060bbb2d31e5b86cRomain Guy     */
122ada830f639591b99c3e40de22b07296c7932a33fRomain Guy    void deleteLayerDeferred(Layer* layer);
12357066eb64c9a190d1afc87bb060bbb2d31e5b86cRomain Guy
12482bc7a772747fcf8a6fe7097f70bf2981429ffe9Romain Guy    /**
1255b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy     * Returns the mesh used to draw regions. Calling this method will
1265b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy     * bind a VBO of type GL_ELEMENT_ARRAY_BUFFER that contains the
1275b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy     * indices for the region mesh.
1285b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy     */
1295b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    TextureVertex* getRegionMesh();
1305b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy
131c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy    /**
132253f2c213f6ecda63b6872aee77bd30d5ec07c82Romain Guy     * Returns the GL RGBA internal format to use for the current device
133253f2c213f6ecda63b6872aee77bd30d5ec07c82Romain Guy     * If the device supports linear blending and needSRGB is true,
134253f2c213f6ecda63b6872aee77bd30d5ec07c82Romain Guy     * this function returns GL_SRGB8_ALPHA8, otherwise it returns GL_RGBA
135253f2c213f6ecda63b6872aee77bd30d5ec07c82Romain Guy     */
136253f2c213f6ecda63b6872aee77bd30d5ec07c82Romain Guy    constexpr GLint rgbaInternalFormat(bool needSRGB = true) const {
137efb4b06493fe7b1604c762a448b13c7af2845a8dRomain Guy        return extensions().hasLinearBlending() && needSRGB ? GL_SRGB8_ALPHA8 : GL_RGBA;
138253f2c213f6ecda63b6872aee77bd30d5ec07c82Romain Guy    }
139253f2c213f6ecda63b6872aee77bd30d5ec07c82Romain Guy
140253f2c213f6ecda63b6872aee77bd30d5ec07c82Romain Guy    /**
141c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy     * Displays the memory usage of each cache and the total sum.
142c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy     */
143c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy    void dumpMemoryUsage();
1449c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    void dumpMemoryUsage(String8& log);
145c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy
146746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy    // Misc
147746b7401ceb86b5f2805f8c0d3b39ac739152015Romain Guy    GLint maxTextureSize;
1483ff0bfdd144bba3b023eda8c49b25fb0d0de8653Romain Guy
149117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craikpublic:
150fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy    TextureCache textureCache;
1518d4aeb7111afac0c3c7e56d4ad5d92f9cfce2ffdRomain Guy    RenderBufferCache renderBufferCache;
152fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy    GradientCache gradientCache;
153fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy    PatchCache patchCache;
154117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik    PathCache pathCache;
155117bdbcfa3e8306dad21e7e01fa71b00cdfa7265Chris Craik    ProgramCache programCache;
15605f3d6e5111fd08df5cd9aae2c3d28399dc0e7f5Chris Craik    TessellationCache tessellationCache;
157fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy    TextDropShadowCache dropShadowCache;
158e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy    FboCache fboCache;
15929d8997bd43b7c4ad37fc3d6f91eaafa74913c88Romain Guy
160c08820f587ad94698691a6657e87712de07e484cChris Craik    GammaFontRenderer fontRenderer;
161b1d0a4ed21168fefcb82232c8f22cb95d60acb85Romain Guy
1625dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy    TaskManager tasks;
1635dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy
164f9f0016b1ff816eb2c7561eed482c056189005f8Romain Guy    bool gpuPixelBuffersEnabled;
165f9f0016b1ff816eb2c7561eed482c056189005f8Romain Guy
166dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy    // Debug methods
16713631f3da855f200a151e7837ed9f6b079622b58Romain Guy    PFNGLINSERTEVENTMARKEREXTPROC eventMark;
16813631f3da855f200a151e7837ed9f6b079622b58Romain Guy    PFNGLPUSHGROUPMARKEREXTPROC startMark;
16913631f3da855f200a151e7837ed9f6b079622b58Romain Guy    PFNGLPOPGROUPMARKEREXTPROC endMark;
17013631f3da855f200a151e7837ed9f6b079622b58Romain Guy
1716c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik    void setProgram(const ProgramDescription& description);
1726c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik    void setProgram(Program* program);
1736c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik
174642ebea6e14b72c512ef1168dc6edb061035ddedJohn Reck    const Extensions& extensions() const { return DeviceInfo::get()->extensions(); }
1756c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik    Program& program() { return *mProgram; }
17644eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik    PixelBufferState& pixelBufferState() { return *mPixelBufferState; }
17744eb2c00861098dd3e2950d923646814b4cc57c2Chris Craik    TextureState& textureState() { return *mTextureState; }
17896a5c4c7bab6718524de7253da8309143ab48befChris Craik
179e190aa69756aecfaffabdd4c6d32cb6b3220d842Romain Guyprivate:
180dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy    void initExtensions();
181dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy    void initConstraints();
182f9f0016b1ff816eb2c7561eed482c056189005f8Romain Guy    void initStaticProperties();
183dfa1046ecab165eb0daf5caa8475e993350f4a2bRomain Guy
18464bb413a664001c95c8439cf097dc3033f4ed733Andreas Gampe    static void eventMarkNull(GLsizei length, const GLchar* marker) { }
18564bb413a664001c95c8439cf097dc3033f4ed733Andreas Gampe    static void startMarkNull(GLsizei length, const GLchar* marker) { }
18613631f3da855f200a151e7837ed9f6b079622b58Romain Guy    static void endMarkNull() { }
18713631f3da855f200a151e7837ed9f6b079622b58Romain Guy
18896a5c4c7bab6718524de7253da8309143ab48befChris Craik    RenderState* mRenderState;
1893bbacf27c0be1bae4e4483577fc89ae3113abe5dRomain Guy
190f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    // Used to render layers
19151d6a3db97bdd5315f1a17a4b447d10a92217b98Chris Craik    std::unique_ptr<TextureVertex[]> mRegionMesh;
1923b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
193f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy    mutable Mutex mGarbageLock;
194272a685f17cc4828257e521a6f62b7b17870f75eJohn Reck    std::vector<Layer*> mLayerGarbage;
195f3a910b423db7ad79cf61518bdd9278c048ad0d8Romain Guy
1968ff6b9ebeeb24a6161ec6098e6bfdf8790ee5695Romain Guy    bool mInitialized;
19754c1a64d5441a964890b44280e4457e11f4f924aRomain Guy
1986c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik    // TODO: move below to RenderState
1996c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik    PixelBufferState* mPixelBufferState = nullptr;
2006c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik    TextureState* mTextureState = nullptr;
2016c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik    Program* mProgram = nullptr; // note: object owned by ProgramCache
2026c15ffa196fc9b7724c189d833c3435d8db12266Chris Craik
203fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy}; // class Caches
204fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy
205fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy}; // namespace uirenderer
206fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy}; // namespace android
207