WebKit Bugzilla
Attachment 370025 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-20190515211133.patch (text/plain), 3.69 KB, created by
Simon Fraser (smfr)
on 2019-05-15 21:11:34 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Simon Fraser (smfr)
Created:
2019-05-15 21:11:34 PDT
Size:
3.69 KB
patch
obsolete
>Subversion Revision: 245373 >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index fe85dea4ebcd284cd9681b7fd52084a516035f4e..3804d09e151934d569cf080116623570870763ba 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 Zalan Bujtas. >+ >+ 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 b5b6c654283291652ae6bdebbf1d1a4da90c462a..b5b8046423b9eaf8051476fb69bfb427cc32727d 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