[webkit-changes] [WebKit/WebKit] 9dcbb2: Avoid computing layer bounds in BackingSharingStat...

Simon Fraser noreply at github.com
Sat Sep 16 12:48:06 PDT 2023


  Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: 9dcbb22277532b1b42cc6180b32ccacec07a68c1
      https://github.com/WebKit/WebKit/commit/9dcbb22277532b1b42cc6180b32ccacec07a68c1
  Author: Simon Fraser <simon.fraser at apple.com>
  Date:   2023-09-16 (Sat, 16 Sep 2023)

  Changed paths:
    M Source/WebCore/rendering/RenderLayerCompositor.cpp
    M Source/WebCore/rendering/RenderLayerCompositor.h

  Log Message:
  -----------
  Avoid computing layer bounds in BackingSharingState::isAdditionalProviderCandidate()
https://bugs.webkit.org/show_bug.cgi?id=261630
rdar://115584910

Reviewed by Alan Baradlay.

isAdditionalProviderCandidate() is called when we're asking if a given RenderLayer can be added to
the list of composted layers that may share their backing store with other sibling layers. This does
a traversal over the existing list checking for overlap by computing the bounds of the incoming and
the existing layers. When this list gets long (thousands of layers), this is very slow.

The compositing code has already computed layer bounds for overlap testing, so we can just use the
existing rects. These come in via "OverlapExtent" which manages the lazy computation of layer
bounds. In order to support this lazy computation via a call to
`RenderLayerCompositor::computeExtent()`, move `updateBeforeDescendantTraversal()` and
`updateAfterDescendantTraversal()` to be member functions of RenderLayerComopsitor, and pass them
the LayerOverlapMap and OverlapExtent; they can then ensure that the bounds is computed only when
needed. We store each candidate layer's bounds in `BackingSharingState::Provider`.

* Source/WebCore/rendering/RenderLayerCompositor.cpp:
(WebCore::RenderLayerCompositor::BackingSharingState::backingProviderCandidates):
(WebCore::RenderLayerCompositor::BackingSharingState::backingSharingStackingContext const):
(WebCore::RenderLayerCompositor::BackingSharingState::startBackingSharingSequence):
(WebCore::RenderLayerCompositor::BackingSharingState::addBackingSharingCandidate):
(WebCore::RenderLayerCompositor::BackingSharingState::isAdditionalProviderCandidate const):
(WebCore::RenderLayerCompositor::computeCompositingRequirements):
(WebCore::RenderLayerCompositor::traverseUnchangedSubtree):
(WebCore::RenderLayerCompositor::updateBackingSharingBeforeDescendantTraversal):
(WebCore::RenderLayerCompositor::updateBackingSharingAfterDescendantTraversal):
(WebCore::RenderLayerCompositor::layerRepaintTargetsBackingSharingLayer const):
(WebCore::RenderLayerCompositor::BackingSharingState::backingProviderCandidates const): Deleted.
(WebCore::RenderLayerCompositor::BackingSharingState::updateBeforeDescendantTraversal): Deleted.
(WebCore::RenderLayerCompositor::BackingSharingState::updateAfterDescendantTraversal): Deleted.
* Source/WebCore/rendering/RenderLayerCompositor.h:

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




More information about the webkit-changes mailing list