• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2010, The Android Open Source Project
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *  * Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  *  * Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25 
26 #ifndef TilesManager_h
27 #define TilesManager_h
28 
29 #if USE(ACCELERATED_COMPOSITING)
30 
31 #include "LayerAndroid.h"
32 #include "ShaderProgram.h"
33 #include "TexturesGenerator.h"
34 #include "TilesProfiler.h"
35 #include "VideoLayerManager.h"
36 #include <utils/threads.h>
37 #include <wtf/HashMap.h>
38 
39 namespace WebCore {
40 
41 class OperationFilter;
42 class Tile;
43 class TileTexture;
44 class TransferQueue;
45 
46 class TilesManager {
47 public:
48     // May only be called from the UI thread
49     static TilesManager* instance();
50 
hardwareAccelerationEnabled()51     static bool hardwareAccelerationEnabled()
52     {
53         return gInstance != 0;
54     }
55 
shader()56     ShaderProgram* shader() { return &m_shader; }
57     TransferQueue* transferQueue();
58 
videoLayerManager()59     VideoLayerManager* videoLayerManager() { return &m_videoLayerManager; }
60 
61     void updateTilesIfContextVerified();
62     void cleanupGLResources();
63 
64     void gatherTextures();
layerTexturesRemain()65     bool layerTexturesRemain() { return m_layerTexturesRemain; }
66     void gatherTexturesNumbers(int* nbTextures, int* nbAllocatedTextures,
67                                int* nbLayerTextures, int* nbAllocatedLayerTextures);
68 
69     TileTexture* getAvailableTexture(Tile* owner);
70 
71     void dirtyAllTiles();
72 
73     void printTextures();
74 
75     // m_highEndGfx is written/read only on UI thread, no need for a lock.
76     void setHighEndGfx(bool highEnd);
77     bool highEndGfx();
78 
79     int currentTextureCount();
80     int currentLayerTextureCount();
81     void setCurrentTextureCount(int newTextureCount);
82     void setCurrentLayerTextureCount(int newTextureCount);
83     static int tileWidth();
84     static int tileHeight();
85 
86     void allocateTextures();
87 
88     // remove all tiles from textures (and optionally deallocate gl memory)
89     void discardTextures(bool allTextures, bool glTextures);
90 
getShowVisualIndicator()91     bool getShowVisualIndicator()
92     {
93         return m_showVisualIndicator;
94     }
95 
setShowVisualIndicator(bool showVisualIndicator)96     void setShowVisualIndicator(bool showVisualIndicator)
97     {
98         m_showVisualIndicator = showVisualIndicator;
99     }
100 
getProfiler()101     TilesProfiler* getProfiler()
102     {
103         return &m_profiler;
104     }
105 
invertedScreen()106     bool invertedScreen()
107     {
108         return m_invertedScreen;
109     }
110 
setInvertedScreen(bool invert)111     void setInvertedScreen(bool invert)
112     {
113         m_invertedScreen = invert;
114     }
115 
setInvertedScreenContrast(float contrast)116     void setInvertedScreenContrast(float contrast)
117     {
118         m_shader.setContrast(contrast);
119     }
120 
setUseMinimalMemory(bool useMinimalMemory)121     void setUseMinimalMemory(bool useMinimalMemory)
122     {
123         m_useMinimalMemory = useMinimalMemory;
124     }
125 
useMinimalMemory()126     bool useMinimalMemory()
127     {
128         return m_useMinimalMemory;
129     }
130 
setUseDoubleBuffering(bool useDoubleBuffering)131     void setUseDoubleBuffering(bool useDoubleBuffering)
132     {
133         m_useDoubleBuffering = useDoubleBuffering;
134     }
useDoubleBuffering()135     bool useDoubleBuffering() { return m_useDoubleBuffering; }
136 
137 
incWebkitContentUpdates()138     unsigned int incWebkitContentUpdates() { return m_webkitContentUpdates++; }
139 
incContentUpdates()140     void incContentUpdates() { m_contentUpdates++; }
getContentUpdates()141     unsigned int getContentUpdates() { return m_contentUpdates; }
clearContentUpdates()142     void clearContentUpdates() { m_contentUpdates = 0; }
143 
incDrawGLCount()144     void incDrawGLCount()
145     {
146         m_drawGLCount++;
147     }
148 
getDrawGLCount()149     unsigned long long getDrawGLCount()
150     {
151         return m_drawGLCount;
152     }
153 
154     // operations on/for texture generator threads
155     void removeOperationsForFilter(OperationFilter* filter);
156     bool tryUpdateOperationWithPainter(Tile* tile, TilePainter* painter);
157     void scheduleOperation(QueuedOperation* operation);
158 
159 private:
160     TilesManager();
161     ~TilesManager();
162     int m_scheduleThread;
163 
164     void discardTexturesVector(unsigned long long sparedDrawCount,
165                                WTF::Vector<TileTexture*>& textures,
166                                bool deallocateGLTextures);
167     void dirtyTexturesVector(WTF::Vector<TileTexture*>& textures);
168     void markAllGLTexturesZero();
169     int getMaxTextureAllocation();
170 
171     WTF::Vector<TileTexture*> m_textures;
172     WTF::Vector<TileTexture*> m_availableTextures;
173 
174     WTF::Vector<TileTexture*> m_tilesTextures;
175     WTF::Vector<TileTexture*> m_availableTilesTextures;
176     bool m_layerTexturesRemain;
177 
178     bool m_highEndGfx;
179     int m_currentTextureCount;
180     int m_currentLayerTextureCount;
181     int m_maxTextureAllocation;
182 
183     bool m_generatorReady;
184 
185     bool m_showVisualIndicator;
186     bool m_invertedScreen;
187 
188     bool m_useMinimalMemory;
189 
190     bool m_useDoubleBuffering;
191     unsigned int m_contentUpdates; // nr of successful tiled paints
192     unsigned int m_webkitContentUpdates; // nr of paints from webkit
193 
194     sp<TexturesGenerator>* m_textureGenerators;
195 
196     android::Mutex m_texturesLock;
197 
198     static TilesManager* gInstance;
199 
200     ShaderProgram m_shader;
201     TransferQueue* m_queue;
202 
203     VideoLayerManager m_videoLayerManager;
204 
205     TilesProfiler m_profiler;
206     unsigned long long m_drawGLCount;
207     double m_lastTimeLayersUsed;
208     bool m_hasLayerTextures;
209 
210     EGLContext m_eglContext;
211 };
212 
213 } // namespace WebCore
214 
215 #endif // USE(ACCELERATED_COMPOSITING)
216 #endif // TilesManager_h
217