[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