c740a66202f4bd0f1b3d0606d3aeba9489d20092
[WebKit-https.git] / Source / WebCore / platform / graphics / chromium / cc / CCLayerTreeHostImpl.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 CCLayerTreeHostImpl_h
26 #define CCLayerTreeHostImpl_h
27
28 #include "Color.h"
29 #include "LayerRendererChromium.h"
30 #include "cc/CCAnimationEvents.h"
31 #include "cc/CCInputHandler.h"
32 #include "cc/CCLayerSorter.h"
33 #include "cc/CCLayerTreeHost.h"
34 #include "cc/CCLayerTreeHostCommon.h"
35 #include "cc/CCRenderPass.h"
36 #include <wtf/PassOwnPtr.h>
37 #include <wtf/RefPtr.h>
38
39 namespace WebCore {
40
41 class CCActiveGestureAnimation;
42 class CCCompletionEvent;
43 class CCDebugRectHistory;
44 class CCFontAtlas;
45 class CCFrameRateCounter;
46 class CCHeadsUpDisplay;
47 class CCPageScaleAnimation;
48 class CCLayerImpl;
49 class CCLayerTreeHostImplTimeSourceAdapter;
50 class LayerRendererChromium;
51 class TextureAllocator;
52 struct LayerRendererCapabilities;
53
54 // CCLayerTreeHost->CCProxy callback interface.
55 class CCLayerTreeHostImplClient {
56 public:
57     virtual void didLoseContextOnImplThread() = 0;
58     virtual void onSwapBuffersCompleteOnImplThread() = 0;
59     virtual void setNeedsRedrawOnImplThread() = 0;
60     virtual void setNeedsCommitOnImplThread() = 0;
61     virtual void postAnimationEventsToMainThreadOnImplThread(PassOwnPtr<CCAnimationEventsVector>, double wallClockTime) = 0;
62     virtual void postSetContentsMemoryAllocationLimitBytesToMainThreadOnImplThread(size_t) = 0;
63 };
64
65 // CCLayerTreeHostImpl owns the CCLayerImpl tree as well as associated rendering state
66 class CCLayerTreeHostImpl : public CCInputHandlerClient, CCRendererClient {
67     WTF_MAKE_NONCOPYABLE(CCLayerTreeHostImpl);
68     typedef Vector<CCLayerImpl*> CCLayerList;
69
70 public:
71     static PassOwnPtr<CCLayerTreeHostImpl> create(const CCSettings&, CCLayerTreeHostImplClient*);
72     virtual ~CCLayerTreeHostImpl();
73
74     // CCInputHandlerClient implementation
75     virtual CCInputHandlerClient::ScrollStatus scrollBegin(const IntPoint&, CCInputHandlerClient::ScrollInputType);
76     virtual void scrollBy(const IntSize&);
77     virtual void scrollEnd();
78     virtual void pinchGestureBegin();
79     virtual void pinchGestureUpdate(float, const IntPoint&);
80     virtual void pinchGestureEnd();
81     virtual void startPageScaleAnimation(const IntSize& targetPosition, bool anchorPoint, float pageScale, double startTime, double duration);
82     virtual CCActiveGestureAnimation* activeGestureAnimation() { return m_activeGestureAnimation.get(); }
83     // To clear an active animation, pass nullptr.
84     virtual void setActiveGestureAnimation(PassOwnPtr<CCActiveGestureAnimation>);
85     virtual void scheduleAnimation();
86
87     struct FrameData {
88         CCRenderPassList renderPasses;
89         CCLayerList renderSurfaceLayerList;
90     };
91
92     // Virtual for testing.
93     virtual void beginCommit();
94     virtual void commitComplete();
95     virtual void animate(double monotonicTime, double wallClockTime);
96
97     // Returns false if problems occured preparing the frame, and we should try
98     // to avoid displaying the frame. If prepareToDraw is called,
99     // didDrawAllLayers must also be called, regardless of whether drawLayers is
100     // called between the two.
101     virtual bool prepareToDraw(FrameData&);
102     virtual void drawLayers(const FrameData&);
103     // Must be called if and only if prepareToDraw was called.
104     void didDrawAllLayers(const FrameData&);
105
106     // CCRendererClient implementation
107     virtual const IntSize& deviceViewportSize() const OVERRIDE { return m_deviceViewportSize; }
108     virtual const CCSettings& settings() const OVERRIDE { return m_settings; }
109     virtual void didLoseContext() OVERRIDE;
110     virtual void onSwapBuffersComplete() OVERRIDE;
111     virtual void setFullRootLayerDamage() OVERRIDE;
112     virtual void setContentsMemoryAllocationLimitBytes(size_t) OVERRIDE;
113
114     // Implementation
115     bool canDraw();
116     CCGraphicsContext* context();
117
118     String layerTreeAsText() const;
119     void setFontAtlas(PassOwnPtr<CCFontAtlas>);
120
121     void finishAllRendering();
122     int frameNumber() const { return m_frameNumber; }
123
124     bool initializeLayerRenderer(PassRefPtr<CCGraphicsContext>, TextureUploaderOption);
125     bool isContextLost();
126     CCRenderer* layerRenderer() { return m_layerRenderer.get(); }
127     const LayerRendererCapabilities& layerRendererCapabilities() const;
128     TextureAllocator* contentsTextureAllocator() const;
129
130     bool swapBuffers();
131
132     void readback(void* pixels, const IntRect&);
133
134     void setRootLayer(PassOwnPtr<CCLayerImpl>);
135     PassOwnPtr<CCLayerImpl> releaseRootLayer() { return m_rootLayerImpl.release(); }
136     CCLayerImpl* rootLayer() { return m_rootLayerImpl.get(); }
137
138     CCLayerImpl* scrollLayer() const { return m_scrollLayerImpl; }
139
140     bool visible() const { return m_visible; }
141     void setVisible(bool);
142
143     int sourceFrameNumber() const { return m_sourceFrameNumber; }
144     void setSourceFrameNumber(int frameNumber) { m_sourceFrameNumber = frameNumber; }
145
146     bool sourceFrameCanBeDrawn() const { return m_sourceFrameCanBeDrawn; }
147     void setSourceFrameCanBeDrawn(bool sourceFrameCanBeDrawn) { m_sourceFrameCanBeDrawn = sourceFrameCanBeDrawn; }
148
149     const IntSize& viewportSize() const { return m_viewportSize; }
150     void setViewportSize(const IntSize&);
151
152     float pageScale() const { return m_pageScale; }
153     void setPageScaleFactorAndLimits(float pageScale, float minPageScale, float maxPageScale);
154
155     PassOwnPtr<CCScrollAndScaleSet> processScrollDeltas();
156
157     void startPageScaleAnimation(const IntSize& tragetPosition, bool useAnchor, float scale, double durationSec);
158
159     const Color& backgroundColor() const { return m_backgroundColor; }
160     void setBackgroundColor(const Color& color) { m_backgroundColor = color; }
161
162     bool needsAnimateLayers() const { return m_needsAnimateLayers; }
163     void setNeedsAnimateLayers() { m_needsAnimateLayers = true; }
164
165     void setNeedsRedraw();
166
167     CCFrameRateCounter* fpsCounter() const { return m_fpsCounter.get(); }
168     CCDebugRectHistory* debugRectHistory() const { return m_debugRectHistory.get(); }
169
170 protected:
171     CCLayerTreeHostImpl(const CCSettings&, CCLayerTreeHostImplClient*);
172
173     void animatePageScale(double monotonicTime);
174     void animateGestures(double monotonicTime);
175
176     // Exposed for testing.
177     void calculateRenderSurfaceLayerList(CCLayerList&);
178
179     // Virtual for testing.
180     virtual void animateLayers(double monotonicTime, double wallClockTime);
181
182     // Virtual for testing. Measured in seconds.
183     virtual double lowFrequencyAnimationInterval() const;
184
185     CCLayerTreeHostImplClient* m_client;
186     int m_sourceFrameNumber;
187     int m_frameNumber;
188
189 private:
190     void computeDoubleTapZoomDeltas(CCScrollAndScaleSet* scrollInfo);
191     void computePinchZoomDeltas(CCScrollAndScaleSet* scrollInfo);
192     void makeScrollAndScaleSet(CCScrollAndScaleSet* scrollInfo, const IntSize& scrollOffset, float pageScale);
193
194     void setPageScaleDelta(float);
195     void applyPageScaleDeltaToScrollLayer();
196     void adjustScrollsForPageScaleChange(float);
197     void updateMaxScrollPosition();
198     void trackDamageForAllSurfaces(CCLayerImpl* rootDrawLayer, const CCLayerList& renderSurfaceLayerList);
199
200     // Returns false if the frame should not be displayed. This function should
201     // only be called from prepareToDraw, as didDrawAllLayers must be called
202     // if this helper function is called.
203     bool calculateRenderPasses(CCRenderPassList&, CCLayerList& renderSurfaceLayerList);
204     void animateLayersRecursive(CCLayerImpl*, double monotonicTime, double wallClockTime, CCAnimationEventsVector*, bool& didAnimate, bool& needsAnimateLayers);
205     void setBackgroundTickingEnabled(bool);
206     IntSize contentSize() const;
207     void sendDidLoseContextRecursive(CCLayerImpl*);
208     void clearRenderSurfacesOnCCLayerImplRecursive(CCLayerImpl*);
209
210     void dumpRenderSurfaces(TextStream&, int indent, const CCLayerImpl*) const;
211
212     RefPtr<CCGraphicsContext> m_context;
213     OwnPtr<CCRenderer> m_layerRenderer;
214     OwnPtr<CCLayerImpl> m_rootLayerImpl;
215     CCLayerImpl* m_scrollLayerImpl;
216     CCSettings m_settings;
217     IntSize m_viewportSize;
218     IntSize m_deviceViewportSize;
219     bool m_visible;
220     bool m_sourceFrameCanBeDrawn;
221
222     OwnPtr<CCHeadsUpDisplay> m_headsUpDisplay;
223
224     float m_pageScale;
225     float m_pageScaleDelta;
226     float m_sentPageScaleDelta;
227     float m_minPageScale, m_maxPageScale;
228
229     Color m_backgroundColor;
230
231     // If this is true, it is necessary to traverse the layer tree ticking the animators.
232     bool m_needsAnimateLayers;
233     bool m_pinchGestureActive;
234     IntPoint m_previousPinchAnchor;
235
236     OwnPtr<CCPageScaleAnimation> m_pageScaleAnimation;
237     OwnPtr<CCActiveGestureAnimation> m_activeGestureAnimation;
238
239     // This is used for ticking animations slowly when hidden.
240     OwnPtr<CCLayerTreeHostImplTimeSourceAdapter> m_timeSourceClientAdapter;
241
242     CCLayerSorter m_layerSorter;
243
244     FloatRect m_rootScissorRect;
245
246     OwnPtr<CCFrameRateCounter> m_fpsCounter;
247     OwnPtr<CCDebugRectHistory> m_debugRectHistory;
248 };
249
250 };
251
252 #endif