[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 "TransformationMatrix.h"
31 #include "cc/CCLayerTreeHostCommon.h"
32 #include "cc/CCProxy.h"
33
34 #include <wtf/PassOwnPtr.h>
35 #include <wtf/PassRefPtr.h>
36 #include <wtf/RefCounted.h>
37
38 #if USE(SKIA)
39 class GrContext;
40 #endif
41
42 namespace WebCore {
43
44 class CCLayerTreeHostImpl;
45 class CCTextureUpdater;
46 class GraphicsContext3D;
47 class LayerChromium;
48 class LayerPainterChromium;
49 class TextureAllocator;
50 class TextureManager;
51
52 class CCLayerTreeHostClient {
53 public:
54     virtual void animateAndLayout(double frameBeginTime) = 0;
55     virtual void applyScrollDelta(const IntSize&) = 0;
56     virtual PassRefPtr<GraphicsContext3D> createLayerTreeHostContext3D() = 0;
57     virtual void didRecreateGraphicsContext(bool success) = 0;
58
59     // Used only in the single-threaded path.
60     virtual void scheduleComposite() = 0;
61
62 protected:
63     virtual ~CCLayerTreeHostClient() { }
64 };
65
66 struct CCSettings {
67     CCSettings()
68             : acceleratePainting(false)
69             , compositeOffscreen(false)
70             , showFPSCounter(false)
71             , showPlatformLayerTree(false) { }
72
73     bool acceleratePainting;
74     bool compositeOffscreen;
75     bool showFPSCounter;
76     bool showPlatformLayerTree;
77 };
78
79 // Provides information on an Impl's rendering capabilities back to the CCLayerTreeHost
80 struct LayerRendererCapabilities {
81     LayerRendererCapabilities()
82         : bestTextureFormat(0)
83         , usingMapSub(false)
84         , usingAcceleratedPainting(false)
85         , usingSetVisibility(false)
86         , usingSwapCompleteCallback(false)
87         , maxTextureSize(0) { }
88
89     GC3Denum bestTextureFormat;
90     bool usingMapSub;
91     bool usingAcceleratedPainting;
92     bool usingSetVisibility;
93     bool usingSwapCompleteCallback;
94     int maxTextureSize;
95 };
96
97 class CCLayerTreeHost : public RefCounted<CCLayerTreeHost> {
98 public:
99     static PassRefPtr<CCLayerTreeHost> create(CCLayerTreeHostClient*, PassRefPtr<LayerChromium> rootLayer, const CCSettings&);
100     virtual ~CCLayerTreeHost();
101
102     // CCLayerTreeHost interface to CCProxy.
103     void animateAndLayout(double frameBeginTime);
104     void beginCommitOnImplThread(CCLayerTreeHostImpl*);
105     void finishCommitOnImplThread(CCLayerTreeHostImpl*);
106     void commitComplete();
107     PassRefPtr<GraphicsContext3D> createLayerTreeHostContext3D();
108     virtual PassOwnPtr<CCLayerTreeHostImpl> createLayerTreeHostImpl(CCLayerTreeHostImplClient*);
109     void didRecreateGraphicsContext(bool success);
110     void deleteContentsTexturesOnImplThread(TextureAllocator*);
111
112     // CCLayerTreeHost interface to WebView.
113     bool animating() const { return m_animating; }
114     void setAnimating(bool animating) { m_animating = animating; } // Can be removed when non-threaded scheduling moves inside.
115
116     CCLayerTreeHostClient* client() { return m_client; }
117
118     int compositorIdentifier() const { return m_compositorIdentifier; }
119
120     // Only used when compositing on the main thread.
121     void composite();
122
123     GraphicsContext3D* context();
124
125     // Composites and attempts to read back the result into the provided
126     // buffer. If it wasn't possible, e.g. due to context lost, will return
127     // false.
128     bool compositeAndReadback(void *pixels, const IntRect&);
129
130     void finishAllRendering();
131
132     int frameNumber() const { return m_frameNumber; }
133
134     void setZoomAnimatorTransform(const TransformationMatrix&);
135
136     const LayerRendererCapabilities& layerRendererCapabilities() const;
137
138     // Test-only hook
139     void loseCompositorContext(int numTimes);
140
141     void setNeedsAnimate();
142     void setNeedsCommitThenRedraw();
143     void setNeedsRedraw();
144
145     LayerChromium* rootLayer() { return m_rootLayer.get(); }
146     const LayerChromium* rootLayer() const { return m_rootLayer.get(); }
147
148     const CCSettings& settings() const { return m_settings; }
149
150     void setViewport(const IntSize& viewportSize);
151
152     const IntSize& viewportSize() const { return m_viewportSize; }
153     TextureManager* contentsTextureManager() const;
154
155     void setVisible(bool);
156
157     void updateLayers();
158
159     void updateCompositorResources(GraphicsContext3D*, CCTextureUpdater&);
160     void applyScrollDeltas(const CCScrollUpdateSet&);
161 protected:
162     CCLayerTreeHost(CCLayerTreeHostClient*, PassRefPtr<LayerChromium> rootLayer, const CCSettings&);
163     bool initialize();
164
165 private:
166     typedef Vector<RefPtr<LayerChromium> > LayerList;
167
168     void paintLayerContents(const LayerList&);
169     void paintMaskAndReplicaForRenderSurface(LayerChromium*);
170
171     void updateLayers(LayerChromium*);
172     void updateCompositorResources(LayerChromium*, GraphicsContext3D*, CCTextureUpdater&);
173     void clearPendingUpdate();
174
175     int m_compositorIdentifier;
176
177     bool m_animating;
178
179     CCLayerTreeHostClient* m_client;
180
181     int m_frameNumber;
182
183     OwnPtr<CCProxy> m_proxy;
184
185     RefPtr<LayerChromium> m_rootLayer;
186     OwnPtr<TextureManager> m_contentsTextureManager;
187
188     LayerList m_updateList;
189
190     CCSettings m_settings;
191
192     IntSize m_viewportSize;
193     TransformationMatrix m_zoomAnimatorTransform;
194     bool m_visible;
195 };
196
197 }
198
199 #endif