Changeset 181247 in webkit


Ignore:
Timestamp:
Mar 8, 2015 4:39:16 PM (9 years ago)
Author:
Simon Fraser
Message:

Don't call RenderLayerCompositor::needsToBeComposited() so many times
https://bugs.webkit.org/show_bug.cgi?id=142441

Reviewed by Brent Fulgham.

Save one call to needsToBeComposited() per RenderLayer while rebuilding compositing
layers, and a call to isRunningAcceleratedTransformAnimation() in some cases.

computeCompositingRequirements() already knows if the layer will be composited, so
pass that to updateBacking() in the form of a "yes/no/don't" know enum. However,
since updateBacking() no longer calls needsToBeComposited(), we need to call
requiresCompositingForPosition() to get the viewportConstrainedNotCompositedReason flags.

isRunningAcceleratedTransformAnimation() will only be true for a layer which has a
direct compositing reason, so only call isRunningAcceleratedTransformAnimation()
in that case.

  • rendering/RenderLayerCompositor.cpp:

(WebCore::rendererForCompositingTests):
(WebCore::RenderLayerCompositor::updateBacking):
(WebCore::RenderLayerCompositor::computeCompositingRequirements):
(WebCore::RenderLayerCompositor::requiresCompositingLayer): Use references.
(WebCore::RenderLayerCompositor::reasonsForCompositing): Use references.

  • rendering/RenderLayerCompositor.h:
