Changeset 238583 in webkit


Ignore:
Timestamp:
Nov 27, 2018 3:46:18 PM (5 years ago)
Author:
Simon Fraser
Message:

Avoid triggering compositing updates when only the root layer is composited
https://bugs.webkit.org/show_bug.cgi?id=191813

Reviewed by Zalan Bujtas.

If we know that the only composited layer is the root, we can avoid triggering deep
compositing updates sometimes, for example when layout changes size or position,
or when z-order lists change.

  • rendering/RenderLayer.cpp:

(WebCore::RenderLayer::addChild):
(WebCore::RenderLayer::removeChild):
(WebCore::RenderLayer::updateLayerPosition):
(WebCore::RenderLayer::scrollTo):
(WebCore::RenderLayer::updateCompositingLayersAfterScroll):
(WebCore::outputPaintOrderTreeRecursive):

  • rendering/RenderLayerCompositor.cpp:

(WebCore::RenderLayerCompositor::updateBackingAndHierarchy): Consult the layer.hasCompositingDescendant()
flag to cut off descendants traversal when possible.
(WebCore::RenderLayerCompositor::layerStyleChanged):

Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/platform/ios-wk2/TestExpectations

    r238438 r238583  
    11251125svg/animations/mozilla/animateMotion-mpath-pathLength-1.svg [ ImageOnlyFailure ]
    11261126
     1127webkit.org/b/192045 css3/filters/blur-filter-page-scroll-parents.html
     1128webkit.org/b/192045 css3/filters/blur-filter-page-scroll-self.html
     1129webkit.org/b/192045 css3/filters/blur-filter-page-scroll.html
     1130
    11271131webkit.org/b/159379 fast/history/page-cache-webdatabase-pending-transaction.html [ Pass Failure ]
    11281132
  • trunk/Source/WebCore/ChangeLog

    r238582 r238583  
     12018-11-27  Simon Fraser  <simon.fraser@apple.com>
     2
     3        Avoid triggering compositing updates when only the root layer is composited
     4        https://bugs.webkit.org/show_bug.cgi?id=191813
     5
     6        Reviewed by Zalan Bujtas.
     7
     8        If we know that the only composited layer is the root, we can avoid triggering deep
     9        compositing updates sometimes, for example when layout changes size or position,
     10        or when z-order lists change.
     11
     12        * rendering/RenderLayer.cpp:
     13        (WebCore::RenderLayer::addChild):
     14        (WebCore::RenderLayer::removeChild):
     15        (WebCore::RenderLayer::updateLayerPosition):
     16        (WebCore::RenderLayer::scrollTo):
     17        (WebCore::RenderLayer::updateCompositingLayersAfterScroll):
     18        (WebCore::outputPaintOrderTreeRecursive):
     19        * rendering/RenderLayerCompositor.cpp:
     20        (WebCore::RenderLayerCompositor::updateBackingAndHierarchy): Consult the layer.hasCompositingDescendant()
     21        flag to cut off descendants traversal when possible.
     22        (WebCore::RenderLayerCompositor::layerStyleChanged):
     23
    1242018-11-27  Eric Carlson  <eric.carlson@apple.com>
    225
  • trunk/Source/WebCore/rendering/RenderLayer.cpp

    r238576 r238583  
    406406        setAncestorChainHasSelfPaintingLayerDescendant();
    407407
    408     if (compositor().usesCompositing())
     408    if (compositor().hasContentCompositingLayers())
    409409        setDescendantsNeedCompositingRequirementsTraversal();
    410410
     
    452452        dirtyAncestorChainHasSelfPaintingLayerDescendantStatus();
    453453
    454     if (compositor().usesCompositing())
     454    if (compositor().hasContentCompositingLayers())
    455455        setDescendantsNeedCompositingRequirementsTraversal();
    456456
     
    15781578    setLocation(localPoint);
    15791579   
    1580     if (positionOrOffsetChanged && compositor().usesCompositing()) {
     1580    if (positionOrOffsetChanged && compositor().hasContentCompositingLayers()) {
    15811581        if (isComposited())
    15821582            setNeedsCompositingGeometryUpdate();
     
    24312431
    24322432    bool requiresRepaint = true;
    2433     if (compositor().usesCompositing() && usesCompositedScrolling()) {
     2433    if (usesCompositedScrolling()) {
    24342434        setNeedsCompositingGeometryUpdate();
    24352435        setDescendantsNeedUpdateBackingAndHierarchyTraversal();
     
    25812581void RenderLayer::updateCompositingLayersAfterScroll()
    25822582{
    2583     if (compositor().usesCompositing()) {
     2583    if (compositor().hasContentCompositingLayers()) {
    25842584        // Our stacking container is guaranteed to contain all of our descendants that may need
    25852585        // repositioning, so update compositing layers from there.
     
    66446644{
    66456645    stream.nextLine();
    6646     stream << "(S)tacking Context, (N)ormal flow only, (O)verflow clip, (A)lpha (opacity or mask), has (B)lend mode, (I)solates blending, (T)ransform-ish, (F)ilter, Fi(X)ed position, (C)omposited\n"
     6646    stream << "(S)tacking Context, (N)ormal flow only, (O)verflow clip, (A)lpha (opacity or mask), has (B)lend mode, (I)solates blending, (T)ransform-ish, (F)ilter, Fi(X)ed position, (C)omposited, (c)omposited descendant\n"
    66476647        "Dirty (z)-lists, Dirty (n)ormal flow lists\n"
    66486648        "Descendant needs overlap (t)raversal, Descendant needs (b)acking or hierarchy update, All descendants need (r)equirements traversal, All (s)ubsequent layers need requirements traversal, All descendants need (h)ierarchy traversal\n"
     
    66716671    stream << (layer.renderer().isFixedPositioned() ? "X" : "-");
    66726672    stream << (layer.isComposited() ? "C" : "-");
     6673    stream << (layer.hasCompositingDescendant() ? "c" : "-");
    66736674
    66746675    stream << " ";
  • trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp

    r238523 r238583  
    11711171    Vector<Ref<GraphicsLayer>> layerChildren;
    11721172    auto& childList = layerBacking ? layerChildren : childLayersOfEnclosingLayer;
    1173     // FIXME: why the !layerBacking check?
    1174     bool requireDescendantTraversal = !layerBacking || layer.needsCompositingLayerConnection() || layer.hasDescendantNeedingUpdateBackingOrHierarchyTraversal() || !updateLevel.isEmpty();
     1173
     1174    bool requireDescendantTraversal = layer.hasDescendantNeedingUpdateBackingOrHierarchyTraversal()
     1175        || (layer.hasCompositingDescendant() && (!layerBacking || layer.needsCompositingLayerConnection() || !updateLevel.isEmpty()));
    11751176
    11761177#if !ASSERT_DISABLED
     
    11781179#endif
    11791180   
     1181    auto appendForegroundLayerIfNecessary = [&] () {
     1182        // If a negative z-order child is compositing, we get a foreground layer which needs to get parented.
     1183        if (layer.negativeZOrderLayers().size()) {
     1184            if (layerBacking && layerBacking->foregroundLayer())
     1185                childList.append(*layerBacking->foregroundLayer());
     1186        }
     1187    };
     1188
    11801189    if (requireDescendantTraversal) {
    11811190        for (auto* renderLayer : layer.negativeZOrderLayers())
    11821191            updateBackingAndHierarchy(*renderLayer, childList, updateLevel, depth + 1);
    11831192
    1184             // If a negative z-order child is compositing, we get a foreground layer which needs to get parented.
    1185         if (layer.negativeZOrderLayers().size()) {
    1186             if (layerBacking && layerBacking->foregroundLayer())
    1187                 childList.append(*layerBacking->foregroundLayer());
    1188         }
     1193        appendForegroundLayerIfNecessary();
    11891194
    11901195        for (auto* renderLayer : layer.normalFlowLayers())
     
    11931198        for (auto* renderLayer : layer.positiveZOrderLayers())
    11941199            updateBackingAndHierarchy(*renderLayer, childList, updateLevel, depth + 1);
    1195     }
     1200    } else
     1201        appendForegroundLayerIfNecessary();
    11961202
    11971203    if (layerBacking) {
     
    13711377        layer.setNeedsPostLayoutCompositingUpdate();
    13721378
    1373     if (diff >= StyleDifference::LayoutPositionedMovementOnly && usesCompositing()) {
     1379    if (diff >= StyleDifference::LayoutPositionedMovementOnly && hasContentCompositingLayers()) {
    13741380        layer.setNeedsPostLayoutCompositingUpdate();
    13751381        layer.setNeedsCompositingGeometryUpdate();
Note: See TracChangeset for help on using the changeset viewer.