Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: 4a5b56e32671dd7cc4768db52d1b8b0681b17ee9
      
https://github.com/WebKit/WebKit/commit/4a5b56e32671dd7cc4768db52d1b8b0681b17ee9
  Author: Alan Baradlay <[email protected]>
  Date:   2024-06-07 (Fri, 07 Jun 2024)

  Changed paths:
    M Source/WebCore/page/LocalFrameView.cpp
    M Source/WebCore/page/LocalFrameView.h
    M Source/WebCore/page/LocalFrameViewLayoutContext.cpp
    M Source/WebCore/page/LocalFrameViewLayoutContext.h
    M Source/WebCore/rendering/RenderElement.cpp
    M Source/WebCore/rendering/RenderElement.h
    M Source/WebCore/rendering/RenderLayer.cpp
    M Source/WebCore/rendering/RenderLayer.h
    M Source/WebCore/rendering/RenderObject.cpp
    M Source/WebCore/rendering/RenderView.cpp

  Log Message:
  -----------
  Limit the number of repaint candidates after simplified layout
https://bugs.webkit.org/show_bug.cgi?id=275153

Reviewed by Simon Fraser.

"simplified normal-flow layout" is initiated when the only property that 
requires attention
at layout time throughout the entire tree is overflow.

It simply means that the current (outstanding) style and/or content mutation 
that we try to recover from
is not supposed to change any in- or out-of-flow box size and/or position.
Such change may be triggered by
- out-of-flow box is inserted and/or removed (note that at insertion, we run 
non-simplified layout
  _inside_ the freshly added subtree)
- StyleDifferenceContextSensitiveProperty::Transform changes but nothing else 
(e.g. scale changes on an element.
  This only applies to mutating existing properties, i.e. when a new transform 
related property is added,
  non-simplified layout is initiated)

1. These type of changes are not supposed to expand the damaged area (marking 
additional renderers dirty as
   we run layout on the tree).
2. The entry point in most cases is still the RenderView but it could very well 
be a subtree layout.

Layout:
  We traverse through descendants by calling layout() all the way to the dirty 
renderer(s).
  However while descending, we only run simplifiedLayout().

After layout:
  We run RenderLayer::updateLayerPositionsAfterLayout() where we traverse the 
_layer_ tree
  and (almost unconditionally) re-compute repaint rects on associated renderers 
(and even issue redundant repaints).
  When the damage is limited to relatively small subtree(s), most of this work 
is redundant.

This patch ensures that in case of "simplified normal-flow layout", "repaint 
rects" related work happens only on affected renderers.

1. Assign a layout identifier to each layout run 
(LocalFrameViewLayoutContext::performLayout)
2. Mark each renderer involved in current layout with said layout identifier 
(RenderObject::clearNeedsLayout)
3. Check if the current layout is "simplified normal-flow layout" by looking at 
the layout root's dirty bit.
   (note that "simplified normal-flow layout" is not supposed to get upgraded 
to "normal layout" during layout or
   "normal layout" downgraded to "simple".)
4. Only issue repaint in RenderLayer::recursiveUpdateLayerPositions() when the 
associated renderer
   participated in the most recent layout.

* Source/WebCore/page/LocalFrameViewLayoutContext.cpp:
(WebCore::LocalFrameViewLayoutContext::performLayout):
* Source/WebCore/page/LocalFrameViewLayoutContext.h:
* Source/WebCore/rendering/RenderElement.h:
(WebCore::RenderElement::setNormalFlowLayoutFrameId):
(WebCore::RenderElement::normalFlowLayoutFrameId const):
* Source/WebCore/rendering/RenderLayer.cpp:
(WebCore::RenderLayer::updateLayerPositionsAfterLayout):
(WebCore::RenderLayer::recursiveUpdateLayerPositions):
* Source/WebCore/rendering/RenderLayer.h:
* Source/WebCore/rendering/RenderObject.cpp:
(WebCore::RenderObject::clearNeedsLayout):
(WebCore::RenderObject::outputRenderObject const):
* Source/WebCore/rendering/RenderView.cpp: remove redundant clear.
(WebCore::RenderView::layout):

Canonical link: https://commits.webkit.org/279847@main



To unsubscribe from these emails, change your notification settings at 
https://github.com/WebKit/WebKit/settings/notifications
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to