Title: [283354] trunk/Source/WebCore
Revision
283354
Author
cathiec...@igalia.com
Date
2021-09-30 18:23:14 -0700 (Thu, 30 Sep 2021)

Log Message

[Performance] Optimize RenderLayer::clipCrossesPaintingBoundary
https://bugs.webkit.org/show_bug.cgi?id=230885

Reviewed by Simon Fraser.

In RenderLayer::clipCrossesPaintingBoundary, to check if the layer and its parent layer are in the same
compositing layer, it calls enclosingCompositingLayerForRepaint() twice, which need to travel up the layer tree.
This patch adds RenderLayer::sharesCompositingLayerForRepaint, to check the repaintTargetForLayer and paintOrderParents.

* rendering/RenderLayer.cpp:
(WebCore::repaintTargetForLayer):
(WebCore::RenderLayer::enclosingCompositingLayerForRepaint const):
(WebCore::RenderLayer::sharesCompositingLayerForRepaint const):
(WebCore::RenderLayer::clipCrossesPaintingBoundary const):
* rendering/RenderLayer.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (283353 => 283354)


--- trunk/Source/WebCore/ChangeLog	2021-10-01 00:40:33 UTC (rev 283353)
+++ trunk/Source/WebCore/ChangeLog	2021-10-01 01:23:14 UTC (rev 283354)
@@ -1,3 +1,21 @@
+2021-09-30  Cathie Chen  <cathiec...@igalia.com>
+
+        [Performance] Optimize RenderLayer::clipCrossesPaintingBoundary
+        https://bugs.webkit.org/show_bug.cgi?id=230885
+
+        Reviewed by Simon Fraser.
+
+        In RenderLayer::clipCrossesPaintingBoundary, to check if the layer and its parent layer are in the same
+        compositing layer, it calls enclosingCompositingLayerForRepaint() twice, which need to travel up the layer tree.
+        This patch adds RenderLayer::sharesCompositingLayerForRepaint, to check the repaintTargetForLayer and paintOrderParents.
+
+        * rendering/RenderLayer.cpp:
+        (WebCore::repaintTargetForLayer):
+        (WebCore::RenderLayer::enclosingCompositingLayerForRepaint const):
+        (WebCore::RenderLayer::sharesCompositingLayerForRepaint const):
+        (WebCore::RenderLayer::clipCrossesPaintingBoundary const):
+        * rendering/RenderLayer.h:
+
 2021-09-30  Simon Fraser  <simon.fra...@apple.com>
 
         Simplify some scrolling-related code in WebKit with use of RectEdges<bool>

Modified: trunk/Source/WebCore/rendering/RenderLayer.cpp (283353 => 283354)


--- trunk/Source/WebCore/rendering/RenderLayer.cpp	2021-10-01 00:40:33 UTC (rev 283353)
+++ trunk/Source/WebCore/rendering/RenderLayer.cpp	2021-10-01 01:23:14 UTC (rev 283354)
@@ -1920,18 +1920,19 @@
     return nullptr;
 }
 
+static RenderLayer* repaintTargetForLayer(const RenderLayer& layer)
+{
+    if (compositedWithOwnBackingStore(layer))
+        return const_cast<RenderLayer*>(&layer);
+
+    if (layer.paintsIntoProvidedBacking())
+        return layer.backingProviderLayer();
+
+    return nullptr;
+}
+
 RenderLayer* RenderLayer::enclosingCompositingLayerForRepaint(IncludeSelfOrNot includeSelf) const
 {
-    auto repaintTargetForLayer = [](const RenderLayer& layer) -> RenderLayer* {
-        if (compositedWithOwnBackingStore(layer))
-            return const_cast<RenderLayer*>(&layer);
-        
-        if (layer.paintsIntoProvidedBacking())
-            return layer.backingProviderLayer();
-        
-        return nullptr;
-    };
-
     RenderLayer* repaintTarget = nullptr;
     if (includeSelf == IncludeSelf && (repaintTarget = repaintTargetForLayer(*this)))
         return repaintTarget;
@@ -1944,6 +1945,18 @@
     return nullptr;
 }
 
+bool RenderLayer::sharesCompositingLayerForRepaint(const RenderLayer& otherLayer) const
+{
+    if (repaintTargetForLayer(*this))
+        return false;
+
+    const RenderLayer* paintParent = paintOrderParent();
+    if (&otherLayer == paintParent)
+        return true;
+    auto* otherPaintParent = otherLayer.paintOrderParent();
+    return paintParent == otherPaintParent || this == otherPaintParent;
+}
+
 RenderLayer* RenderLayer::enclosingFilterLayer(IncludeSelfOrNot includeSelf) const
 {
     const RenderLayer* curr = (includeSelf == IncludeSelf) ? this : parent();
@@ -4453,8 +4466,11 @@
 
 bool RenderLayer::clipCrossesPaintingBoundary() const
 {
-    return parent()->enclosingPaginationLayer(IncludeCompositedPaginatedLayers) != enclosingPaginationLayer(IncludeCompositedPaginatedLayers)
-        || parent()->enclosingCompositingLayerForRepaint() != enclosingCompositingLayerForRepaint();
+    auto* parentLayer = parent();
+    if (!sharesCompositingLayerForRepaint(*parentLayer))
+        return true;
+
+    return parentLayer->enclosingPaginationLayer(IncludeCompositedPaginatedLayers) != enclosingPaginationLayer(IncludeCompositedPaginatedLayers);
 }
 
 void RenderLayer::calculateClipRects(const ClipRectsContext& clipRectsContext, ClipRects& clipRects) const

Modified: trunk/Source/WebCore/rendering/RenderLayer.h (283353 => 283354)


--- trunk/Source/WebCore/rendering/RenderLayer.h	2021-10-01 00:40:33 UTC (rev 283353)
+++ trunk/Source/WebCore/rendering/RenderLayer.h	2021-10-01 01:23:14 UTC (rev 283354)
@@ -587,6 +587,7 @@
     // Enclosing compositing layer; if includeSelf is true, may return this.
     RenderLayer* enclosingCompositingLayer(IncludeSelfOrNot = IncludeSelf) const;
     RenderLayer* enclosingCompositingLayerForRepaint(IncludeSelfOrNot = IncludeSelf) const;
+    bool sharesCompositingLayerForRepaint(const RenderLayer& otherLayer) const;
     // Ancestor compositing layer, excluding this.
     RenderLayer* ancestorCompositingLayer() const { return enclosingCompositingLayer(ExcludeSelf); }
 
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to