Title: [238357] trunk/Source/WebCore
Revision
238357
Author
simon.fra...@apple.com
Date
2018-11-17 16:51:42 -0800 (Sat, 17 Nov 2018)

Log Message

Avoid triggering compositing updates when only the root layer is composited
https://bugs.webkit.org/show_bug.cgi?id=191813

Reviewed by Zalan Bujtas.

If we know that the only composited layer is the root, we can avoid triggering deep
compositing updates sometimes, for example when layout changes size or position,
or when z-order lists change.

* rendering/RenderLayer.cpp:
(WebCore::RenderLayer::addChild):
(WebCore::RenderLayer::removeChild):
(WebCore::RenderLayer::updateLayerPosition):
(WebCore::RenderLayer::scrollTo):
(WebCore::RenderLayer::updateCompositingLayersAfterScroll):
(WebCore::outputPaintOrderTreeRecursive):
* rendering/RenderLayerCompositor.cpp:
(WebCore::RenderLayerCompositor::updateBackingAndHierarchy): Consult the layer.hasCompositingDescendant()
flag to cut off descendants traversal when possible.
(WebCore::RenderLayerCompositor::layerStyleChanged):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (238356 => 238357)


--- trunk/Source/WebCore/ChangeLog	2018-11-18 00:25:20 UTC (rev 238356)
+++ trunk/Source/WebCore/ChangeLog	2018-11-18 00:51:42 UTC (rev 238357)
@@ -1,5 +1,28 @@
 2018-11-17  Simon Fraser  <simon.fra...@apple.com>
 
+        Avoid triggering compositing updates when only the root layer is composited
+        https://bugs.webkit.org/show_bug.cgi?id=191813
+
+        Reviewed by Zalan Bujtas.
+
+        If we know that the only composited layer is the root, we can avoid triggering deep
+        compositing updates sometimes, for example when layout changes size or position,
+        or when z-order lists change.
+
+        * rendering/RenderLayer.cpp:
+        (WebCore::RenderLayer::addChild):
+        (WebCore::RenderLayer::removeChild):
+        (WebCore::RenderLayer::updateLayerPosition):
+        (WebCore::RenderLayer::scrollTo):
+        (WebCore::RenderLayer::updateCompositingLayersAfterScroll):
+        (WebCore::outputPaintOrderTreeRecursive):
+        * rendering/RenderLayerCompositor.cpp:
+        (WebCore::RenderLayerCompositor::updateBackingAndHierarchy): Consult the layer.hasCompositingDescendant()
+        flag to cut off descendants traversal when possible.
+        (WebCore::RenderLayerCompositor::layerStyleChanged):
+
+2018-11-17  Simon Fraser  <simon.fra...@apple.com>
+
         Fix an error in 238354 - !=, not ==.
         
         Fixes test failures.

Modified: trunk/Source/WebCore/rendering/RenderLayer.cpp (238356 => 238357)


--- trunk/Source/WebCore/rendering/RenderLayer.cpp	2018-11-18 00:25:20 UTC (rev 238356)
+++ trunk/Source/WebCore/rendering/RenderLayer.cpp	2018-11-18 00:51:42 UTC (rev 238357)
@@ -405,7 +405,7 @@
     if (child.isSelfPaintingLayer() || child.hasSelfPaintingLayerDescendant())
         setAncestorChainHasSelfPaintingLayerDescendant();
 
-    if (compositor().usesCompositing())
+    if (compositor().hasContentCompositingLayers())
         setDescendantsNeedCompositingRequirementsTraversal();
 
     if (child.hasDescendantNeedingCompositingRequirementsTraversal() || child.needsCompositingRequirementsTraversal())
@@ -451,7 +451,7 @@
     if (oldChild.isSelfPaintingLayer() || oldChild.hasSelfPaintingLayerDescendant())
         dirtyAncestorChainHasSelfPaintingLayerDescendantStatus();
 
-    if (compositor().usesCompositing())
+    if (compositor().hasContentCompositingLayers())
         setDescendantsNeedCompositingRequirementsTraversal();
 
 #if ENABLE(CSS_COMPOSITING)
@@ -1577,7 +1577,7 @@
     positionOrOffsetChanged |= location() != localPoint;
     setLocation(localPoint);
     
