Changeset 215347 in webkit


Ignore:
Timestamp:
Apr 13, 2017 4:20:50 PM (7 years ago)
Author:
Antti Koivisto
Message:

Don't invalidate composition for style changes in non-composited layers
https://bugs.webkit.org/show_bug.cgi?id=170805
<rdar://problem/31606185>

Reviewed by Simon Fraser.

Source/WebCore:

Test: compositing/updates/animation-non-composited.html

In most cases they can't affect composition. Composition updates are expensive, this can
save a lot of work (tumblr.com animations hit this at the moment).

  • rendering/RenderElement.h:

(WebCore::RenderElement::createsGroup):
(WebCore::RenderElement::createsGroupForStyle):

Factor to a static function so we can test style directly.

  • rendering/RenderLayerCompositor.cpp:

(WebCore::RenderLayerCompositor::layerStyleChanged):
(WebCore::RenderLayerCompositor::styleChangeMayAffectIndirectCompositingReasons):

Test if style change might cause compositing change that can't be determined without compositing update.

  • rendering/RenderLayerCompositor.h:

LayoutTests:

  • compositing/updates/animation-non-composited-expected.txt: Added.
  • compositing/updates/animation-non-composited.html: Added.
Location:
trunk
Files:
2 added
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r215344 r215347  
     12017-04-13  Antti Koivisto  <antti@apple.com>
     2
     3        Don't invalidate composition for style changes in non-composited layers
     4        https://bugs.webkit.org/show_bug.cgi?id=170805
     5        <rdar://problem/31606185>
     6
     7        Reviewed by Simon Fraser.
     8
     9        * compositing/updates/animation-non-composited-expected.txt: Added.
     10        * compositing/updates/animation-non-composited.html: Added.
     11
    1122017-04-13  Ryan Haddad  <ryanhaddad@apple.com>
    213
  • trunk/Source/WebCore/ChangeLog

    r215340 r215347  
     12017-04-13  Antti Koivisto  <antti@apple.com>
     2
     3        Don't invalidate composition for style changes in non-composited layers
     4        https://bugs.webkit.org/show_bug.cgi?id=170805
     5        <rdar://problem/31606185>
     6
     7        Reviewed by Simon Fraser.
     8
     9        Test: compositing/updates/animation-non-composited.html
     10
     11        In most cases they can't affect composition. Composition updates are expensive, this can
     12        save a lot of work (tumblr.com animations hit this at the moment).
     13
     14        * rendering/RenderElement.h:
     15        (WebCore::RenderElement::createsGroup):
     16        (WebCore::RenderElement::createsGroupForStyle):
     17
     18            Factor to a static function so we can test style directly.
     19
     20        * rendering/RenderLayerCompositor.cpp:
     21        (WebCore::RenderLayerCompositor::layerStyleChanged):
     22        (WebCore::RenderLayerCompositor::styleChangeMayAffectIndirectCompositingReasons):
     23
     24            Test if style change might cause compositing change that can't be determined without compositing update.
     25
     26        * rendering/RenderLayerCompositor.h:
     27
    1282017-04-13  JF Bastien  <jfbastien@apple.com>
    229
  • trunk/Source/WebCore/rendering/RenderElement.h

    r214503 r215347  
    141141
    142142    // Returns true if this renderer requires a new stacking context.
    143     bool createsGroup() const { return isTransparent() || hasMask() || hasClipPath() || hasFilter() || hasBackdropFilter() || hasBlendMode(); }
     143    static bool createsGroupForStyle(const RenderStyle&);
     144    bool createsGroup() const { return createsGroupForStyle(style()); }
    144145
    145146    bool isTransparent() const { return style().opacity() < 1.0f; }
     
    445446}
    446447
     448inline bool RenderElement::createsGroupForStyle(const RenderStyle& style)
     449{
     450    return style.opacity() < 1.0f || style.hasMask() || style.clipPath() || style.hasFilter() || style.hasBackdropFilter() || style.hasBlendMode();
     451}
     452
    447453inline bool RenderObject::isRenderLayerModelObject() const
    448454{
  • trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp

    r215173 r215347  
    925925        return;
    926926
    927     m_layerNeedsCompositingUpdate = true;
    928 
    929927    const RenderStyle& newStyle = layer.renderer().style();
    930     if (updateLayerCompositingState(layer) || (oldStyle && styleChangeRequiresLayerRebuild(layer, *oldStyle, newStyle)))
     928    if (updateLayerCompositingState(layer) || (oldStyle && styleChangeRequiresLayerRebuild(layer, *oldStyle, newStyle))) {
    931929        setCompositingLayersNeedRebuild();
    932     else if (layer.isComposited()) {
     930        m_layerNeedsCompositingUpdate = true;
     931        return;
     932    }
     933
     934    if (layer.isComposited()) {
    933935        // FIXME: updating geometry here is potentially harmful, because layout is not up-to-date.
    934936        layer.backing()->updateGeometry();
    935937        layer.backing()->updateAfterDescendants();
     938        m_layerNeedsCompositingUpdate = true;
     939        return;
     940    }
     941
     942    // We don't have any direct reasons for this style change to affect layer composition. Test if it might affect things indirectly.
     943    if (oldStyle && styleChangeMayAffectIndirectCompositingReasons(layer.renderer(), *oldStyle)) {
     944        m_layerNeedsCompositingUpdate = true;
     945        return;
     946    }
     947
     948    if (layer.isRootLayer()) {
     949        // Needed for scroll bars.
     950        m_layerNeedsCompositingUpdate = true;
    936951    }
    937952}
     
    26012616}
    26022617
     2618bool RenderLayerCompositor::styleChangeMayAffectIndirectCompositingReasons(const RenderLayerModelObject& renderer, const RenderStyle& oldStyle)
     2619{
     2620    if (renderer.isRenderNamedFlowFragmentContainer())
     2621        return true;
     2622
     2623    auto& style = renderer.style();
     2624    if (RenderElement::createsGroupForStyle(style) != RenderElement::createsGroupForStyle(oldStyle))
     2625        return true;
     2626    if (style.isolation() != oldStyle.isolation())
     2627        return true;
     2628    if (style.hasTransform() != oldStyle.hasTransform())
     2629        return true;
     2630    if (style.boxReflect() != oldStyle.boxReflect())
     2631        return true;
     2632    if (style.transformStyle3D() != oldStyle.transformStyle3D())
     2633        return true;
     2634    if (style.hasPerspective() != oldStyle.hasPerspective())
     2635        return true;
     2636
     2637    return false;
     2638}
     2639
    26032640bool RenderLayerCompositor::requiresCompositingForFilters(RenderLayerModelObject& renderer) const
    26042641{
  • trunk/Source/WebCore/rendering/RenderLayerCompositor.h

    r211683 r215347  
    432432    bool requiresCompositingForOverflowScrolling(const RenderLayer&) const;
    433433    bool requiresCompositingForIndirectReason(RenderLayerModelObject&, bool hasCompositedDescendants, bool has3DTransformedDescendants, RenderLayer::IndirectCompositingReason&) const;
     434    static bool styleChangeMayAffectIndirectCompositingReasons(const RenderLayerModelObject& renderer, const RenderStyle& oldStyle);
    434435
    435436#if PLATFORM(IOS)
Note: See TracChangeset for help on using the changeset viewer.