Changeset 168119 in webkit


Ignore:
Timestamp:
May 1, 2014 1:56:21 PM (10 years ago)
Author:
Simon Fraser
Message:

Don't always make backing store for -webkit-backface-visibility:hidden
https://bugs.webkit.org/show_bug.cgi?id=132420

Reviewed by Sam Weinig.

Source/WebCore:
Previously, -webkit-backface-visibility:hidden unconditionally created
compositing layers with backing store. This results in high memory use
on pages with this style applied to many elements (a cargo-cult "optimization").

Fix by only having -webkit-backface-visibility:hidden create compositing layers
if some ancestor has a 3D transform. That's the only scenario in which the
element can be flipped around to reveal the back side, so the only time we need
to do compositing for this property. In future, we could be smarter, and only
consider 3D transforms in the current preserve-3d context.

Tests: compositing/backing/backface-visibility-in-3dtransformed.html

compositing/backing/backface-visibility-in-transformed.html
compositing/backing/backface-visibility.html

  • rendering/RenderLayer.cpp:

(WebCore::RenderLayer::RenderLayer):
(WebCore::RenderLayer::updateLayerPositions):
(WebCore::RenderLayer::hitTestLayer):

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

(WebCore::RenderLayerCompositor::requiresCompositingLayer):
(WebCore::RenderLayerCompositor::requiresOwnBackingStore):
(WebCore::RenderLayerCompositor::requiresCompositingForBackfaceVisibility):

  • rendering/RenderLayerCompositor.h:

LayoutTests:
Dump layers for elements with backface-visibility: hidden with various types
of ancestors.

  • compositing/backing/backface-visibility-expected.txt: Added.
  • compositing/backing/backface-visibility-in-3dtransformed-expected.txt: Added.
  • compositing/backing/backface-visibility-in-3dtransformed.html: Added.
  • compositing/backing/backface-visibility-in-transformed-expected.txt: Added.
  • compositing/backing/backface-visibility-in-transformed.html: Added.
  • compositing/backing/backface-visibility.html: Added.
  • inspector-protocol/layers/layers-anonymous.html: Don't use backface-visibility

for force a layer.

