46191f1bc10079723e9488d685127f57708e377c
[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         CCLayerList willDrawLayers;
91     };
92
93     // Virtual for testing.
94     virtual void beginCommit();
95     virtual void commitComplete();
96     virtual void animate(double monotonicTime, double wallClockTime);
97
98     // Returns false if problems occured preparing the frame, and we should try
99     // to avoid displaying the frame. If prepareToDraw is called,
100     // didDrawAllLayers must also be called, regardless of whether drawLayers is
101     // called between the two.
102     virtual bool prepareToDraw(FrameData&);
103     virtual void drawLayers(const FrameData&);
104     // Must be called if and only if prepareToDraw was called.
105     void didDrawAllLayers(const FrameData&);
106
107     // CCRendererClient implementation
108     virtual const IntSize& deviceViewportSize() const OVERRIDE { return m_deviceViewportSize; }
109     virtual const CCSettings& settings() const OVERRIDE { return m_settings; }
110     virtual void didLoseContext() OVERRIDE;
111     virtual void onSwapBuffersComplete() OVERRIDE;
112     virtual void setFullRootLayerDamage() OVERRIDE;
113     virtual void setContentsMemoryAllocationLimitBytes(size_t) OVERRIDE;
114
115     // Implementation
116     bool canDraw();
117     CCGraphicsContext* context();
118
119     String layerTreeAsText() const;
120     void setFontAtlas(PassOwnPtr<CCFontAtlas>);
121
122     void finishAllRendering();
123     int frameNumber() const { return m_frameNumber; }
124
125     bool initializeLayerRenderer(PassRefPtr<CCGraphicsContext>, TextureUploaderOption);
126     bool isContextLost();
127     CCRenderer* layerRenderer() { return m_layerRenderer.get(); }
128     const LayerRendererCapabilities& layerRendererCapabilities() const;
129     TextureAllocator* contentsTextureAllocator() const;
130
131     bool swapBuffers();
132
133     void readback(void* pixels, const IntRect&);
134
135     void setRootLayer(PassOwnPtr<CCLayerImpl>);
136     PassOwnPtr<CCLayerImpl> releaseRootLayer() { return m_rootLayerImpl.release(); }
137     CCLayerImpl* rootLayer() { return m_rootLayerImpl.get(); }
138
139     CCLayerImpl* scrollLayer() const { return m_scrollLayerImpl; }
140
141     bool visible() const { return m_visible; }
142     void setVisible(bool);
143
144     int sourceFrameNumber() const { return m_sourceFrameNumber; }
145     void setSourceFrameNumber(int frameNumber) { m_sourceFrameNumber = frameNumber; }
146
147     bool sourceFrameCanBeDrawn() const { return m_sourceFrameCanBeDrawn; }
148     void setSourceFrameCanBeDrawn(bool sourceFrameCanBeDrawn) { m_sourceFrameCanBeDrawn = sourceFrameCanBeDrawn; }
149
150     const IntSize& viewportSize() const { return m_viewportSize; }
151     void setViewportSize(const IntSize&);
152
153     float pageScale() const { return m_pageScale; }
154     void setPageScaleFactorAndLimits(float pageScale, float minPageScale, float maxPageScale);
155
156     PassOwnPtr<CCScrollAndScaleSet> processScrollDeltas();
157
158     void startPageScaleAnimation(const IntSize& tragetPosition, bool useAnchor, float scale, double durationSec);
159
160     const Color& backgroundColor() const { return m_backgroundColor; }
161     void setBackgroundColor(const Color& color) { m_backgroundColor = color; }
162
163     bool needsAnimateLayers() const { return m_needsAnimateLayers; }
164     void setNeedsAnimateLayers() { m_needsAnimateLayers = true; }
165
166     void setNeedsRedraw();
167
168     CCFrameRateCounter* fpsCounter() const { return m_fpsCounter.get(); }
169     CCDebugRectHistory* debugRectHistory() const { return m_debugRectHistory.get(); }
170
171 protected:
172     CCLayerTreeHostImpl(const CCSettings&, CCLayerTreeHostImplClient*);
173
174     void animatePageScale(double monotonicTime);
175     void animateGestures(double monotonicTime);
176
177     // Exposed for testing.
178     void calculateRenderSurfaceLayerList(CCLayerList&);
179
180     // Virtual for testing.
181     virtual void animateLayers(double monotonicTime, double wallClockTime);
182
183     // Virtual for testing. Measured in seconds.
184     virtual double lowFrequencyAnimationInterval() const;
185
186     CCLayerTreeHostImplClient* m_client;
187     int m_sourceFrameNumber;
188     int m_frameNumber;
189
190 private:
191     void computeDoubleTapZoomDeltas(CCScrollAndScaleSet* scrollInfo);
192     void computePinchZoomDeltas(CCScrollAndScaleSet* scrollInfo);
193     void makeScrollAndScaleSet(CCScrollAndScaleSet* scrollInfo, const IntSize& scrollOffset, float pageScale);
194
195     void setPageScaleDelta(float);
196     void applyPageScaleDeltaToScrollLayer();
197     void adjustScrollsForPageScaleChange(float);
198     void updateMaxScrollPosition();
199     void trackDamageForAllSurfaces(CCLayerImpl* rootDrawLayer, const CCLayerList& renderSurfaceLayerList);
200
201     // Returns false if the frame should not be displayed. This function should
202     // only be called from prepareToDraw, as didDrawAllLayers must be called
203     // if this helper function is called.
204     bool calculateRenderPasses(CCRenderPassList&, CCLayerList& renderSurfaceLayerList, CCLayerList& willDrawLayers);
205     void animateLayersRecursive(CCLayerImpl*, double monotonicTime, double wallClockTime, CCAnimationEventsVector*, bool& didAnimate, bool& needsAnimateLayers);
206     void setBackgroundTickingEnabled(bool);
207     IntSize contentSize() const;
208     void sendDidLoseContextRecursive(CCLayerImpl*);
209     void clearRenderSurfacesOnCCLayerImplRecursive(CCLayerImpl*);
210
211     void dumpRenderSurfaces(TextStream&, int indent, const CCLayerImpl*) const;
212
213     RefPtr<CCGraphicsContext> m_context;
214     OwnPtr<CCRenderer> m_layerRenderer;
215     OwnPtr<CCLayerImpl> m_rootLayerImpl;
216     CCLayerImpl* m_scrollLayerImpl;
217     CCSettings m_settings;
218     IntSize m_viewportSize;
219     IntSize m_deviceViewportSize;
220     bool m_visible;
221     bool m_sourceFrameCanBeDrawn;
222
223     OwnPtr<CCHeadsUpDisplay> m_headsUpDisplay;
224
225     float m_pageScale;
226     float m_pageScaleDelta;
227     float m_sentPageScaleDelta;
228     float m_minPageScale, m_maxPageScale;
229
230     Color m_backgroundColor;
231
232     // If this is true, it is necessary to traverse the layer tree ticking the animators.
233     bool m_needsAnimateLayers;
234     bool m_pinchGestureActive;
235     IntPoint m_previousPinchAnchor;
236
237     OwnPtr<CCPageScaleAnimation> m_pageScaleAnimation;
238     OwnPtr<CCActiveGestureAnimation> m_activeGestureAnimation;
239
240     // This is used for ticking animations slowly when hidden.
241     OwnPtr<CCLayerTreeHostImplTimeSourceAdapter> m_timeSourceClientAdapter;
242
243     CCLayerSorter m_layerSorter;
244
245     FloatRect m_rootScissorRect;
246
247     OwnPtr<CCFrameRateCounter> m_fpsCounter;
248     OwnPtr<CCDebugRectHistory> m_debugRectHistory;
249 };
250
251 };
252
253 #endif