• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2009 Apple 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. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25 
26 #ifndef RenderLayerCompositor_h
27 #define RenderLayerCompositor_h
28 
29 #include "core/rendering/RenderLayer.h"
30 #include "core/rendering/compositing/CompositingReasonFinder.h"
31 #include "platform/graphics/GraphicsLayerClient.h"
32 #include "wtf/HashMap.h"
33 
34 namespace blink {
35 
36 class DocumentLifecycle;
37 class GraphicsLayer;
38 class GraphicsLayerFactory;
39 class Page;
40 class RenderPart;
41 class ScrollingCoordinator;
42 
43 enum CompositingUpdateType {
44     CompositingUpdateNone,
45     CompositingUpdateAfterGeometryChange,
46     CompositingUpdateAfterCompositingInputChange,
47     CompositingUpdateRebuildTree,
48 };
49 
50 enum CompositingStateTransitionType {
51     NoCompositingStateChange,
52     AllocateOwnCompositedLayerMapping,
53     RemoveOwnCompositedLayerMapping,
54     PutInSquashingLayer,
55     RemoveFromSquashingLayer
56 };
57 
58 // RenderLayerCompositor manages the hierarchy of
59 // composited RenderLayers. It determines which RenderLayers
60 // become compositing, and creates and maintains a hierarchy of
61 // GraphicsLayers based on the RenderLayer painting order.
62 //
63 // There is one RenderLayerCompositor per RenderView.
64 
65 class RenderLayerCompositor FINAL : public GraphicsLayerClient {
66     WTF_MAKE_FAST_ALLOCATED;
67 public:
68     explicit RenderLayerCompositor(RenderView&);
69     virtual ~RenderLayerCompositor();
70 
71     void updateIfNeededRecursive();
72 
73     // Return true if this RenderView is in "compositing mode" (i.e. has one or more
74     // composited RenderLayers)
75     bool inCompositingMode() const;
76     // FIXME: Replace all callers with inCompositingMdoe and remove this function.
77     bool staleInCompositingMode() const;
78     // This will make a compositing layer at the root automatically, and hook up to
79     // the native view/window system.
80     void setCompositingModeEnabled(bool);
81 
82     // Returns true if the accelerated compositing is enabled
hasAcceleratedCompositing()83     bool hasAcceleratedCompositing() const { return m_hasAcceleratedCompositing; }
84     bool layerSquashingEnabled() const;
85 
86     bool preferCompositingToLCDTextEnabled() const;
87 
88     bool rootShouldAlwaysComposite() const;
89 
90     // Copy the accelerated compositing related flags from Settings
91     void updateAcceleratedCompositingSettings();
92 
93     // Used to indicate that a compositing update will be needed for the next frame that gets drawn.
94     void setNeedsCompositingUpdate(CompositingUpdateType);
95 
96     void didLayout();
97 
98     // Whether layer's compositedLayerMapping needs a GraphicsLayer to clip z-order children of the given RenderLayer.
99     bool clipsCompositingDescendants(const RenderLayer*) const;
100 
101     // Whether the given layer needs an extra 'contents' layer.
102     bool needsContentsCompositingLayer(const RenderLayer*) const;
103 
104     bool supportsFixedRootBackgroundCompositing() const;
105     bool needsFixedRootBackgroundLayer(const RenderLayer*) const;
106     GraphicsLayer* fixedRootBackgroundLayer() const;
setNeedsUpdateFixedBackground()107     void setNeedsUpdateFixedBackground() { m_needsUpdateFixedBackground = true; }
108 
109     // Issue paint invalidations of the appropriate layers when the given RenderLayer starts or stops being composited.
110     void paintInvalidationOnCompositingChange(RenderLayer*);
111 
112     void fullyInvalidatePaint();
113 
114     RenderLayer* rootRenderLayer() const;
115     GraphicsLayer* rootGraphicsLayer() const;
116     GraphicsLayer* scrollLayer() const;
117     GraphicsLayer* containerLayer() const;
118 
119     // We don't always have a root transform layer. This function lazily allocates one
120     // and returns it as required.
121     GraphicsLayer* ensureRootTransformLayer();
122 
123     enum RootLayerAttachment {
124         RootLayerUnattached,
125         RootLayerAttachedViaChromeClient,
126         RootLayerAttachedViaEnclosingFrame
127     };
128 
rootLayerAttachment()129     RootLayerAttachment rootLayerAttachment() const { return m_rootLayerAttachment; }
130     void updateRootLayerAttachment();
131     void updateRootLayerPosition();
132 
133     void setIsInWindow(bool);
134 
135     static RenderLayerCompositor* frameContentsCompositor(RenderPart*);
136     // Return true if the layers changed.
137     static bool parentFrameContentLayers(RenderPart*);
138 
139     // Update the geometry of the layers used for clipping and scrolling in frames.
140     void frameViewDidChangeLocation(const IntPoint& contentsOffset);
141     void frameViewDidChangeSize();
142     void frameViewDidScroll();
143     void frameViewScrollbarsExistenceDidChange();
144     void rootFixedBackgroundsChanged();
145 
146     bool scrollingLayerDidChange(RenderLayer*);
147 
148     String layerTreeAsText(LayerTreeFlags);
149 
layerForHorizontalScrollbar()150     GraphicsLayer* layerForHorizontalScrollbar() const { return m_layerForHorizontalScrollbar.get(); }
layerForVerticalScrollbar()151     GraphicsLayer* layerForVerticalScrollbar() const { return m_layerForVerticalScrollbar.get(); }
layerForScrollCorner()152     GraphicsLayer* layerForScrollCorner() const { return m_layerForScrollCorner.get(); }
153 
154     void resetTrackedPaintInvalidationRects();
155     void setTracksPaintInvalidations(bool);
156 
157     virtual String debugName(const GraphicsLayer*) OVERRIDE;
158     DocumentLifecycle& lifecycle() const;
159 
160     void updatePotentialCompositingReasonsFromStyle(RenderLayer*);
161 
162     // Whether the layer could ever be composited.
163     bool canBeComposited(const RenderLayer*) const;
164 
165     // FIXME: Move allocateOrClearCompositedLayerMapping to CompositingLayerAssigner once we've fixed
166     // the compositing chicken/egg issues.
167     bool allocateOrClearCompositedLayerMapping(RenderLayer*, CompositingStateTransitionType compositedLayerUpdate);
168 
169     void updateDirectCompositingReasons(RenderLayer*);
170 
171     void setOverlayLayer(GraphicsLayer*);
172 
inOverlayFullscreenVideo()173     bool inOverlayFullscreenVideo() const { return m_inOverlayFullscreenVideo; }
174 
175 private:
176 #if ENABLE(ASSERT)
177     void assertNoUnresolvedDirtyBits();
178 #endif
179 
180     // GraphicsLayerClient implementation
notifyAnimationStarted(const GraphicsLayer *,double)181     virtual void notifyAnimationStarted(const GraphicsLayer*, double) OVERRIDE { }
182     virtual void paintContents(const GraphicsLayer*, GraphicsContext&, GraphicsLayerPaintingPhase, const IntRect&) OVERRIDE;
183 
184     virtual bool isTrackingPaintInvalidations() const OVERRIDE;
185 
186     void updateWithoutAcceleratedCompositing(CompositingUpdateType);
187     void updateIfNeeded();
188 
189     void ensureRootLayer();
190     void destroyRootLayer();
191 
192     void attachRootLayer(RootLayerAttachment);
193     void detachRootLayer();
194 
195     void updateOverflowControlsLayers();
196 
197     Page* page() const;
198 
199     GraphicsLayerFactory* graphicsLayerFactory() const;
200     ScrollingCoordinator* scrollingCoordinator() const;
201 
202     void enableCompositingModeIfNeeded();
203 
204     bool requiresHorizontalScrollbarLayer() const;
205     bool requiresVerticalScrollbarLayer() const;
206     bool requiresScrollCornerLayer() const;
207 
208     void applyOverlayFullscreenVideoAdjustment();
209 
210     RenderView& m_renderView;
211     OwnPtr<GraphicsLayer> m_rootContentLayer;
212     OwnPtr<GraphicsLayer> m_rootTransformLayer;
213 
214     CompositingReasonFinder m_compositingReasonFinder;
215 
216     CompositingUpdateType m_pendingUpdateType;
217 
218     bool m_hasAcceleratedCompositing;
219     bool m_compositing;
220 
221     // The root layer doesn't composite if it's a non-scrollable frame.
222     // So, after a layout we set this dirty bit to know that we need
223     // to recompute whether the root layer should composite even if
224     // none of its descendants composite.
225     // FIXME: Get rid of all the callers of setCompositingModeEnabled
226     // except the one in updateIfNeeded, then rename this to
227     // m_compositingDirty.
228     bool m_rootShouldAlwaysCompositeDirty;
229     bool m_needsUpdateFixedBackground;
230     bool m_isTrackingPaintInvalidations; // Used for testing.
231 
232     RootLayerAttachment m_rootLayerAttachment;
233 
234     // Enclosing container layer, which clips for iframe content
235     OwnPtr<GraphicsLayer> m_containerLayer;
236     OwnPtr<GraphicsLayer> m_scrollLayer;
237 
238     // Enclosing layer for overflow controls and the clipping layer
239     OwnPtr<GraphicsLayer> m_overflowControlsHostLayer;
240 
241     // Layers for overflow controls
242     OwnPtr<GraphicsLayer> m_layerForHorizontalScrollbar;
243     OwnPtr<GraphicsLayer> m_layerForVerticalScrollbar;
244     OwnPtr<GraphicsLayer> m_layerForScrollCorner;
245 #if USE(RUBBER_BANDING)
246     OwnPtr<GraphicsLayer> m_layerForOverhangShadow;
247 #endif
248 
249     bool m_inOverlayFullscreenVideo;
250 };
251 
252 } // namespace blink
253 
254 #endif // RenderLayerCompositor_h
255