[SCM] WebKit Debian packaging branch, webkit-1.1, updated. upstream/1.1.22-985-g3c00f00
simon.fraser at apple.com
simon.fraser at apple.com
Wed Mar 17 18:42:36 UTC 2010
The following commit has been merged in the webkit-1.1 branch:
commit b6a175f547a7a6b47655bdccecc78095231f0f35
Author: simon.fraser at apple.com <simon.fraser at apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date: Mon Mar 15 21:47:23 2010 +0000
2010-03-15 Simon Fraser <simon.fraser at apple.com>
Reviewed by Dan Bernstein.
Drop out of compositing mode when no elements need to composite
https://bugs.webkit.org/show_bug.cgi?id=36134
When no more elements on the page need to be composited, drop out of compositing
mode altogether, including removing the layer-backed view that hosts the layers.
* rendering/RenderLayerCompositor.cpp:
(WebCore::RenderLayerCompositor::updateCompositingLayers): If the list of child layers to attach at
the root is empty, we have no composited layers, and can drop out of compositing mode by calling
willMoveOffscreen().
(WebCore::RenderLayerCompositor::computeCompositingRequirements): In several places,
use willBeComposited rather than calling needsToBeComposited(), because it avoids
recomputing state that we know already (but assert that we're getting it right).
When we're assessing the root layer in post-order, see if we have any child layers that
are compositing, and also whether the root itself needs to composite. If neither are
true, then we can drop out of compositing mode.
(WebCore::RenderLayerCompositor::needsToBeComposited):
(WebCore::RenderLayerCompositor::requiresCompositingLayer): Move the
"inCompositingMode() && layer->isRootLayer()" test out of requiresCompositingLayer()
and into needsToBeComposited() so that we can call requiresCompositingLayer() separately
on the root layer above.
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@56017 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index 9964e0c..bbc755e 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,31 @@
+2010-03-15 Simon Fraser <simon.fraser at apple.com>
+
+ Reviewed by Dan Bernstein.
+
+ Drop out of compositing mode when no elements need to composite
+ https://bugs.webkit.org/show_bug.cgi?id=36134
+
+ When no more elements on the page need to be composited, drop out of compositing
+ mode altogether, including removing the layer-backed view that hosts the layers.
+
+ * rendering/RenderLayerCompositor.cpp:
+ (WebCore::RenderLayerCompositor::updateCompositingLayers): If the list of child layers to attach at
+ the root is empty, we have no composited layers, and can drop out of compositing mode by calling
+ willMoveOffscreen().
+
+ (WebCore::RenderLayerCompositor::computeCompositingRequirements): In several places,
+ use willBeComposited rather than calling needsToBeComposited(), because it avoids
+ recomputing state that we know already (but assert that we're getting it right).
+ When we're assessing the root layer in post-order, see if we have any child layers that
+ are compositing, and also whether the root itself needs to composite. If neither are
+ true, then we can drop out of compositing mode.
+
+ (WebCore::RenderLayerCompositor::needsToBeComposited):
+ (WebCore::RenderLayerCompositor::requiresCompositingLayer): Move the
+ "inCompositingMode() && layer->isRootLayer()" test out of requiresCompositingLayer()
+ and into needsToBeComposited() so that we can call requiresCompositingLayer() separately
+ on the root layer above.
+
2010-03-15 Leandro Pereira <leandro at profusion.mobi>
Reviewed by Kenneth Rohde Christiansen.
diff --git a/WebCore/rendering/RenderLayerCompositor.cpp b/WebCore/rendering/RenderLayerCompositor.cpp
index 854be0d..4ce3499 100644
--- a/WebCore/rendering/RenderLayerCompositor.cpp
+++ b/WebCore/rendering/RenderLayerCompositor.cpp
@@ -209,8 +209,13 @@ void RenderLayerCompositor::updateCompositingLayers(CompositingUpdateType update
rebuildCompositingLayerTree(updateRoot, compState, childList);
// Host the document layer in the RenderView's root layer.
- if (updateRoot == rootRenderLayer() && !childList.isEmpty())
- m_rootPlatformLayer->setChildren(childList);
+ if (updateRoot == rootRenderLayer()) {
+ if (childList.isEmpty()) {
+ willMoveOffscreen();
+ m_rootPlatformLayer = 0;
+ } else
+ m_rootPlatformLayer->setChildren(childList);
+ }
} else if (needGeometryUpdate) {
// We just need to do a geometry update. This is only used for position:fixed scrolling;
// most of the time, geometry is updated via RenderLayer::styleChanged().
@@ -563,8 +568,9 @@ void RenderLayerCompositor::computeCompositingRequirements(RenderLayer* layer, O
willBeComposited = true;
}
+ ASSERT(willBeComposited == needsToBeComposited(layer));
if (layer->reflectionLayer())
- layer->reflectionLayer()->setMustOverlapCompositedLayers(needsToBeComposited(layer));
+ layer->reflectionLayer()->setMustOverlapCompositedLayers(willBeComposited);
// Subsequent layers in the parent stacking context also need to composite.
if (childState.m_subtreeIsCompositing)
@@ -581,8 +587,16 @@ void RenderLayerCompositor::computeCompositingRequirements(RenderLayer* layer, O
willBeComposited = true;
}
+ // If we're back at the root, and no other layers need to be composited, and the root layer itself doesn't need
+ // to be composited, then we can drop out of compositing mode altogether.
+ if (layer->isRootLayer() && !childState.m_subtreeIsCompositing && !requiresCompositingLayer(layer)) {
+ m_compositing = false;
+ willBeComposited = false;
+ }
+
// If the layer is going into compositing mode, repaint its old location.
- if (!layer->isComposited() && needsToBeComposited(layer))
+ ASSERT(willBeComposited == needsToBeComposited(layer));
+ if (!layer->isComposited() && willBeComposited)
repaintOnCompositingChange(layer);
// Update backing now, so that we can use isComposited() reliably during tree traversal in rebuildCompositingLayerTree().
@@ -934,7 +948,7 @@ bool RenderLayerCompositor::needsToBeComposited(const RenderLayer* layer) const
if (!m_hasAcceleratedCompositing || !layer->isSelfPaintingLayer())
return false;
- return requiresCompositingLayer(layer) || layer->mustOverlapCompositedLayers();
+ return requiresCompositingLayer(layer) || layer->mustOverlapCompositedLayers() || (inCompositingMode() && layer->isRootLayer());
}
// Note: this specifies whether the RL needs a compositing layer for intrinsic reasons.
@@ -949,14 +963,13 @@ bool RenderLayerCompositor::requiresCompositingLayer(const RenderLayer* layer) c
layer = toRenderBoxModelObject(renderer)->layer();
}
// The root layer always has a compositing layer, but it may not have backing.
- return (inCompositingMode() && layer->isRootLayer()) ||
- requiresCompositingForTransform(renderer) ||
- requiresCompositingForVideo(renderer) ||
- requiresCompositingForCanvas(renderer) ||
- requiresCompositingForPlugin(renderer) ||
- renderer->style()->backfaceVisibility() == BackfaceVisibilityHidden ||
- clipsCompositingDescendants(layer) ||
- requiresCompositingForAnimation(renderer);
+ return requiresCompositingForTransform(renderer)
+ || requiresCompositingForVideo(renderer)
+ || requiresCompositingForCanvas(renderer)
+ || requiresCompositingForPlugin(renderer)
+ || renderer->style()->backfaceVisibility() == BackfaceVisibilityHidden
+ || clipsCompositingDescendants(layer)
+ || requiresCompositingForAnimation(renderer);
}
// Return true if the given layer has some ancestor in the RenderLayer hierarchy that clips,
--
WebKit Debian packaging
More information about the Pkg-webkit-commits
mailing list