Diff
Modified: trunk/LayoutTests/ChangeLog (114282 => 114283)
--- trunk/LayoutTests/ChangeLog 2012-04-16 18:27:42 UTC (rev 114282)
+++ trunk/LayoutTests/ChangeLog 2012-04-16 18:32:13 UTC (rev 114283)
@@ -1,3 +1,25 @@
+2012-04-13 Simon Fraser <simon.fra...@apple.com>
+
+ Avoid using backing store for compositing layers that just need to clip
+ https://bugs.webkit.org/show_bug.cgi?id=40547
+
+ Reviewed by Dean Jackson.
+
+ New tests for backing store elimination with clip or perspective.
+
+ New results for some tests that no longer have backing store on some
+ layers.
+
+ * compositing/backing/no-backing-for-clip-expected.txt: Added.
+ * compositing/backing/no-backing-for-clip-overlap-expected.txt: Added.
+ * compositing/backing/no-backing-for-clip-overlap.html: Added.
+ * compositing/backing/no-backing-for-clip.html: Added.
+ * compositing/backing/no-backing-for-perspective-expected.txt: Added.
+ * compositing/backing/no-backing-for-perspective.html: Added.
+ * compositing/geometry/preserve-3d-switching-expected.txt:
+ * compositing/visibility/layer-visible-content-expected.png:
+ * compositing/visibility/layer-visible-content-expected.txt:
+
2012-04-16 Vincent Scheib <sch...@chromium.org>
[Chromium] Marking css3/filters/huge-region.html and composited version MISSING, CRASH.
Added: trunk/LayoutTests/compositing/backing/no-backing-for-clip-expected.txt (0 => 114283)
--- trunk/LayoutTests/compositing/backing/no-backing-for-clip-expected.txt (rev 0)
+++ trunk/LayoutTests/compositing/backing/no-backing-for-clip-expected.txt 2012-04-16 18:32:13 UTC (rev 114283)
@@ -0,0 +1,42 @@
+This layer should not have backing store.
+This layer should not have backing store.
+(GraphicsLayer
+ (bounds 800.00 600.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 800.00 600.00)
+ (children 1
+ (GraphicsLayer
+ (position 8.00 8.00)
+ (bounds 342.00 240.00)
+ (children 1
+ (GraphicsLayer
+ (position 1.00 1.00)
+ (bounds 340.00 238.00)
+ (children 1
+ (GraphicsLayer
+ (position 20.00 38.00)
+ (bounds 320.00 180.00)
+ (children 1
+ (GraphicsLayer
+ (position 1.00 1.00)
+ (bounds 340.00 178.00)
+ (children 1
+ (GraphicsLayer
+ (position 30.00 48.00)
+ (bounds 100.00 100.00)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+)
+
Property changes on: trunk/LayoutTests/compositing/backing/no-backing-for-clip-expected.txt
___________________________________________________________________
Added: svn:mime-type
Added: svn:keywords
Added: svn:eol-style
Added: trunk/LayoutTests/compositing/backing/no-backing-for-clip-overlap-expected.txt (0 => 114283)
--- trunk/LayoutTests/compositing/backing/no-backing-for-clip-overlap-expected.txt (rev 0)
+++ trunk/LayoutTests/compositing/backing/no-backing-for-clip-overlap-expected.txt 2012-04-16 18:32:13 UTC (rev 114283)
@@ -0,0 +1,48 @@
+This layer should not have backing store.
+This layer should have backing store.
+(GraphicsLayer
+ (bounds 800.00 600.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 800.00 600.00)
+ (children 2
+ (GraphicsLayer
+ (position 8.00 8.00)
+ (bounds 342.00 180.00)
+ (children 1
+ (GraphicsLayer
+ (position 1.00 1.00)
+ (bounds 340.00 178.00)
+ (children 1
+ (GraphicsLayer
+ (position 30.00 48.00)
+ (bounds 100.00 100.00)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ (GraphicsLayer
+ (position 8.00 178.00)
+ (bounds 342.00 180.00)
+ (drawsContent 1)
+ (children 1
+ (GraphicsLayer
+ (position 1.00 1.00)
+ (bounds 340.00 178.00)
+ (children 1
+ (GraphicsLayer
+ (position 30.00 48.00)
+ (bounds 100.00 100.00)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+)
+
Property changes on: trunk/LayoutTests/compositing/backing/no-backing-for-clip-overlap-expected.txt
___________________________________________________________________
Added: svn:mime-type
Added: svn:keywords
Added: svn:eol-style
Added: trunk/LayoutTests/compositing/backing/no-backing-for-clip-overlap.html (0 => 114283)
--- trunk/LayoutTests/compositing/backing/no-backing-for-clip-overlap.html (rev 0)
+++ trunk/LayoutTests/compositing/backing/no-backing-for-clip-overlap.html 2012-04-16 18:32:13 UTC (rev 114283)
@@ -0,0 +1,59 @@
+<!DOCTYPE html>
+
+<html>
+<head>
+ <style type="text/css" media="screen">
+ .box {
+ position: relative;
+ height: 100px;
+ width: 100px;
+ margin: 10px;
+ left: 0;
+ top: 0;
+ background-color: silver;
+ }
+
+ .clipping {
+ position: relative;
+ z-index: 0;
+ width: 300px;
+ border: 1px solid black;
+ padding: 20px;
+ overflow: hidden;
+ }
+
+ .composited {
+ -webkit-transform: translateZ(0);
+ }
+ </style>
+
+ <script>
+ if (window.layoutTestController)
+ layoutTestController.dumpAsText();
+
+ function dumpLayers()
+ {
+ var layersResult = document.getElementById('layers');
+ if (window.layoutTestController)
+ layersResult.innerText = layoutTestController.layerTreeAsText();
+
+ }
+ window.addEventListener('load', dumpLayers, false)
+ </script>
+
+</head>
+<body>
+
+ <div class="clipping">
+ This layer should not have backing store.
+ <div class="box composited"></div>
+ </div>
+ <div class="clipping" style="margin-top: -10px;">
+ This layer should have backing store.
+ <div class="box composited"></div>
+ </div>
+
+<pre id="layers">Layer tree goes here in DRT</pre>
+
+</body>
+</html>
Property changes on: trunk/LayoutTests/compositing/backing/no-backing-for-clip-overlap.html
___________________________________________________________________
Added: svn:mime-type
Added: svn:keywords
Added: svn:eol-style
Added: trunk/LayoutTests/compositing/backing/no-backing-for-clip.html (0 => 114283)
--- trunk/LayoutTests/compositing/backing/no-backing-for-clip.html (rev 0)
+++ trunk/LayoutTests/compositing/backing/no-backing-for-clip.html 2012-04-16 18:32:13 UTC (rev 114283)
@@ -0,0 +1,59 @@
+<!DOCTYPE html>
+
+<html>
+<head>
+ <style type="text/css" media="screen">
+ .box {
+ position: relative;
+ height: 100px;
+ width: 100px;
+ margin: 10px;
+ left: 0;
+ top: 0;
+ background-color: silver;
+ }
+
+ .clipping {
+ position: relative;
+ z-index: 0;
+ width: 300px;
+ border: 1px solid black;
+ padding: 20px;
+ overflow: hidden;
+ }
+
+ .composited {
+ -webkit-transform: translateZ(0);
+ }
+ </style>
+
+ <script>
+ if (window.layoutTestController)
+ layoutTestController.dumpAsText();
+
+ function dumpLayers()
+ {
+ var layersResult = document.getElementById('layers');
+ if (window.layoutTestController)
+ layersResult.innerText = layoutTestController.layerTreeAsText();
+
+ }
+ window.addEventListener('load', dumpLayers, false)
+ </script>
+
+</head>
+<body>
+
+ <div class="clipping">
+ This layer should not have backing store.
+ <div class="clipping">
+ This layer should not have backing store.
+ <div class="box composited">
+ </div>
+ </div>
+ </div>
+
+<pre id="layers">Layer tree goes here in DRT</pre>
+
+</body>
+</html>
Property changes on: trunk/LayoutTests/compositing/backing/no-backing-for-clip.html
___________________________________________________________________
Added: svn:mime-type
Added: svn:keywords
Added: svn:eol-style
Added: trunk/LayoutTests/compositing/backing/no-backing-for-perspective-expected.txt (0 => 114283)
--- trunk/LayoutTests/compositing/backing/no-backing-for-perspective-expected.txt (rev 0)
+++ trunk/LayoutTests/compositing/backing/no-backing-for-perspective-expected.txt 2012-04-16 18:32:13 UTC (rev 114283)
@@ -0,0 +1,32 @@
+This layer should not have backing store.
+This layer should not have backing store.
+(GraphicsLayer
+ (bounds 800.00 600.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 800.00 600.00)
+ (children 1
+ (GraphicsLayer
+ (position 8.00 8.00)
+ (bounds 342.00 240.00)
+ (childrenTransform [1.00 0.00 0.00 0.00] [0.00 1.00 0.00 0.00] [0.00 0.00 1.00 -0.00] [0.00 0.00 0.00 1.00])
+ (children 1
+ (GraphicsLayer
+ (position 21.00 39.00)
+ (bounds 342.00 180.00)
+ (childrenTransform [1.00 0.00 0.00 0.00] [0.00 1.00 0.00 0.00] [0.00 0.00 1.00 -0.00] [0.00 0.00 0.00 1.00])
+ (children 1
+ (GraphicsLayer
+ (position 31.00 49.00)
+ (bounds 100.00 100.00)
+ (drawsContent 1)
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+)
+
Property changes on: trunk/LayoutTests/compositing/backing/no-backing-for-perspective-expected.txt
___________________________________________________________________
Added: svn:mime-type
Added: svn:keywords
Added: svn:eol-style
Added: trunk/LayoutTests/compositing/backing/no-backing-for-perspective.html (0 => 114283)
--- trunk/LayoutTests/compositing/backing/no-backing-for-perspective.html (rev 0)
+++ trunk/LayoutTests/compositing/backing/no-backing-for-perspective.html 2012-04-16 18:32:13 UTC (rev 114283)
@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+
+<html>
+<head>
+ <style type="text/css" media="screen">
+ .box {
+ position: relative;
+ height: 100px;
+ width: 100px;
+ margin: 10px;
+ left: 0;
+ top: 0;
+ background-color: silver;
+ }
+
+ .perspective {
+ width: 300px;
+ border: 1px solid black;
+ padding: 20px;
+ -webkit-perspective: 500px;
+ }
+
+ .composited {
+ -webkit-transform: translateZ(0);
+ }
+ </style>
+
+ <script>
+ if (window.layoutTestController)
+ layoutTestController.dumpAsText();
+
+ function dumpLayers()
+ {
+ var layersResult = document.getElementById('layers');
+ if (window.layoutTestController)
+ layersResult.innerText = layoutTestController.layerTreeAsText();
+
+ }
+ window.addEventListener('load', dumpLayers, false)
+ </script>
+
+</head>
+<body>
+
+ <div class="perspective">
+ This layer should not have backing store.
+ <div class="perspective">
+ This layer should not have backing store.
+ <div class="box composited">
+ </div>
+ </div>
+ </div>
+
+<pre id="layers">Layer tree goes here in DRT</pre>
+
+</body>
+</html>
Property changes on: trunk/LayoutTests/compositing/backing/no-backing-for-perspective.html
___________________________________________________________________
Added: svn:mime-type
Added: svn:keywords
Added: svn:eol-style
Modified: trunk/LayoutTests/compositing/geometry/preserve-3d-switching-expected.txt (114282 => 114283)
--- trunk/LayoutTests/compositing/geometry/preserve-3d-switching-expected.txt 2012-04-16 18:27:42 UTC (rev 114282)
+++ trunk/LayoutTests/compositing/geometry/preserve-3d-switching-expected.txt 2012-04-16 18:32:13 UTC (rev 114283)
@@ -10,7 +10,6 @@
(GraphicsLayer
(position 108.00 73.00)
(bounds 304.00 304.00)
- (drawsContent 1)
(childrenTransform [1.00 0.00 0.00 0.00] [0.00 1.00 0.00 0.00] [0.00 0.00 1.00 -0.00] [0.00 0.00 0.00 1.00])
(children 1
(GraphicsLayer
Modified: trunk/LayoutTests/compositing/visibility/layer-visible-content-expected.png
(Binary files differ)
Modified: trunk/LayoutTests/compositing/visibility/layer-visible-content-expected.txt (114282 => 114283)
--- trunk/LayoutTests/compositing/visibility/layer-visible-content-expected.txt 2012-04-16 18:27:42 UTC (rev 114282)
+++ trunk/LayoutTests/compositing/visibility/layer-visible-content-expected.txt 2012-04-16 18:32:13 UTC (rev 114283)
@@ -6,7 +6,6 @@
(children 2
(GraphicsLayer
(bounds 200.00 200.00)
- (drawsContent 1)
(children 1
(GraphicsLayer
(bounds 200.00 200.00)
Modified: trunk/Source/WebCore/ChangeLog (114282 => 114283)
--- trunk/Source/WebCore/ChangeLog 2012-04-16 18:27:42 UTC (rev 114282)
+++ trunk/Source/WebCore/ChangeLog 2012-04-16 18:32:13 UTC (rev 114283)
@@ -1,3 +1,53 @@
+2012-04-13 Simon Fraser <simon.fra...@apple.com>
+
+ Avoid using backing store for compositing layers that just need to clip
+ https://bugs.webkit.org/show_bug.cgi?id=40547
+
+ Reviewed by Dean Jackson.
+
+ If a layer becomes composited because it needs to clip composited
+ descendants, or if it has perspective, then it doesn't actually
+ needs its own backing store; its contents can be painted by an
+ ancestor, and we can just have an empty layer that does the clipping
+ or applies the perspective transform.
+
+ This saves backing store memory on some pages.
+
+ Tests: compositing/backing/no-backing-for-clip-overlap.html
+ compositing/backing/no-backing-for-clip.html
+ compositing/backing/no-backing-for-perspective.html
+
+ * rendering/RenderLayer.cpp:
+ (WebCore):
+ (WebCore::RenderLayer::enclosingCompositingLayerForRepaint):
+ (WebCore::RenderLayer::paintLayer):
+ * rendering/RenderLayer.h:
+ (RenderLayer):
+ * rendering/RenderLayerBacking.cpp:
+ (WebCore::RenderLayerBacking::RenderLayerBacking):
+ (WebCore::RenderLayerBacking::updateGraphicsLayerGeometry):
+ (WebCore::RenderLayerBacking::containsPaintedContent):
+ (WebCore::RenderLayerBacking::setContentsNeedDisplay):
+ (WebCore::RenderLayerBacking::setContentsNeedDisplayInRect):
+ (WebCore::RenderLayerBacking::paintIntoLayer):
+ * rendering/RenderLayerBacking.h:
+ (RenderLayerBacking):
+ (WebCore::RenderLayerBacking::paintsIntoCompositedAncestor):
+ (WebCore::RenderLayerBacking::setRequiresOwnBackingStore):
+ * rendering/RenderLayerCompositor.cpp:
+ (WebCore::RenderLayerCompositor::layerWillBeRemoved):
+ (WebCore::RenderLayerCompositor::recursiveRepaintLayerRect):
+ (WebCore::RenderLayerCompositor::requiresCompositingLayer):
+ (WebCore::RenderLayerCompositor::requiresOwnBackingStore):
+ (WebCore):
+ * rendering/RenderLayerCompositor.h:
+ * rendering/RenderObject.cpp:
+ (WebCore::RenderObject::containerForRepaint):
+ * rendering/RenderTreeAsText.cpp:
+ (WebCore::write):
+ * rendering/RenderView.cpp:
+ (WebCore::RenderView::paintBoxDecorations):
+
2012-04-16 Brady Eidson <beid...@apple.com>
<rdar://problem/11249336> and https://bugs.webkit.org/show_bug.cgi?id=84050
Modified: trunk/Source/WebCore/rendering/RenderLayer.cpp (114282 => 114283)
--- trunk/Source/WebCore/rendering/RenderLayer.cpp 2012-04-16 18:27:42 UTC (rev 114282)
+++ trunk/Source/WebCore/rendering/RenderLayer.cpp 2012-04-16 18:32:13 UTC (rev 114283)
@@ -959,6 +959,19 @@
return 0;
}
+
+RenderLayer* RenderLayer::enclosingCompositingLayerForRepaint(bool includeSelf) const
+{
+ if (includeSelf && isComposited() && !backing()->paintsIntoCompositedAncestor())
+ return const_cast<RenderLayer*>(this);
+
+ for (const RenderLayer* curr = compositingContainer(this); curr; curr = compositingContainer(curr)) {
+ if (curr->isComposited() && !curr->backing()->paintsIntoCompositedAncestor())
+ return const_cast<RenderLayer*>(curr);
+ }
+
+ return 0;
+}
#endif
#if ENABLE(CSS_FILTERS)
@@ -2857,7 +2870,7 @@
// but we need to ensure that we don't cache clip rects computed with the wrong root in this case.
if (context->updatingControlTints() || (paintBehavior & PaintBehaviorFlattenCompositingLayers))
paintFlags |= PaintLayerTemporaryClipRects;
- else if (!backing()->paintsIntoWindow() && !shouldDoSoftwarePaint(this, paintFlags & PaintLayerPaintingReflection)) {
+ else if (!backing()->paintsIntoWindow() && !backing()->paintsIntoCompositedAncestor() && !shouldDoSoftwarePaint(this, paintFlags & PaintLayerPaintingReflection)) {
// If this RenderLayer should paint into its backing, that will be done via RenderLayerBacking::paintIntoLayer().
return;
}
Modified: trunk/Source/WebCore/rendering/RenderLayer.h (114282 => 114283)
--- trunk/Source/WebCore/rendering/RenderLayer.h 2012-04-16 18:27:42 UTC (rev 114282)
+++ trunk/Source/WebCore/rendering/RenderLayer.h 2012-04-16 18:32:13 UTC (rev 114283)
@@ -420,6 +420,7 @@
#if USE(ACCELERATED_COMPOSITING)
// Enclosing compositing layer; if includeSelf is true, may return this.
RenderLayer* enclosingCompositingLayer(bool includeSelf = true) const;
+ RenderLayer* enclosingCompositingLayerForRepaint(bool includeSelf = true) const;
// Ancestor compositing layer, excluding this.
RenderLayer* ancestorCompositingLayer() const { return enclosingCompositingLayer(false); }
#endif
Modified: trunk/Source/WebCore/rendering/RenderLayerBacking.cpp (114282 => 114283)
--- trunk/Source/WebCore/rendering/RenderLayerBacking.cpp 2012-04-16 18:27:42 UTC (rev 114282)
+++ trunk/Source/WebCore/rendering/RenderLayerBacking.cpp 2012-04-16 18:32:13 UTC (rev 114283)
@@ -92,6 +92,7 @@
, m_artificiallyInflatedBounds(false)
, m_isMainFrameRenderViewLayer(false)
, m_usingTiledCacheLayer(false)
+ , m_requiresOwnBackingStore(true)
#if ENABLE(CSS_FILTERS)
, m_canCompositeFilters(false)
#endif
@@ -563,6 +564,10 @@
}
m_graphicsLayer->setContentsRect(contentsBox());
+
+ // If this layer was created just for clipping or to apply perspective, it doesn't need its own backing store.
+ setRequiresOwnBackingStore(compositor()->requiresOwnBackingStore(m_owningLayer, compAncestor));
+
updateDrawsContent();
updateAfterWidgetResize();
}
@@ -937,7 +942,7 @@
bool RenderLayerBacking::containsPaintedContent() const
{
- if (isSimpleContainerCompositingLayer() || paintsIntoWindow() || m_artificiallyInflatedBounds || m_owningLayer->isReflection())
+ if (isSimpleContainerCompositingLayer() || paintsIntoWindow() || paintsIntoCompositedAncestor() || m_artificiallyInflatedBounds || m_owningLayer->isReflection())
return false;
if (isDirectlyCompositedImage())
@@ -1095,6 +1100,8 @@
void RenderLayerBacking::setContentsNeedDisplay()
{
+ ASSERT(!paintsIntoCompositedAncestor());
+
if (m_graphicsLayer && m_graphicsLayer->drawsContent())
m_graphicsLayer->setNeedsDisplay();
@@ -1108,6 +1115,8 @@
// r is in the coordinate space of the layer's render object
void RenderLayerBacking::setContentsNeedDisplayInRect(const IntRect& r)
{
+ ASSERT(!paintsIntoCompositedAncestor());
+
if (m_graphicsLayer && m_graphicsLayer->drawsContent()) {
IntRect layerDirtyRect = r;
layerDirtyRect.move(-m_graphicsLayer->offsetFromRenderer());
@@ -1132,7 +1141,7 @@
PaintBehavior paintBehavior, GraphicsLayerPaintingPhase paintingPhase,
RenderObject* paintingRoot)
{
- if (paintsIntoWindow()) {
+ if (paintsIntoWindow() || paintsIntoCompositedAncestor()) {
ASSERT_NOT_REACHED();
return;
}
Modified: trunk/Source/WebCore/rendering/RenderLayerBacking.h (114282 => 114283)
--- trunk/Source/WebCore/rendering/RenderLayerBacking.h 2012-04-16 18:27:42 UTC (rev 114282)
+++ trunk/Source/WebCore/rendering/RenderLayerBacking.h 2012-04-16 18:32:13 UTC (rev 114283)
@@ -96,7 +96,13 @@
// This returns false for other layers, and when the document layer actually needs to paint into its backing store
// for some reason.
bool paintsIntoWindow() const;
+
+ // Returns true for a composited layer that has no backing store of its own, so
+ // paints into some ancestor layer.
+ bool paintsIntoCompositedAncestor() const { return !m_requiresOwnBackingStore; }
+ void setRequiresOwnBackingStore(bool flag) { m_requiresOwnBackingStore = flag; }
+
void setContentsNeedDisplay();
// r is in the coordinate space of the layer's render object
void setContentsNeedDisplayInRect(const IntRect&);
@@ -235,6 +241,7 @@
bool m_artificiallyInflatedBounds; // bounds had to be made non-zero to make transform-origin work
bool m_isMainFrameRenderViewLayer;
bool m_usingTiledCacheLayer;
+ bool m_requiresOwnBackingStore;
#if ENABLE(CSS_FILTERS)
bool m_canCompositeFilters;
#endif
Modified: trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp (114282 => 114283)
--- trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp 2012-04-16 18:27:42 UTC (rev 114282)
+++ trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp 2012-04-16 18:32:13 UTC (rev 114283)
@@ -525,7 +525,7 @@
setCompositingParent(child, 0);
- RenderLayer* compLayer = parent->enclosingCompositingLayer();
+ RenderLayer* compLayer = parent->enclosingCompositingLayerForRepaint();
if (compLayer) {
ASSERT(compLayer->backing());
LayoutRect compBounds = child->backing()->compositedBounds();
@@ -1130,7 +1130,7 @@
void RenderLayerCompositor::recursiveRepaintLayerRect(RenderLayer* layer, const IntRect& rect)
{
// FIXME: This method does not work correctly with transforms.
- if (layer->isComposited())
+ if (layer->isComposited() && !layer->backing()->paintsIntoCompositedAncestor())
layer->setBackingNeedsRepaintInRect(rect);
#if !ASSERT_DISABLED
@@ -1325,15 +1325,15 @@
}
// The root layer always has a compositing layer, but it may not have backing.
return requiresCompositingForTransform(renderer)
- || requiresCompositingForVideo(renderer)
- || requiresCompositingForCanvas(renderer)
- || requiresCompositingForPlugin(renderer)
- || requiresCompositingForFrame(renderer)
- || (canRender3DTransforms() && renderer->style()->backfaceVisibility() == BackfaceVisibilityHidden)
- || clipsCompositingDescendants(layer)
- || requiresCompositingForAnimation(renderer)
- || requiresCompositingForFilters(renderer)
- || requiresCompositingForPosition(renderer, layer);
+ || requiresCompositingForVideo(renderer)
+ || requiresCompositingForCanvas(renderer)
+ || requiresCompositingForPlugin(renderer)
+ || requiresCompositingForFrame(renderer)
+ || (canRender3DTransforms() && renderer->style()->backfaceVisibility() == BackfaceVisibilityHidden)
+ || clipsCompositingDescendants(layer)
+ || requiresCompositingForAnimation(renderer)
+ || requiresCompositingForFilters(renderer)
+ || requiresCompositingForPosition(renderer, layer);
}
bool RenderLayerCompositor::canBeComposited(const RenderLayer* layer) const
@@ -1341,6 +1341,32 @@
return m_hasAcceleratedCompositing && layer->isSelfPaintingLayer();
}
+bool RenderLayerCompositor::requiresOwnBackingStore(const RenderLayer* layer, const RenderLayer* compositingAncestorLayer) const
+{
+ RenderObject* renderer = layer->renderer();
+ if (compositingAncestorLayer
+ && !(compositingAncestorLayer->backing()->graphicsLayer()->drawsContent()
+ || compositingAncestorLayer->backing()->paintsIntoWindow()
+ || compositingAncestorLayer->backing()->paintsIntoCompositedAncestor()))
+ return true;
+
+ return layer->isRootLayer()
+ || layer->transform() // note: excludes perspective and transformStyle3D.
+ || requiresCompositingForVideo(renderer)
+ || requiresCompositingForCanvas(renderer)
+ || requiresCompositingForPlugin(renderer)
+ || requiresCompositingForFrame(renderer)
+ || (canRender3DTransforms() && renderer->style()->backfaceVisibility() == BackfaceVisibilityHidden)
+ || requiresCompositingForAnimation(renderer)
+ || requiresCompositingForFilters(renderer)
+ || requiresCompositingForPosition(renderer, layer)
+ || renderer->isTransparent()
+ || renderer->hasMask()
+ || renderer->hasReflection()
+ || renderer->hasFilter()
+ || layer->mustOverlapCompositedLayers();
+}
+
// Return true if the given layer has some ancestor in the RenderLayer hierarchy that clips,
// up to the enclosing compositing ancestor. This is required because compositing layers are parented
// according to the z-order hierarchy, yet clipping goes down the renderer hierarchy.
Modified: trunk/Source/WebCore/rendering/RenderLayerCompositor.h (114282 => 114283)
--- trunk/Source/WebCore/rendering/RenderLayerCompositor.h 2012-04-16 18:27:42 UTC (rev 114282)
+++ trunk/Source/WebCore/rendering/RenderLayerCompositor.h 2012-04-16 18:32:13 UTC (rev 114283)
@@ -136,6 +136,9 @@
// Repaint parts of all composited layers that intersect the given absolute rectangle.
void repaintCompositedLayersAbsoluteRect(const IntRect&);
+ // Returns true if the given layer needs it own backing store.
+ bool requiresOwnBackingStore(const RenderLayer*, const RenderLayer* compositingAncestorLayer) const;
+
RenderLayer* rootRenderLayer() const;
GraphicsLayer* rootGraphicsLayer() const;
GraphicsLayer* scrollLayer() const;
Modified: trunk/Source/WebCore/rendering/RenderObject.cpp (114282 => 114283)
--- trunk/Source/WebCore/rendering/RenderObject.cpp 2012-04-16 18:27:42 UTC (rev 114282)
+++ trunk/Source/WebCore/rendering/RenderObject.cpp 2012-04-16 18:32:13 UTC (rev 114283)
@@ -1243,7 +1243,7 @@
#if USE(ACCELERATED_COMPOSITING)
if (v->usesCompositing()) {
- RenderLayer* compLayer = enclosingLayer()->enclosingCompositingLayer();
+ RenderLayer* compLayer = enclosingLayer()->enclosingCompositingLayerForRepaint();
if (compLayer)
repaintContainer = compLayer->renderer();
}
Modified: trunk/Source/WebCore/rendering/RenderTreeAsText.cpp (114282 => 114283)
--- trunk/Source/WebCore/rendering/RenderTreeAsText.cpp 2012-04-16 18:27:42 UTC (rev 114282)
+++ trunk/Source/WebCore/rendering/RenderTreeAsText.cpp 2012-04-16 18:32:13 UTC (rev 114283)
@@ -631,7 +631,7 @@
#if USE(ACCELERATED_COMPOSITING)
if (behavior & RenderAsTextShowCompositedLayers) {
if (l.isComposited())
- ts << " (composited, bounds " << l.backing()->compositedBounds() << ")";
+ ts << " (composited, bounds=" << l.backing()->compositedBounds() << ", drawsContent=" << l.backing()->graphicsLayer()->drawsContent() << ", paints into ancestor=" << l.backing()->paintsIntoCompositedAncestor() << ")";
}
#else
UNUSED_PARAM(behavior);
Modified: trunk/Source/WebCore/rendering/RenderView.cpp (114282 => 114283)
--- trunk/Source/WebCore/rendering/RenderView.cpp 2012-04-16 18:27:42 UTC (rev 114282)
+++ trunk/Source/WebCore/rendering/RenderView.cpp 2012-04-16 18:32:13 UTC (rev 114283)
@@ -255,7 +255,7 @@
}
#if USE(ACCELERATED_COMPOSITING)
- if (RenderLayer* compositingLayer = layer->enclosingCompositingLayer()) {
+ if (RenderLayer* compositingLayer = layer->enclosingCompositingLayerForRepaint()) {
if (!compositingLayer->backing()->paintsIntoWindow()) {
frameView()->setCannotBlitToWindow();
break;