1 /*
2  * Copyright (C) 2010 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #pragma once
18 
19 #include "DeviceInfo.h"
20 #include "Extensions.h"
21 #include "FboCache.h"
22 #include "GammaFontRenderer.h"
23 #include "GradientCache.h"
24 #include "PatchCache.h"
25 #include "PathCache.h"
26 #include "ProgramCache.h"
27 #include "RenderBufferCache.h"
28 #include "ResourceCache.h"
29 #include "TessellationCache.h"
30 #include "TextDropShadowCache.h"
31 #include "TextureCache.h"
32 #include "renderstate/PixelBufferState.h"
33 #include "renderstate/TextureState.h"
34 #include "thread/TaskManager.h"
35 #include "thread/TaskProcessor.h"
36 
37 #include <memory>
38 #include <vector>
39 
40 #include <GLES3/gl3.h>
41 
42 #include <utils/KeyedVector.h>
43 
44 #include <cutils/compiler.h>
45 
46 #include <SkPath.h>
47 
48 #include <vector>
49 
50 namespace android {
51 namespace uirenderer {
52 
53 ///////////////////////////////////////////////////////////////////////////////
54 // Caches
55 ///////////////////////////////////////////////////////////////////////////////
56 
57 class RenderNode;
58 class RenderState;
59 
60 class ANDROID_API Caches {
61 public:
createInstance(RenderState & renderState)62     static Caches& createInstance(RenderState& renderState) {
63         LOG_ALWAYS_FATAL_IF(sInstance, "double create of Caches attempted");
64         sInstance = new Caches(renderState);
65         return *sInstance;
66     }
67 
getInstance()68     static Caches& getInstance() {
69         LOG_ALWAYS_FATAL_IF(!sInstance, "instance not yet created");
70         return *sInstance;
71     }
72 
hasInstance()73     static bool hasInstance() { return sInstance != nullptr; }
74 
75 private:
76     explicit Caches(RenderState& renderState);
77     static Caches* sInstance;
78 
79 public:
80     enum class FlushMode { Layers = 0, Moderate, Full };
81 
82     /**
83      * Initialize caches.
84      */
85     bool init();
86 
isInitialized()87     bool isInitialized() { return mInitialized; }
88 
89     /**
90      * Flush the cache.
91      *
92      * @param mode Indicates how much of the cache should be flushed
93      */
94     void flush(FlushMode mode);
95 
96     /**
97      * Destroys all resources associated with this cache. This should
98      * be called after a flush(FlushMode::Full).
99      */
100     void terminate();
101 
102     /**
103      * Returns a non-premultiplied ARGB color for the specified
104      * amount of overdraw (1 for 1x, 2 for 2x, etc.)
105      */
106     uint32_t getOverdrawColor(uint32_t amount) const;
107 
108     /**
109      * Call this on each frame to ensure that garbage is deleted from
110      * GPU memory.
111      */
112     void clearGarbage();
113 
114     /**
115      * Can be used to delete a layer from a non EGL thread.
116      */
117     void deleteLayerDeferred(Layer* layer);
118 
119     /**
120      * Returns the mesh used to draw regions. Calling this method will
121      * bind a VBO of type GL_ELEMENT_ARRAY_BUFFER that contains the
122      * indices for the region mesh.
123      */
124     TextureVertex* getRegionMesh();
125 
126     /**
127      * Returns the GL RGBA internal format to use for the current device
128      * If the device supports linear blending and needSRGB is true,
129      * this function returns GL_SRGB8_ALPHA8, otherwise it returns GL_RGBA
130      */
131     constexpr GLint rgbaInternalFormat(bool needSRGB = true) const {
132         return extensions().hasLinearBlending() && needSRGB ? GL_SRGB8_ALPHA8 : GL_RGBA;
133     }
134 
135     /**
136      * Displays the memory usage of each cache and the total sum.
137      */
138     void dumpMemoryUsage();
139     void dumpMemoryUsage(String8& log);
140 
141     // Misc
142     GLint maxTextureSize;
143 
144 public:
145     TextureCache textureCache;
146     RenderBufferCache renderBufferCache;
147     GradientCache gradientCache;
148     PatchCache patchCache;
149     PathCache pathCache;
150     ProgramCache programCache;
151     TessellationCache tessellationCache;
152     TextDropShadowCache dropShadowCache;
153     FboCache fboCache;
154 
155     GammaFontRenderer fontRenderer;
156 
157     TaskManager tasks;
158 
159     bool gpuPixelBuffersEnabled;
160 
161     // Debug methods
162     PFNGLINSERTEVENTMARKEREXTPROC eventMark;
163     PFNGLPUSHGROUPMARKEREXTPROC startMark;
164     PFNGLPOPGROUPMARKEREXTPROC endMark;
165 
166     void setProgram(const ProgramDescription& description);
167     void setProgram(Program* program);
168 
extensions()169     const Extensions& extensions() const { return DeviceInfo::get()->extensions(); }
program()170     Program& program() { return *mProgram; }
pixelBufferState()171     PixelBufferState& pixelBufferState() { return *mPixelBufferState; }
textureState()172     TextureState& textureState() { return *mTextureState; }
173 
174 private:
175     void initExtensions();
176     void initConstraints();
177     void initStaticProperties();
178 
eventMarkNull(GLsizei length,const GLchar * marker)179     static void eventMarkNull(GLsizei length, const GLchar* marker) {}
startMarkNull(GLsizei length,const GLchar * marker)180     static void startMarkNull(GLsizei length, const GLchar* marker) {}
endMarkNull()181     static void endMarkNull() {}
182 
183     RenderState* mRenderState;
184 
185     // Used to render layers
186     std::unique_ptr<TextureVertex[]> mRegionMesh;
187 
188     mutable Mutex mGarbageLock;
189     std::vector<Layer*> mLayerGarbage;
190 
191     bool mInitialized;
192 
193     // TODO: move below to RenderState
194     PixelBufferState* mPixelBufferState = nullptr;
195     TextureState* mTextureState = nullptr;
196     Program* mProgram = nullptr;  // note: object owned by ProgramCache
197 
198 };  // class Caches
199 
200 };  // namespace uirenderer
201 };  // namespace android
202