Changeset 244209 in webkit


Ignore:
Timestamp:
Apr 11, 2019 10:28:50 PM (5 years ago)
Author:
Simon Fraser
Message:

Avoid doing positioned scrolling tree node work for layers not inside overflow:scroll
https://bugs.webkit.org/show_bug.cgi?id=196848

Reviewed by Zalan Bujtas.

Maintain a bit on RenderLayer which says if a layer has a composited scrolling ancestor
in the layer tree. We only need to do work related to making positioned scrolling tree nodes
for layers which are layer tree descendants of overflow:scroll.

  • rendering/RenderLayer.cpp:

(WebCore::RenderLayer::RenderLayer):
(WebCore::RenderLayer::updateLayerPositions):
(WebCore::outputPaintOrderTreeLegend):
(WebCore::outputPaintOrderTreeRecursive):

  • rendering/RenderLayer.h:
  • rendering/RenderLayerCompositor.cpp:

(WebCore::RenderLayerCompositor::requiresCompositingForPosition const):
(WebCore::RenderLayerCompositor::requiresCompositingForIndirectReason const):
(WebCore::RenderLayerCompositor::isViewportConstrainedFixedOrStickyLayer const):
(WebCore::RenderLayerCompositor::fixedLayerIntersectsViewport const):
(WebCore::RenderLayerCompositor::computeCoordinatedPositioningForLayer const):

