81b5f2505f1b8450c6dad13cf1c5e83c01f080cc
[WebKit-https.git] / Source / WebCore / platform / graphics / chromium / cc / CCLayerTreeHost.h
1 /*
2  * Copyright (C) 2011 Google Inc. All rights reserved.
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  * 1.  Redistributions of source code must retain the above copyright
8  *     notice, this list of conditions and the following disclaimer.
9  * 2.  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 APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
15  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
16  * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
17  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
18  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
19  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
20  * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
22  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23  */
24
25 #ifndef CCLayerTreeHost_h
26 #define CCLayerTreeHost_h
27
28 #include "GraphicsTypes3D.h"
29 #include "IntRect.h"
30 #include "LayerChromium.h"
31 #include "RateLimiter.h"
32 #include "TransformationMatrix.h"
33 #include "cc/CCLayerTreeHostCommon.h"
34 #include "cc/CCProxy.h"
35
36 #include <wtf/HashMap.h>
37 #include <wtf/PassOwnPtr.h>
38 #include <wtf/PassRefPtr.h>
39 #include <wtf/RefCounted.h>
40
41 #if USE(SKIA)
42 class GrContext;
43 #endif
44
45 namespace WebCore {
46
47 class CCLayerTreeHostImpl;
48 class CCTextureUpdater;
49 class GraphicsContext3D;
50 class LayerPainterChromium;
51 class TextureAllocator;
52 class TextureManager;
53
54 class CCLayerTreeHostClient {
55 public:
56     virtual void updateAnimations(double frameBeginTime) = 0;
57     virtual void layout() = 0;
58     virtual void applyScrollAndScale(const IntSize& scrollDelta, float pageScale) = 0;
59     virtual PassRefPtr<GraphicsContext3D> createLayerTreeHostContext3D() = 0;
60     virtual void didRecreateGraphicsContext(bool success) = 0;
61     virtual void didCommitAndDrawFrame() = 0;
62     virtual void didCompleteSwapBuffers() = 0;
63
64     // Used only in the single-threaded path.
65     virtual void scheduleComposite() = 0;
66
67 protected:
68     virtual ~CCLayerTreeHostClient() { }
69 };
70
71 struct CCSettings {
72     CCSettings()
73             : acceleratePainting(false)
74             , compositeOffscreen(false)
75             , showFPSCounter(false)
76             , showPlatformLayerTree(false)
77             , refreshRate(0)
78             , perTilePainting(false)
79             , partialSwapEnabled(false)
80             , partialTextureUpdates(true) { }
81
82     bool acceleratePainting;
83     bool compositeOffscreen;
84     bool showFPSCounter;
85     bool showPlatformLayerTree;
86     double refreshRate;
87     bool perTilePainting;
88     bool partialSwapEnabled;
89     bool partialTextureUpdates;
90 };
91
92 // Provides information on an Impl's rendering capabilities back to the CCLayerTreeHost
93 struct LayerRendererCapabilities {
94     LayerRendererCapabilities()
95         : bestTextureFormat(0)
96         , contextHasCachedFrontBuffer(false)
97         , usingPartialSwap(false)
98         , usingMapSub(false)
99         , usingAcceleratedPainting(false)
100         , usingSetVisibility(false)
101         , usingSwapCompleteCallback(false)
102         , usingTextureUsageHint(false)
103         , usingTextureStorageExtension(false)
104         , maxTextureSize(0) { }
105
106     GC3Denum bestTextureFormat;
107     bool contextHasCachedFrontBuffer;
108     bool usingPartialSwap;
109     bool usingMapSub;
110     bool usingAcceleratedPainting;
111     bool usingSetVisibility;
112     bool usingSwapCompleteCallback;
113     bool usingTextureUsageHint;
114     bool usingTextureStorageExtension;
115     int maxTextureSize;
116 };
117
118 class CCLayerTreeHost : public RefCounted<CCLayerTreeHost> {
119 public:
120     static PassRefPtr<CCLayerTreeHost> create(CCLayerTreeHostClient*, const CCSettings&);
121     virtual ~CCLayerTreeHost();
122
123     // Returns true if any CCLayerTreeHost is alive.
124     static bool anyLayerTreeHostInstanceExists();
125
126     // CCLayerTreeHost interface to CCProxy.
127     void updateAnimations(double frameBeginTime);
128     void layout();
129     void beginCommitOnImplThread(CCLayerTreeHostImpl*);
130     void finishCommitOnImplThread(CCLayerTreeHostImpl*);
131     void commitComplete();
132     PassRefPtr<GraphicsContext3D> createLayerTreeHostContext3D();
133     virtual PassOwnPtr<CCLayerTreeHostImpl> createLayerTreeHostImpl(CCLayerTreeHostImplClient*);
134     void didBecomeInvisibleOnImplThread(CCLayerTreeHostImpl*);
135     void didRecreateGraphicsContext(bool success);
136     void didCommitAndDrawFrame() { m_client->didCommitAndDrawFrame(); }
137     void didCompleteSwapBuffers() { m_client->didCompleteSwapBuffers(); }
138     void deleteContentsTexturesOnImplThread(TextureAllocator*);
139
140     CCLayerTreeHostClient* client() { return m_client; }
141
142     int compositorIdentifier() const { return m_compositorIdentifier; }
143
144     // Only used when compositing on the main thread.
145     void composite();
146
147     GraphicsContext3D* context();
148
149     // Composites and attempts to read back the result into the provided
150     // buffer. If it wasn't possible, e.g. due to context lost, will return
151     // false.
152     bool compositeAndReadback(void *pixels, const IntRect&);
153
154     void finishAllRendering();
155
156     int frameNumber() const { return m_frameNumber; }
157
158     const LayerRendererCapabilities& layerRendererCapabilities() const;
159
160     // Test-only hook
161     void loseCompositorContext(int numTimes);
162
163     void setNeedsAnimate();
164     // virtual for testing
165     virtual void setNeedsCommit();
166     void setNeedsRedraw();
167
168     LayerChromium* rootLayer() { return m_rootLayer.get(); }
169     const LayerChromium* rootLayer() const { return m_rootLayer.get(); }
170     void setRootLayer(PassRefPtr<LayerChromium>);
171
172     const CCSettings& settings() const { return m_settings; }
173
174     void setViewportSize(const IntSize&);
175
176     const IntSize& viewportSize() const { return m_viewportSize; }
177
178     void setPageScale(float);
179     float pageScale() const { return m_pageScale; }
180
181     void setPageScaleFactorLimits(float minScale, float maxScale);
182
183     TextureManager* contentsTextureManager() const;
184
185     bool visible() const { return m_visible; }
186     void setVisible(bool);
187
188     void setHaveWheelEventHandlers(bool);
189
190     void updateLayers();
191
192     void updateCompositorResources(GraphicsContext3D*, CCTextureUpdater&);
193     void applyScrollAndScale(const CCScrollAndScaleSet&);
194     void startRateLimiter(GraphicsContext3D*);
195     void stopRateLimiter(GraphicsContext3D*);
196
197     void deleteTextureAfterCommit(PassOwnPtr<ManagedTexture>);
198
199 protected:
200     CCLayerTreeHost(CCLayerTreeHostClient*, const CCSettings&);
201     bool initialize();
202
203 private:
204     typedef Vector<RefPtr<LayerChromium> > LayerList;
205     typedef Vector<OwnPtr<ManagedTexture> > TextureList;
206
207     enum PaintType { PaintVisible, PaintIdle };
208     static void paintContentsIfDirty(LayerChromium*, PaintType);
209     void paintLayerContents(const LayerList&, PaintType);
210     void paintMaskAndReplicaForRenderSurface(LayerChromium*, PaintType);
211
212     void updateLayers(LayerChromium*);
213     // Pre-reserve textures for any layer marked "always reserve textures"
214     void reserveTextures();
215     void clearPendingUpdate();
216
217     int m_compositorIdentifier;
218
219     bool m_animating;
220
221     CCLayerTreeHostClient* m_client;
222
223     int m_frameNumber;
224
225     OwnPtr<CCProxy> m_proxy;
226
227     RefPtr<LayerChromium> m_rootLayer;
228     OwnPtr<TextureManager> m_contentsTextureManager;
229
230     LayerList m_updateList;
231
232     CCSettings m_settings;
233
234     IntSize m_viewportSize;
235     bool m_visible;
236     bool m_haveWheelEventHandlers;
237     typedef HashMap<GraphicsContext3D*, RefPtr<RateLimiter> > RateLimiterMap;
238     RateLimiterMap m_rateLimiters;
239
240     float m_pageScale;
241     float m_minPageScale, m_maxPageScale;
242     bool m_triggerIdlePaints;
243
244     TextureList m_deleteTextureAfterCommitList;
245 };
246
247 }
248
249 #endif