[chromium] Enable threaded compositing via CCThreadProxy::hasThread only
[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 animateAndLayout(double frameBeginTime) = 0;
57     virtual void applyScrollAndScale(const IntSize& scrollDelta, float pageScale) = 0;
58     virtual PassRefPtr<GraphicsContext3D> createLayerTreeHostContext3D() = 0;
59     virtual void didRecreateGraphicsContext(bool success) = 0;
60     virtual void didCommitAndDrawFrame() = 0;
61     virtual void didCompleteSwapBuffers() = 0;
62
63     // Used only in the single-threaded path.
64     virtual void scheduleComposite() = 0;
65
66 protected:
67     virtual ~CCLayerTreeHostClient() { }
68 };
69
70 struct CCSettings {
71     CCSettings()
72             : acceleratePainting(false)
73             , compositeOffscreen(false)
74             , discardAllTextures(false)
75             , showFPSCounter(false)
76             , showPlatformLayerTree(false)
77             , useDamageTracker(false)
78             , refreshRate(0) { }
79
80     bool acceleratePainting;
81     bool compositeOffscreen;
82     bool discardAllTextures;
83     bool showFPSCounter;
84     bool showPlatformLayerTree;
85     bool useDamageTracker;
86     double refreshRate;
87 };
88
89 // Provides information on an Impl's rendering capabilities back to the CCLayerTreeHost
90 struct LayerRendererCapabilities {
91     LayerRendererCapabilities()
92         : bestTextureFormat(0)
93         , usingFrontBufferCached(false)
94         , usingPostSubBuffer(false)
95         , usingMapSub(false)
96         , usingAcceleratedPainting(false)
97         , usingSetVisibility(false)
98         , usingSwapCompleteCallback(false)
99         , maxTextureSize(0) { }
100
101     GC3Denum bestTextureFormat;
102     bool usingFrontBufferCached;
103     bool usingPostSubBuffer;
104     bool usingMapSub;
105     bool usingAcceleratedPainting;
106     bool usingSetVisibility;
107     bool usingSwapCompleteCallback;
108     int maxTextureSize;
109 };
110
111 class CCLayerTreeHost : public RefCounted<CCLayerTreeHost> {
112 public:
113     static PassRefPtr<CCLayerTreeHost> create(CCLayerTreeHostClient*, const CCSettings&);
114     virtual ~CCLayerTreeHost();
115
116     // Returns true if any CCLayerTreeHost is alive.
117     static bool anyLayerTreeHostInstanceExists();
118
119     // CCLayerTreeHost interface to CCProxy.
120     void animateAndLayout(double frameBeginTime);
121     void beginCommitOnImplThread(CCLayerTreeHostImpl*);
122     void finishCommitOnImplThread(CCLayerTreeHostImpl*);
123     void commitComplete();
124     PassRefPtr<GraphicsContext3D> createLayerTreeHostContext3D();
125     virtual PassOwnPtr<CCLayerTreeHostImpl> createLayerTreeHostImpl(CCLayerTreeHostImplClient*);
126     void didBecomeInvisibleOnImplThread(CCLayerTreeHostImpl*);
127     void didRecreateGraphicsContext(bool success);
128     void didCommitAndDrawFrame() { m_client->didCommitAndDrawFrame(); }
129     void didCompleteSwapBuffers() { m_client->didCompleteSwapBuffers(); }
130     void deleteContentsTexturesOnImplThread(TextureAllocator*);
131
132     // CCLayerTreeHost interface to WebView.
133     bool animating() const { return m_animating; }
134     void setAnimating(bool animating) { m_animating = animating; } // Can be removed when non-threaded scheduling moves inside.
135
136     CCLayerTreeHostClient* client() { return m_client; }
137
138     int compositorIdentifier() const { return m_compositorIdentifier; }
139
140     // Only used when compositing on the main thread.
141     void composite();
142
143     GraphicsContext3D* context();
144
145     // Composites and attempts to read back the result into the provided
146     // buffer. If it wasn't possible, e.g. due to context lost, will return
147     // false.
148     bool compositeAndReadback(void *pixels, const IntRect&);
149
150     void finishAllRendering();
151
152     int frameNumber() const { return m_frameNumber; }
153
154     void setZoomAnimatorTransform(const TransformationMatrix&);
155
156     const LayerRendererCapabilities& layerRendererCapabilities() const;
157
158     // Test-only hook
159     void loseCompositorContext(int numTimes);
160
161     void setNeedsAnimate();
162     void setNeedsCommit();
163     void setNeedsRedraw();
164
165     LayerChromium* rootLayer() { return m_rootLayer.get(); }
166     const LayerChromium* rootLayer() const { return m_rootLayer.get(); }
167     void setRootLayer(PassRefPtr<LayerChromium> rootLayer) { m_rootLayer = rootLayer; }
168
169     const CCSettings& settings() const { return m_settings; }
170
171     void setViewport(const IntSize& viewportSize);
172
173     const IntSize& viewportSize() const { return m_viewportSize; }
174
175     void setPageScale(float);
176     float pageScale() const { return m_pageScale; }
177
178     void setPageScaleFactorLimits(float minScale, float maxScale);
179
180     TextureManager* contentsTextureManager() const;
181
182     bool visible() const { return m_visible; }
183     void setVisible(bool);
184
185     void setHaveWheelEventHandlers(bool);
186
187     void updateLayers();
188
189     void updateCompositorResources(GraphicsContext3D*, CCTextureUpdater&);
190     void applyScrollAndScale(const CCScrollAndScaleSet&);
191     void startRateLimiter(GraphicsContext3D*);
192     void stopRateLimiter(GraphicsContext3D*);
193
194 protected:
195     CCLayerTreeHost(CCLayerTreeHostClient*, const CCSettings&);
196     bool initialize();
197
198 private:
199     typedef Vector<RefPtr<LayerChromium> > LayerList;
200
201     void paintLayerContents(const LayerList&);
202     void paintMaskAndReplicaForRenderSurface(LayerChromium*);
203
204     void updateLayers(LayerChromium*);
205     void clearPendingUpdate();
206
207     int m_compositorIdentifier;
208
209     bool m_animating;
210
211     CCLayerTreeHostClient* m_client;
212
213     int m_frameNumber;
214
215     OwnPtr<CCProxy> m_proxy;
216
217     RefPtr<LayerChromium> m_rootLayer;
218     OwnPtr<TextureManager> m_contentsTextureManager;
219
220     LayerList m_updateList;
221
222     CCSettings m_settings;
223
224     IntSize m_viewportSize;
225     TransformationMatrix m_zoomAnimatorTransform;
226     bool m_visible;
227     bool m_haveWheelEventHandlers;
228     typedef HashMap<GraphicsContext3D*, RefPtr<RateLimiter> > RateLimiterMap;
229     RateLimiterMap m_rateLimiters;
230
231     float m_pageScale;
232     float m_minPageScale, m_maxPageScale;
233 };
234
235 }
236
237 #endif