Location:
trunk
Files:
6 added
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r168112 r168119  
     12014-05-01  Simon Fraser  <simon.fraser@apple.com>
     2
     3        Don't always make backing store for -webkit-backface-visibility:hidden
     4        https://bugs.webkit.org/show_bug.cgi?id=132420
     5
     6        Reviewed by Sam Weinig.
     7       
     8        Dump layers for elements with backface-visibility: hidden with various types
     9        of ancestors.
     10
     11        * compositing/backing/backface-visibility-expected.txt: Added.
     12        * compositing/backing/backface-visibility-in-3dtransformed-expected.txt: Added.
     13        * compositing/backing/backface-visibility-in-3dtransformed.html: Added.
     14        * compositing/backing/backface-visibility-in-transformed-expected.txt: Added.
     15        * compositing/backing/backface-visibility-in-transformed.html: Added.
     16        * compositing/backing/backface-visibility.html: Added.
     17        * inspector-protocol/layers/layers-anonymous.html: Don't use backface-visibility
     18        for force a layer.
     19
    1202014-05-01  Brent Fulgham  <bfulgham@apple.com>
    221
  • trunk/LayoutTests/inspector-protocol/layers/layers-anonymous.html

    r147538 r168119  
    128128    #first-letter::first-letter {
    129129        float: left;
    130         -webkit-backface-visibility: hidden;
     130        -webkit-transform: translateZ(0);
    131131    }
    132132
  • trunk/Source/WebCore/ChangeLog

    r168115 r168119  
     12014-05-01  Simon Fraser  <simon.fraser@apple.com>
     2
     3        Don't always make backing store for -webkit-backface-visibility:hidden
     4        https://bugs.webkit.org/show_bug.cgi?id=132420
     5
     6        Reviewed by Sam Weinig.
     7       
     8        Previously, -webkit-backface-visibility:hidden unconditionally created
     9        compositing layers with backing store. This results in high memory use
     10        on pages with this style applied to many elements (a cargo-cult "optimization").
     11       
     12        Fix by only having -webkit-backface-visibility:hidden create compositing layers
     13        if some ancestor has a 3D transform. That's the only scenario in which the
     14        element can be flipped around to reveal the back side, so the only time we need
     15        to do compositing for this property. In future, we could be smarter, and only
     16        consider 3D transforms in the current preserve-3d context.
     17
     18        Tests: compositing/backing/backface-visibility-in-3dtransformed.html
     19               compositing/backing/backface-visibility-in-transformed.html
     20               compositing/backing/backface-visibility.html
     21
     22        * rendering/RenderLayer.cpp:
     23        (WebCore::RenderLayer::RenderLayer):
     24        (WebCore::RenderLayer::updateLayerPositions):
     25        (WebCore::RenderLayer::hitTestLayer):
     26        * rendering/RenderLayer.h:
     27        * rendering/RenderLayerCompositor.cpp:
     28        (WebCore::RenderLayerCompositor::requiresCompositingLayer):
     29        (WebCore::RenderLayerCompositor::requiresOwnBackingStore):
     30        (WebCore::RenderLayerCompositor::requiresCompositingForBackfaceVisibility):
     31        * rendering/RenderLayerCompositor.h:
     32
    1332014-05-01  Alex Christensen  <achristensen@webkit.org>
    234
  • trunk/Source/WebCore/rendering/RenderLayer.cpp

    r168076 r168119  
    170170    , m_has3DTransformedDescendant(false)
    171171    , m_hasCompositingDescendant(false)
     172    , m_hasTransformedAncestor(false)
     173    , m_has3DTransformedAncestor(false)
    172174    , m_indirectCompositingReason(NoIndirectCompositingReason)
    173175    , m_viewportConstrainedNotCompositedReason(NoNotCompositedReason)
     
    450452
    451453    m_repaintStatus = NeedsNormalRepaint;
     454    m_hasTransformedAncestor = flags & SeenTransformedLayer;
     455    m_has3DTransformedAncestor = flags & Seen3DTransformedLayer;
    452456
    453457    // Go ahead and update the reflection's position and size.
     
    467471    if (renderer().hasColumns())
    468472        flags |= UpdatePagination;
     473
     474    if (transform()) {
     475        flags |= SeenTransformedLayer;
     476        if (!transform()->isAffine())
     477            flags |= Seen3DTransformedLayer;
     478    }
    469479
    470480    for (RenderLayer* child = firstChild(); child; child = child->nextSibling())
     
    49324942        ASSERT(transformState);
    49334943        localTransformState = const_cast<HitTestingTransformState*>(transformState);
    4934     } else if (transformState || m_has3DTransformedDescendant || preserves3D()) {
     4944    } else if (transformState || has3DTransformedDescendant() || preserves3D()) {
    49354945        // We need transform state for the first time, or to offset the container state, so create it here.
    49364946        localTransformState = createLocalTransformState(rootLayer, containerLayer, hitTestRect, hitTestLocation, transformState);
  • trunk/Source/WebCore/rendering/RenderLayer.h

    r167970 r168119  
    500500        IsCompositingUpdateRoot = 1 << 2,
    501501        UpdateCompositingLayers = 1 << 3,
    502         UpdatePagination = 1 << 4
     502        UpdatePagination = 1 << 4,
     503        SeenTransformedLayer = 1 << 5,
     504        Seen3DTransformedLayer = 1 << 6
    503505    };
    504506    typedef unsigned UpdateLayerPositionsFlags;
     
    11141116    bool checkIfDescendantClippingContextNeedsUpdate(bool isClipping);
    11151117
    1116     // This flag is computed by RenderLayerCompositor, which knows more about 3d hierarchies than we do.
    1117     void setHas3DTransformedDescendant(bool b) { m_has3DTransformedDescendant = b; }
    11181118    bool has3DTransformedDescendant() const { return m_has3DTransformedDescendant; }
    1119    
     1119
     1120    bool hasTransformedAncestor() const { return m_hasTransformedAncestor; }
     1121    bool has3DTransformedAncestor() const { return m_has3DTransformedAncestor; }
     1122
    11201123    void dirty3DTransformedDescendantStatus();
    11211124    // Both updates the status, and returns true if descendants of this have 3d.
     
    12541257                                            // in a preserves3D hierarchy. Hint to do 3D-aware hit testing.
    12551258    bool m_hasCompositingDescendant : 1; // In the z-order tree.
     1259
     1260    bool m_hasTransformedAncestor : 1;
     1261    bool m_has3DTransformedAncestor : 1;
     1262
    12561263    unsigned m_indirectCompositingReason : 3;
    12571264    unsigned m_viewportConstrainedNotCompositedReason : 2;
  • trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp

    r168079 r168119  
    20332033        || requiresCompositingForPlugin(*renderer)
    20342034        || requiresCompositingForFrame(*renderer)
    2035         || (canRender3DTransforms() && renderer->style().backfaceVisibility() == BackfaceVisibilityHidden)
     2035        || requiresCompositingForBackfaceVisibility(*renderer)
    20362036        || clipsCompositingDescendants(*renderer->layer())
    20372037        || requiresCompositingForAnimation(*renderer)
     
    20762076        || requiresCompositingForPlugin(renderer)
    20772077        || requiresCompositingForFrame(renderer)
    2078         || (canRender3DTransforms() && renderer.style().backfaceVisibility() == BackfaceVisibilityHidden)
     2078        || requiresCompositingForBackfaceVisibility(renderer)
    20792079        || requiresCompositingForAnimation(renderer)
    20802080        || requiresCompositingForFilters(renderer)
     
    23412341    // but the renderer may be an inline that doesn't suppport them.
    23422342    return renderer.hasTransform() && renderer.style().transform().has3DOperation();
     2343}
     2344
     2345bool RenderLayerCompositor::requiresCompositingForBackfaceVisibility(RenderLayerModelObject& renderer) const
     2346{
     2347    if (!(m_compositingTriggers & ChromeClient::ThreeDTransformTrigger))
     2348        return false;
     2349
     2350    return renderer.style().backfaceVisibility() == BackfaceVisibilityHidden && renderer.layer()->has3DTransformedAncestor();
    23432351}
    23442352
  • trunk/Source/WebCore/rendering/RenderLayerCompositor.h

    r167316 r168119  
    393393    bool requiresCompositingForAnimation(RenderLayerModelObject&) const;
    394394    bool requiresCompositingForTransform(RenderLayerModelObject&) const;
     395    bool requiresCompositingForBackfaceVisibility(RenderLayerModelObject&) const;
    395396    bool requiresCompositingForVideo(RenderLayerModelObject&) const;
    396397    bool requiresCompositingForCanvas(RenderLayerModelObject&) const;
  • trunk/WebKit.xcworkspace/xcshareddata/xcschemes/All Source (target WebProcess).xcscheme

    r168065 r168119  
    116116            <BuildableReference
    117117               BuildableIdentifier = "primary"
    118                BlueprintIdentifier = "1AD7451818D0D26C006F3A1E"
    119                BuildableName = "WebKit.framework"
    120                BlueprintName = "WebKit"
     118               BlueprintIdentifier = "9398100A0824BF01008DF038"
     119               BuildableName = "WebKitLegacy.framework"
     120               BlueprintName = "WebKitLegacy"
    121121               ReferencedContainer = "container:Source/WebKit/WebKit.xcodeproj">
    122122            </BuildableReference>
  • trunk/WebKit.xcworkspace/xcshareddata/xcschemes/All Source.xcscheme

    r168065 r168119  
    116116            <BuildableReference
    117117               BuildableIdentifier = "primary"
    118                BlueprintIdentifier = "1AD7451818D0D26C006F3A1E"
    119                BuildableName = "WebKit.framework"
    120                BlueprintName = "WebKit"
     118               BlueprintIdentifier = "9398100A0824BF01008DF038"
     119               BuildableName = "WebKitLegacy.framework"
     120               BlueprintName = "WebKitLegacy"
    121121               ReferencedContainer = "container:Source/WebKit/WebKit.xcodeproj">
    122122            </BuildableReference>
Note: See TracChangeset for help on using the changeset viewer.