WebKit Bugzilla
Attachment 370020 Details for
Bug 197939
: Avoid a recursive descendants layer walk sometimes
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-197939-20190515192017.patch (text/plain), 3.69 KB, created by
Simon Fraser (smfr)
on 2019-05-15 19:20:18 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Simon Fraser (smfr)
Created:
2019-05-15 19:20:18 PDT
Size:
3.69 KB
patch
obsolete
>Subversion Revision: 245336 >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index 9c8791c62d82b4fe72e2a1a141e5875309a0e8b7..ee2451f97ed0a51cc2678f8c8a3be73fe4a01092 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,20 @@ >+2019-05-15 Simon Fraser <simon.fraser@apple.com> >+ >+ Avoid a recursive descendants layer walk sometimes >+ https://bugs.webkit.org/show_bug.cgi?id=197939 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ If a layer got composited post-descendants because it needs to clip, for example, we'd do a recursive >+ descendant tree walk to add layers to the overlap map. However, all the descendants would already >+ have contributed to the overlap map if some non-root ancestor was already composited. So we can >+ skip the addDescendantsToOverlapMapRecursive() if we know, before descendants, whether there's >+ a non-root composited ancestor. >+ >+ * rendering/RenderLayerCompositor.cpp: >+ (WebCore::RenderLayerCompositor::CompositingState::hasNonRootCompositedAncestor const): >+ (WebCore::RenderLayerCompositor::computeCompositingRequirements): >+ > 2019-05-15 Simon Fraser <simon.fraser@apple.com> > > Clean up code related to compositing overlap map maintenance >diff --git a/Source/WebCore/rendering/RenderLayerCompositor.cpp b/Source/WebCore/rendering/RenderLayerCompositor.cpp >index 166c4119ffeefd0dd2fa3cf3d57f48d3124f6492..81d3ef004a9168b08051e5758755aa656969e68f 100644 >--- a/Source/WebCore/rendering/RenderLayerCompositor.cpp >+++ b/Source/WebCore/rendering/RenderLayerCompositor.cpp >@@ -175,6 +175,11 @@ struct RenderLayerCompositor::CompositingState { > #endif > } > >+ bool hasNonRootCompositedAncestor() const >+ { >+ return compositingAncestor && !compositingAncestor->isRenderViewLayer(); >+ } >+ > RenderLayer* compositingAncestor; > RenderLayer* backingSharingAncestor { nullptr }; > RenderLayer* stackingContextAncestor { nullptr }; >@@ -855,6 +860,7 @@ void RenderLayerCompositor::computeCompositingRequirements(RenderLayer* ancestor > RequiresCompositingData queryData; > bool willBeComposited = layer.isComposited(); > bool becameCompositedAfterDescendantTraversal = false; >+ > if (layer.needsPostLayoutCompositingUpdate() || compositingState.fullPaintOrderTraversalRequired || compositingState.descendantsRequireCompositingUpdate) { > layer.setIndirectCompositingReason(RenderLayer::IndirectCompositingReason::None); > willBeComposited = needsToBeComposited(layer, queryData); >@@ -951,6 +957,7 @@ void RenderLayerCompositor::computeCompositingRequirements(RenderLayer* ancestor > #endif > > bool anyDescendantHas3DTransform = false; >+ bool descendantsAddedToOverlap = currentState.hasNonRootCompositedAncestor(); > > for (auto* childLayer : layer.negativeZOrderLayers()) { > computeCompositingRequirements(&layer, *childLayer, overlapMap, currentState, backingSharingState, anyDescendantHas3DTransform); >@@ -1048,7 +1055,7 @@ void RenderLayerCompositor::computeCompositingRequirements(RenderLayer* ancestor > compositingState.updateWithDescendantStateAndLayer(currentState, layer, layerExtent); > > bool layerContributesToOverlap = currentState.compositingAncestor && !currentState.compositingAncestor->isRenderViewLayer(); >- updateOverlapMap(overlapMap, layer, layerExtent, layerContributesToOverlap, becameCompositedAfterDescendantTraversal); >+ updateOverlapMap(overlapMap, layer, layerExtent, layerContributesToOverlap, becameCompositedAfterDescendantTraversal && !descendantsAddedToOverlap); > > // Pop backing/overlap sharing state. > if ((willBeComposited && !layer.isRenderViewLayer()) || currentState.backingSharingAncestor == &layer) {
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 197939
:
370020
|
370025