Location:
trunk/Source/WebCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r181245 r181247  
     12015-03-08  Simon Fraser  <simon.fraser@apple.com>
     2
     3        Don't call RenderLayerCompositor::needsToBeComposited() so many times
     4        https://bugs.webkit.org/show_bug.cgi?id=142441
     5
     6        Reviewed by Brent Fulgham.
     7
     8        Save one call to needsToBeComposited() per RenderLayer while rebuilding compositing
     9        layers, and a call to isRunningAcceleratedTransformAnimation() in some cases.
     10       
     11        computeCompositingRequirements() already knows if the layer will be composited, so
     12        pass that to updateBacking() in the form of a "yes/no/don't" know enum. However,
     13        since updateBacking() no longer calls needsToBeComposited(), we need to call
     14        requiresCompositingForPosition() to get the viewportConstrainedNotCompositedReason flags.
     15       
     16        isRunningAcceleratedTransformAnimation() will only be true for a layer which has a
     17        direct compositing reason, so only call isRunningAcceleratedTransformAnimation()
     18        in that case.
     19       
     20        * rendering/RenderLayerCompositor.cpp:
     21        (WebCore::rendererForCompositingTests):
     22        (WebCore::RenderLayerCompositor::updateBacking):
     23        (WebCore::RenderLayerCompositor::computeCompositingRequirements):
     24        (WebCore::RenderLayerCompositor::requiresCompositingLayer): Use references.
     25        (WebCore::RenderLayerCompositor::reasonsForCompositing): Use references.
     26        * rendering/RenderLayerCompositor.h:
     27
    1282015-03-08  Simon Fraser  <simon.fraser@apple.com>
    229
  • trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp

    r181245 r181247  
    944944}
    945945
    946 bool RenderLayerCompositor::updateBacking(RenderLayer& layer, CompositingChangeRepaint shouldRepaint)
     946static RenderLayerModelObject& rendererForCompositingTests(const RenderLayer& layer)
     947{
     948    RenderLayerModelObject* renderer = &layer.renderer();
     949
     950    // The compositing state of a reflection should match that of its reflected layer.
     951    if (layer.isReflection())
     952        renderer = downcast<RenderLayerModelObject>(renderer->parent()); // The RenderReplica's parent is the object being reflected.
     953
     954    return *renderer;
     955}
     956
     957bool RenderLayerCompositor::updateBacking(RenderLayer& layer, CompositingChangeRepaint shouldRepaint, BackingRequired backingRequired)
    947958{
    948959    bool layerChanged = false;
    949960    RenderLayer::ViewportConstrainedNotCompositedReason viewportConstrainedNotCompositedReason = RenderLayer::NoNotCompositedReason;
    950961
    951     if (needsToBeComposited(layer, &viewportConstrainedNotCompositedReason)) {
     962    if (backingRequired == BackingRequired::Unknown)
     963        backingRequired = needsToBeComposited(layer, &viewportConstrainedNotCompositedReason) ? BackingRequired::Yes : BackingRequired::No;
     964    else {
     965        // Need to fetch viewportConstrainedNotCompositedReason, but without doing all the work that needsToBeComposited does.
     966        requiresCompositingForPosition(rendererForCompositingTests(layer), layer, &viewportConstrainedNotCompositedReason);
     967    }
     968
     969    if (backingRequired == BackingRequired::Yes) {
    952970        enableCompositingMode();
    953971       
     
    12441262    layer.setIndirectCompositingReason(RenderLayer::IndirectCompositingReason::None);
    12451263
    1246     // Check if the layer needs to be composited for non-indirect reasons (ex. 3D transform).
    1247     // We use this value to avoid checking the overlap-map, if we know for sure the layer
     1264    // Check if the layer needs to be composited for direct reasons (e.g. 3D transform).
     1265    // We use this value to avoid checking the overlap map, if we know for sure the layer
    12481266    // is already going to be composited for other reasons.
    12491267    bool willBeComposited = needsToBeComposited(layer);
     1268    bool mayHaveAnimatedTransform = willBeComposited && !layer.isRootLayer();
    12501269
    12511270    RenderLayer::IndirectCompositingReason compositingReason = compositingState.subtreeIsCompositing ? RenderLayer::IndirectCompositingReason::Stacking : RenderLayer::IndirectCompositingReason::None;
     
    13971416    // Note that if the layer clips its descendants, there's no reason to propagate the child animation to the parent layers. That's because
    13981417    // we know for sure the animation is contained inside the clipping rectangle, which is already added to the overlap map.
    1399     if ((!childState.testingOverlap && !isCompositedClippingLayer) || isRunningAcceleratedTransformAnimation(layer.renderer()))
     1418    if ((!childState.testingOverlap && !isCompositedClippingLayer) || (mayHaveAnimatedTransform && isRunningAcceleratedTransformAnimation(layer.renderer())))
    14001419        compositingState.testingOverlap = false;
    14011420   
     
    14351454
    14361455    // Update backing now, so that we can use isComposited() reliably during tree traversal in rebuildCompositingLayerTree().
    1437     if (updateBacking(layer, CompositingChangeRepaintNow))
     1456    if (updateBacking(layer, CompositingChangeRepaintNow, willBeComposited ? BackingRequired::Yes : BackingRequired::No))
    14381457        layersChanged = true;
    14391458
     
    21372156bool RenderLayerCompositor::requiresCompositingLayer(const RenderLayer& layer, RenderLayer::ViewportConstrainedNotCompositedReason* viewportConstrainedNotCompositedReason) const
    21382157{
    2139     auto* renderer = &layer.renderer();
    2140 
    2141     // The compositing state of a reflection should match that of its reflected layer.
    2142     if (layer.isReflection())
    2143         renderer = downcast<RenderLayerModelObject>(renderer->parent()); // The RenderReplica's parent is the object being reflected.
     2158    auto& renderer = rendererForCompositingTests(layer);
    21442159
    21452160    // The root layer always has a compositing layer, but it may not have backing.
    2146     return requiresCompositingForTransform(*renderer)
    2147         || requiresCompositingForVideo(*renderer)
    2148         || requiresCompositingForCanvas(*renderer)
    2149         || requiresCompositingForPlugin(*renderer)
    2150         || requiresCompositingForFrame(*renderer)
    2151         || requiresCompositingForBackfaceVisibility(*renderer)
    2152         || clipsCompositingDescendants(*renderer->layer())
    2153         || requiresCompositingForAnimation(*renderer)
    2154         || requiresCompositingForFilters(*renderer)
    2155         || requiresCompositingForPosition(*renderer, *renderer->layer(), viewportConstrainedNotCompositedReason)
     2161    return requiresCompositingForTransform(renderer)
     2162        || requiresCompositingForVideo(renderer)
     2163        || requiresCompositingForCanvas(renderer)
     2164        || requiresCompositingForPlugin(renderer)
     2165        || requiresCompositingForFrame(renderer)
     2166        || requiresCompositingForBackfaceVisibility(renderer)
     2167        || clipsCompositingDescendants(*renderer.layer())
     2168        || requiresCompositingForAnimation(renderer)
     2169        || requiresCompositingForFilters(renderer)
     2170        || requiresCompositingForPosition(renderer, *renderer.layer(), viewportConstrainedNotCompositedReason)
    21562171#if PLATFORM(IOS)
    2157         || requiresCompositingForScrolling(*renderer->layer())
    2158 #endif
    2159         || requiresCompositingForOverflowScrolling(*renderer->layer());
     2172        || requiresCompositingForScrolling(*renderer.layer())
     2173#endif
     2174        || requiresCompositingForOverflowScrolling(*renderer.layer());
    21602175}
    21612176
     
    22302245        return reasons;
    22312246
    2232     auto* renderer = &layer.renderer();
    2233     if (layer.isReflection())
    2234         renderer = downcast<RenderLayerModelObject>(renderer->parent());
    2235 
    2236     if (requiresCompositingForTransform(*renderer))
     2247    auto& renderer = rendererForCompositingTests(layer);
     2248
     2249    if (requiresCompositingForTransform(renderer))
    22372250        reasons |= CompositingReason3DTransform;
    22382251
    2239     if (requiresCompositingForVideo(*renderer))
     2252    if (requiresCompositingForVideo(renderer))
    22402253        reasons |= CompositingReasonVideo;
    2241     else if (requiresCompositingForCanvas(*renderer))
     2254    else if (requiresCompositingForCanvas(renderer))
    22422255        reasons |= CompositingReasonCanvas;
    2243     else if (requiresCompositingForPlugin(*renderer))
     2256    else if (requiresCompositingForPlugin(renderer))
    22442257        reasons |= CompositingReasonPlugin;
    2245     else if (requiresCompositingForFrame(*renderer))
     2258    else if (requiresCompositingForFrame(renderer))
    22462259        reasons |= CompositingReasonIFrame;
    22472260   
    2248     if ((canRender3DTransforms() && renderer->style().backfaceVisibility() == BackfaceVisibilityHidden))
     2261    if ((canRender3DTransforms() && renderer.style().backfaceVisibility() == BackfaceVisibilityHidden))
    22492262        reasons |= CompositingReasonBackfaceVisibilityHidden;
    22502263
    2251     if (clipsCompositingDescendants(*renderer->layer()))
     2264    if (clipsCompositingDescendants(*renderer.layer()))
    22522265        reasons |= CompositingReasonClipsCompositingDescendants;
    22532266
    2254     if (requiresCompositingForAnimation(*renderer))
     2267    if (requiresCompositingForAnimation(renderer))
    22552268        reasons |= CompositingReasonAnimation;
    22562269
    2257     if (requiresCompositingForFilters(*renderer))
     2270    if (requiresCompositingForFilters(renderer))
    22582271        reasons |= CompositingReasonFilters;
    22592272
    2260     if (requiresCompositingForPosition(*renderer, *renderer->layer()))
    2261         reasons |= renderer->style().position() == FixedPosition ? CompositingReasonPositionFixed : CompositingReasonPositionSticky;
     2273    if (requiresCompositingForPosition(renderer, *renderer.layer()))
     2274        reasons |= renderer.style().position() == FixedPosition ? CompositingReasonPositionFixed : CompositingReasonPositionSticky;
    22622275
    22632276#if PLATFORM(IOS)
    2264     if (requiresCompositingForScrolling(*renderer->layer()))
     2277    if (requiresCompositingForScrolling(*renderer.layer()))
    22652278        reasons |= CompositingReasonOverflowScrollingTouch;
    22662279#endif
    22672280
    2268     if (requiresCompositingForOverflowScrolling(*renderer->layer()))
     2281    if (requiresCompositingForOverflowScrolling(*renderer.layer()))
    22692282        reasons |= CompositingReasonOverflowScrollingTouch;
    22702283
    2271     switch (renderer->layer()->indirectCompositingReason()) {
     2284    switch (renderer.layer()->indirectCompositingReason()) {
    22722285    case RenderLayer::IndirectCompositingReason::None:
    22732286        break;
     
    22822295        break;
    22832296    case RenderLayer::IndirectCompositingReason::GraphicalEffect:
    2284         if (renderer->hasTransform())
     2297        if (renderer.hasTransform())
    22852298            reasons |= CompositingReasonTransformWithCompositedDescendants;
    22862299
    2287         if (renderer->isTransparent())
     2300        if (renderer.isTransparent())
    22882301            reasons |= CompositingReasonOpacityWithCompositedDescendants;
    22892302
    2290         if (renderer->hasMask())
     2303        if (renderer.hasMask())
    22912304            reasons |= CompositingReasonMaskWithCompositedDescendants;
    22922305
    2293         if (renderer->hasReflection())
     2306        if (renderer.hasReflection())
    22942307            reasons |= CompositingReasonReflectionWithCompositedDescendants;
    22952308
    2296         if (renderer->hasFilter() || renderer->hasBackdropFilter())
     2309        if (renderer.hasFilter() || renderer.hasBackdropFilter())
    22972310            reasons |= CompositingReasonFilterWithCompositedDescendants;
    22982311
     
    23132326    }
    23142327
    2315     if (inCompositingMode() && renderer->layer()->isRootLayer())
     2328    if (inCompositingMode() && renderer.layer()->isRootLayer())
    23162329        reasons |= CompositingReasonRoot;
    23172330
  • trunk/Source/WebCore/rendering/RenderLayerCompositor.h

    r181245 r181247  
    294294    void setShouldReevaluateCompositingAfterLayout() { m_reevaluateCompositingAfterLayout = true; }
    295295
    296     bool viewHasTransparentBackground(Color* backgroundColor = 0) const;
     296    bool viewHasTransparentBackground(Color* backgroundColor = nullptr) const;
    297297
    298298    bool hasNonMainLayersWithTiledBacking() const { return m_layersWithTiledBackingCount; }
     
    323323
    324324    // Whether the given RL needs a compositing layer.
    325     bool needsToBeComposited(const RenderLayer&, RenderLayer::ViewportConstrainedNotCompositedReason* = 0) const;
     325    bool needsToBeComposited(const RenderLayer&, RenderLayer::ViewportConstrainedNotCompositedReason* = nullptr) const;
    326326    // Whether the layer has an intrinsic need for compositing layer.
    327     bool requiresCompositingLayer(const RenderLayer&, RenderLayer::ViewportConstrainedNotCompositedReason* = 0) const;
     327    bool requiresCompositingLayer(const RenderLayer&, RenderLayer::ViewportConstrainedNotCompositedReason* = nullptr) const;
    328328    // Whether the layer could ever be composited.
    329329    bool canBeComposited(const RenderLayer&) const;
    330330
    331331    // Make or destroy the backing for this layer; returns true if backing changed.
    332     bool updateBacking(RenderLayer&, CompositingChangeRepaint shouldRepaint);
     332    enum class BackingRequired { No, Yes, Unknown };
     333    bool updateBacking(RenderLayer&, CompositingChangeRepaint shouldRepaint, BackingRequired = BackingRequired::Unknown);
    333334
    334335    void clearBackingForLayerIncludingDescendants(RenderLayer&);
     
    411412    bool requiresCompositingForFilters(RenderLayerModelObject&) const;
    412413    bool requiresCompositingForScrollableFrame() const;
    413     bool requiresCompositingForPosition(RenderLayerModelObject&, const RenderLayer&, RenderLayer::ViewportConstrainedNotCompositedReason* = 0) const;
     414    bool requiresCompositingForPosition(RenderLayerModelObject&, const RenderLayer&, RenderLayer::ViewportConstrainedNotCompositedReason* = nullptr) const;
    414415    bool requiresCompositingForOverflowScrolling(const RenderLayer&) const;
    415416    bool requiresCompositingForIndirectReason(RenderLayerModelObject&, bool hasCompositedDescendants, bool has3DTransformedDescendants, RenderLayer::IndirectCompositingReason&) const;
Note: See TracChangeset for help on using the changeset viewer.