Title: [249222] trunk/Source/WebCore
Revision
249222
Author
simon.fra...@apple.com
Date
2019-08-28 15:32:01 -0700 (Wed, 28 Aug 2019)

Log Message

Devirtualize RenderBox::visualOverflowRect()
https://bugs.webkit.org/show_bug.cgi?id=201231

Reviewed by Zalan Bujtas.

The only override of RenderBox::visualOverflowRect() was in RenderView, for "paintsEntireContents" views, and as
far as I can tell this is not necessary. visualOverflowRect() is hot when called from RenderLayer::localBoundingBox() --
this shows in profiles when scrolling large patch reviews, so making it non-virtual is a performance enhancement.

RenderLayer::localBoundingBox() can also just call visualOverflowRect(), since that returns borderBoxRect()
when there is no overflow.

* rendering/RenderBox.h:
(WebCore::RenderBox::visualOverflowRect const):
* rendering/RenderLayer.cpp:
(WebCore::performOverlapTests): Minor optimization to avoid a call to boundingBox().
(WebCore::RenderLayer::calculateClipRects const):
* rendering/RenderView.cpp:
(WebCore::RenderView::visualOverflowRect const): Deleted.
* rendering/RenderView.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (249221 => 249222)


--- trunk/Source/WebCore/ChangeLog	2019-08-28 21:24:47 UTC (rev 249221)
+++ trunk/Source/WebCore/ChangeLog	2019-08-28 22:32:01 UTC (rev 249222)
@@ -1,3 +1,26 @@
+2019-08-28  Simon Fraser  <simon.fra...@apple.com>
+
+        Devirtualize RenderBox::visualOverflowRect()
+        https://bugs.webkit.org/show_bug.cgi?id=201231
+
+        Reviewed by Zalan Bujtas.
+
+        The only override of RenderBox::visualOverflowRect() was in RenderView, for "paintsEntireContents" views, and as
+        far as I can tell this is not necessary. visualOverflowRect() is hot when called from RenderLayer::localBoundingBox() --
+        this shows in profiles when scrolling large patch reviews, so making it non-virtual is a performance enhancement.
+        
+        RenderLayer::localBoundingBox() can also just call visualOverflowRect(), since that returns borderBoxRect()
+        when there is no overflow.
+
+        * rendering/RenderBox.h:
+        (WebCore::RenderBox::visualOverflowRect const):
+        * rendering/RenderLayer.cpp:
+        (WebCore::performOverlapTests): Minor optimization to avoid a call to boundingBox().
+        (WebCore::RenderLayer::calculateClipRects const):
+        * rendering/RenderView.cpp:
+        (WebCore::RenderView::visualOverflowRect const): Deleted.
+        * rendering/RenderView.h:
+
 2019-08-28  Austin Eng  <e...@chromium.org>
 
         Create ANGLE EGL Context with all extensions disabled by default

Modified: trunk/Source/WebCore/rendering/RenderBox.h (249221 => 249222)


--- trunk/Source/WebCore/rendering/RenderBox.h	2019-08-28 21:24:47 UTC (rev 249221)
+++ trunk/Source/WebCore/rendering/RenderBox.h	2019-08-28 22:32:01 UTC (rev 249222)
@@ -191,7 +191,7 @@
     LayoutUnit logicalLeftLayoutOverflow() const { return style().isHorizontalWritingMode() ? layoutOverflowRect().x() : layoutOverflowRect().y(); }
     LayoutUnit logicalRightLayoutOverflow() const { return style().isHorizontalWritingMode() ? layoutOverflowRect().maxX() : layoutOverflowRect().maxY(); }
     
-    virtual LayoutRect visualOverflowRect() const { return m_overflow ? m_overflow->visualOverflowRect() : borderBoxRect(); }
+    LayoutRect visualOverflowRect() const { return m_overflow ? m_overflow->visualOverflowRect() : borderBoxRect(); }
     LayoutUnit logicalLeftVisualOverflow() const { return style().isHorizontalWritingMode() ? visualOverflowRect().x() : visualOverflowRect().y(); }
     LayoutUnit logicalRightVisualOverflow() const { return style().isHorizontalWritingMode() ? visualOverflowRect().maxX() : visualOverflowRect().maxY(); }
 

Modified: trunk/Source/WebCore/rendering/RenderLayer.cpp (249221 => 249222)


--- trunk/Source/WebCore/rendering/RenderLayer.cpp	2019-08-28 21:24:47 UTC (rev 249221)
+++ trunk/Source/WebCore/rendering/RenderLayer.cpp	2019-08-28 22:32:01 UTC (rev 249222)
@@ -4094,6 +4094,9 @@
 
 static void performOverlapTests(OverlapTestRequestMap& overlapTestRequests, const RenderLayer* rootLayer, const RenderLayer* layer)
 {
+    if (overlapTestRequests.isEmpty())
+        return;
+
     Vector<OverlapTestRequestClient*> overlappedRequestClients;
     LayoutRect boundingBox = layer->boundingBox(rootLayer, layer->offsetFromAncestor(rootLayer));
     for (auto& request : overlapTestRequests) {
@@ -5934,13 +5937,8 @@
         if (!(flags & DontConstrainForMask) && box->hasMask()) {
             result = box->maskClipRect(LayoutPoint());
             box->flipForWritingMode(result); // The mask clip rect is in physical coordinates, so we have to flip, since localBoundingBox is not.
-        } else {
-            LayoutRect bbox = box->borderBoxRect();
-            result = bbox;
-            LayoutRect overflowRect = box->visualOverflowRect();
-            if (bbox != overflowRect)
-                result.unite(overflowRect);
-        }
+        } else
+            result = box->visualOverflowRect();
     }
     return result;
 }

Modified: trunk/Source/WebCore/rendering/RenderView.cpp (249221 => 249222)


--- trunk/Source/WebCore/rendering/RenderView.cpp	2019-08-28 21:24:47 UTC (rev 249221)
+++ trunk/Source/WebCore/rendering/RenderView.cpp	2019-08-28 22:32:01 UTC (rev 249222)
@@ -514,14 +514,6 @@
         compositor.repaintCompositedLayers();
 }
 
-LayoutRect RenderView::visualOverflowRect() const
-{
-    if (frameView().paintsEntireContents())
-        return layoutOverflowRect();
-
-    return RenderBlockFlow::visualOverflowRect();
-}
-
 Optional<LayoutRect> RenderView::computeVisibleRectInContainer(const LayoutRect& rect, const RenderLayerModelObject* container, VisibleRectContext context) const
 {
     // If a container was specified, and was not nullptr or the RenderView,

Modified: trunk/Source/WebCore/rendering/RenderView.h (249221 => 249222)


--- trunk/Source/WebCore/rendering/RenderView.h	2019-08-28 21:24:47 UTC (rev 249221)
+++ trunk/Source/WebCore/rendering/RenderView.h	2019-08-28 22:32:01 UTC (rev 249222)
@@ -68,7 +68,6 @@
 
     FrameView& frameView() const { return m_frameView; }
 
-    LayoutRect visualOverflowRect() const override;
     Optional<LayoutRect> computeVisibleRectInContainer(const LayoutRect&, const RenderLayerModelObject* container, VisibleRectContext) const override;
     void repaintRootContents();
     void repaintViewRectangle(const LayoutRect&) const;
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to