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