Location:
trunk/Source/WebCore
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r244208 r244209  
     12019-04-11  Simon Fraser  <simon.fraser@apple.com>
     2
     3        Avoid doing positioned scrolling tree node work for layers not inside overflow:scroll
     4        https://bugs.webkit.org/show_bug.cgi?id=196848
     5
     6        Reviewed by Zalan Bujtas.
     7
     8        Maintain a bit on RenderLayer which says if a layer has a composited scrolling ancestor
     9        in the layer tree. We only need to do work related to making positioned scrolling tree nodes
     10        for layers which are layer tree descendants of overflow:scroll.
     11
     12        * rendering/RenderLayer.cpp:
     13        (WebCore::RenderLayer::RenderLayer):
     14        (WebCore::RenderLayer::updateLayerPositions):
     15        (WebCore::outputPaintOrderTreeLegend):
     16        (WebCore::outputPaintOrderTreeRecursive):
     17        * rendering/RenderLayer.h:
     18        * rendering/RenderLayerCompositor.cpp:
     19        (WebCore::RenderLayerCompositor::requiresCompositingForPosition const):
     20        (WebCore::RenderLayerCompositor::requiresCompositingForIndirectReason const):
     21        (WebCore::RenderLayerCompositor::isViewportConstrainedFixedOrStickyLayer const):
     22        (WebCore::RenderLayerCompositor::fixedLayerIntersectsViewport const):
     23        (WebCore::RenderLayerCompositor::computeCoordinatedPositioningForLayer const):
     24
    1252019-04-11  Zalan Bujtas  <zalan@apple.com>
    226
  • trunk/Source/WebCore/rendering/RenderLayer.cpp

    r244141 r244209  
    292292    , m_has3DTransformedDescendant(false)
    293293    , m_hasCompositingDescendant(false)
     294    , m_hasCompositedScrollingAncestor(false)
    294295    , m_hasTransformedAncestor(false)
    295296    , m_has3DTransformedAncestor(false)
     
    912913    m_hasTransformedAncestor = flags.contains(SeenTransformedLayer);
    913914    m_has3DTransformedAncestor = flags.contains(Seen3DTransformedLayer);
     915    setHasCompositedScrollingAncestor(flags.contains(SeenCompositedScrollingLayer));
    914916
    915917    // Update the reflection's position and size.
     
    927929            flags.add(Seen3DTransformedLayer);
    928930    }
     931   
     932    if (hasCompositedScrollableOverflow())
     933        flags.add(SeenCompositedScrollingLayer);
    929934
    930935    for (RenderLayer* child = firstChild(); child; child = child->nextSibling())
     
    940945    }
    941946
    942     if (renderer().isOutOfFlowPositioned() && renderer().style().position() == PositionType::Fixed && renderer().settings().acceleratedCompositingForFixedPositionEnabled()) {
     947    if (renderer().isFixedPositioned() && renderer().settings().acceleratedCompositingForFixedPositionEnabled()) {
    943948        bool intersectsViewport = compositor().fixedLayerIntersectsViewport(*this);
    944949        if (intersectsViewport != m_isFixedIntersectingViewport) {
     
    67516756{
    67526757    stream.nextLine();
    6753     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"
     6758    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, (s)scrolling ancestor\n"
    67546759        "Dirty (z)-lists, Dirty (n)ormal flow lists\n"
    67556760        "Traversal needs: requirements (t)raversal on descendants, (b)acking or hierarchy traversal on descendants, (r)equirements traversal on all descendants, requirements traversal on all (s)ubsequent layers, (h)ierarchy traversal on all descendants, update of paint (o)rder children\n"
     
    67786783    stream << (layer.isComposited() ? "C" : "-");
    67796784    stream << (layer.hasCompositingDescendant() ? "c" : "-");
     6785    stream << (layer.hasCompositedScrollingAncestor() ? "s" : "-");
    67806786
    67816787    stream << " ";
  • trunk/Source/WebCore/rendering/RenderLayer.h

    r243962 r244209  
    517517        SeenTransformedLayer                = 1 << 4,
    518518        Seen3DTransformedLayer              = 1 << 5,
     519        SeenCompositedScrollingLayer        = 1 << 6,
    519520    };
    520521    static constexpr OptionSet<UpdateLayerPositionsFlag> updateLayerPositionsDefaultFlags() { return { CheckForRepaint }; }
     
    815816    bool usesAsyncScrolling() const override;
    816817
     818    bool hasCompositedScrollingAncestor() const { return m_hasCompositedScrollingAncestor; }
     819    void setHasCompositedScrollingAncestor(bool hasCompositedScrollingAncestor) { m_hasCompositedScrollingAncestor = hasCompositedScrollingAncestor; }
     820
    817821    bool paintsWithTransparency(OptionSet<PaintBehavior> paintBehavior) const
    818822    {
     
    12021206    bool m_hasCompositingDescendant : 1; // In the z-order tree.
    12031207
     1208    bool m_hasCompositedScrollingAncestor : 1; // In the layer-order tree.
     1209
    12041210    bool m_hasTransformedAncestor : 1;
    12051211    bool m_has3DTransformedAncestor : 1;
  • trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp

    r244182 r244209  
    27162716
    27172717    auto position = renderer.style().position();
    2718     bool isFixed = renderer.isOutOfFlowPositioned() && position == PositionType::Fixed;
     2718    bool isFixed = renderer.isFixedPositioned();
    27192719    if (isFixed && !layer.isStackingContext())
    27202720        return false;
     
    28012801    }
    28022802
    2803     if (renderer.isAbsolutelyPositioned() && compositingAncestor) {
     2803    if (renderer.isAbsolutelyPositioned() && compositingAncestor && layer.hasCompositedScrollingAncestor()) {
    28042804        if (layerContainingBlockCrossesCoordinatedScrollingBoundary(layer, *compositingAncestor)) {
    28052805            reason = RenderLayer::IndirectCompositingReason::OverflowScrollPositioning;
     
    28632863        return isAsyncScrollableStickyLayer(layer);
    28642864
    2865     if (layer.renderer().style().position() != PositionType::Fixed)
     2865    if (!layer.renderer().isFixedPositioned())
    28662866        return false;
    28672867
     
    28772877bool RenderLayerCompositor::fixedLayerIntersectsViewport(const RenderLayer& layer) const
    28782878{
    2879     ASSERT(layer.renderer().style().position() == PositionType::Fixed);
     2879    ASSERT(layer.renderer().isFixedPositioned());
    28802880
    28812881    // Fixed position elements that are invisible in the current view don't get their own layer.
     
    29472947
    29482948    if (layer.renderer().isFixedPositioned())
     2949        return ScrollPositioningBehavior::None;
     2950   
     2951    if (!layer.hasCompositedScrollingAncestor())
    29492952        return ScrollPositioningBehavior::None;
    29502953
Note: See TracChangeset for help on using the changeset viewer.