-    if (positionOrOffsetChanged && compositor().usesCompositing()) {
+    if (positionOrOffsetChanged && compositor().hasContentCompositingLayers()) {
         if (isComposited())
             setNeedsCompositingGeometryUpdate();
         // This layer's position can affect the location of a composited descendant (which may be a sibling in z-order),
@@ -2430,7 +2430,7 @@
     frame.eventHandler().dispatchFakeMouseMoveEventSoonInQuad(quadForFakeMouseMoveEvent);
 
     bool requiresRepaint = true;
-    if (compositor().usesCompositing() && usesCompositedScrolling()) {
+    if (usesCompositedScrolling()) {
         setNeedsCompositingGeometryUpdate();
         setDescendantsNeedUpdateBackingAndHierarchyTraversal();
         requiresRepaint = false;
@@ -2580,7 +2580,7 @@
 
 void RenderLayer::updateCompositingLayersAfterScroll()
 {
-    if (compositor().usesCompositing()) {
+    if (compositor().hasContentCompositingLayers()) {
         // Our stacking container is guaranteed to contain all of our descendants that may need
         // repositioning, so update compositing layers from there.
         if (RenderLayer* compositingAncestor = stackingContext()->enclosingCompositingLayer()) {
@@ -6643,7 +6643,7 @@
 static void outputPaintOrderTreeLegend(TextStream& stream)
 {
     stream.nextLine();
-    stream << "(S)tacking Context, (N)ormal flow only, (O)verflow clip, (A)lpha (opacity or mask), has (B)lend mode, (I)solates blending, (T)ransform-ish, (F)ilter, Fi(X)ed position, (C)omposited\n"
+    stream << "(S)tacking Context, (N)ormal flow only, (O)verflow clip, (A)lpha (opacity or mask), has (B)lend mode, (I)solates blending, (T)ransform-ish, (F)ilter, Fi(X)ed position, (C)omposited, (c)omposited descendant\n"
         "Dirty (z)-lists, Dirty (n)ormal flow lists\n"
         "Descendant needs overlap (t)raversal, Descendant needs (b)acking or hierarchy update, All descendants need (r)equirements traversal, All (s)ubsequent layers need requirements traversal, All descendants need (h)ierarchy traversal\n"
         "Needs compositing paint order update on (s)ubsequent layers, Needs compositing paint (o)rder children update, "
@@ -6670,6 +6670,7 @@
     stream << (layer.hasFilter() ? "F" : "-");
     stream << (layer.renderer().isFixedPositioned() ? "X" : "-");
     stream << (layer.isComposited() ? "C" : "-");
+    stream << (layer.hasCompositingDescendant() ? "c" : "-");
 
     stream << " ";
 

Modified: trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp (238356 => 238357)


--- trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp	2018-11-18 00:25:20 UTC (rev 238356)
+++ trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp	2018-11-18 00:51:42 UTC (rev 238357)
@@ -1170,29 +1170,35 @@
     // to the compositing child list of an enclosing layer.
     Vector<Ref<GraphicsLayer>> layerChildren;
     auto& childList = layerBacking ? layerChildren : childLayersOfEnclosingLayer;
-    // FIXME: why the !layerBacking check?
-    bool requireDescendantTraversal = !layerBacking || layer.needsCompositingLayerConnection() || layer.hasDescendantNeedingUpdateBackingOrHierarchyTraversal() || !updateLevel.isEmpty();
 
+    bool requireDescendantTraversal = layer.hasDescendantNeedingUpdateBackingOrHierarchyTraversal()
+        || (layer.hasCompositingDescendant() && (!layerBacking || layer.needsCompositingLayerConnection() || !updateLevel.isEmpty()));
+
 #if !ASSERT_DISABLED
     LayerListMutationDetector mutationChecker(layer);
 #endif
     
-    if (requireDescendantTraversal) {
-        for (auto* renderLayer : layer.negativeZOrderLayers())
-            updateBackingAndHierarchy(*renderLayer, childList, updateLevel, depth + 1);
-
-            // If a negative z-order child is compositing, we get a foreground layer which needs to get parented.
+    auto appendForegroundLayerIfNecessary = [&] {
+        // If a negative z-order child is compositing, we get a foreground layer which needs to get parented.
         if (layer.negativeZOrderLayers().size()) {
             if (layerBacking && layerBacking->foregroundLayer())
                 childList.append(*layerBacking->foregroundLayer());
         }
+    };
 
+    if (requireDescendantTraversal) {
+        for (auto* renderLayer : layer.negativeZOrderLayers())
+            updateBackingAndHierarchy(*renderLayer, childList, updateLevel, depth + 1);
+
+        appendForegroundLayerIfNecessary();
+
         for (auto* renderLayer : layer.normalFlowLayers())
             updateBackingAndHierarchy(*renderLayer, childList, updateLevel, depth + 1);
         
         for (auto* renderLayer : layer.positiveZOrderLayers())
             updateBackingAndHierarchy(*renderLayer, childList, updateLevel, depth + 1);
-    }
+    } else
+        appendForegroundLayerIfNecessary();
 
     if (layerBacking) {
         if (requireDescendantTraversal) {
@@ -1370,7 +1376,7 @@
     if (queryData.reevaluateAfterLayout)
         layer.setNeedsPostLayoutCompositingUpdate();
 
-    if (diff >= StyleDifference::LayoutPositionedMovementOnly && usesCompositing()) {
+    if (diff >= StyleDifference::LayoutPositionedMovementOnly && hasContentCompositingLayers()) {
         layer.setNeedsPostLayoutCompositingUpdate();
         layer.setNeedsCompositingGeometryUpdate();
     }
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to