⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 283354 in webkit


Ignore:
Timestamp:
Sep 30, 2021, 6:23:14 PM (5 years ago)
Author:
cathiechen
Message:

[Performance] Optimize RenderLayer::clipCrossesPaintingBoundary
https://bugs.webkit.org/show_bug.cgi?id=230885

Reviewed by Simon Fraser.

In RenderLayer::clipCrossesPaintingBoundary, to check if the layer and its parent layer are in the same
compositing layer, it calls enclosingCompositingLayerForRepaint() twice, which need to travel up the layer tree.
This patch adds RenderLayer::sharesCompositingLayerForRepaint, to check the repaintTargetForLayer and paintOrderParents.

  • rendering/RenderLayer.cpp:

(WebCore::repaintTargetForLayer):
(WebCore::RenderLayer::enclosingCompositingLayerForRepaint const):
(WebCore::RenderLayer::sharesCompositingLayerForRepaint const):
(WebCore::RenderLayer::clipCrossesPaintingBoundary const):

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

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r283353 r283354  
     12021-09-30  Cathie Chen  <cathiechen@igalia.com>
     2
     3        [Performance] Optimize RenderLayer::clipCrossesPaintingBoundary
     4        https://bugs.webkit.org/show_bug.cgi?id=230885
     5
     6        Reviewed by Simon Fraser.
     7
     8        In RenderLayer::clipCrossesPaintingBoundary, to check if the layer and its parent layer are in the same
     9        compositing layer, it calls enclosingCompositingLayerForRepaint() twice, which need to travel up the layer tree.
     10        This patch adds RenderLayer::sharesCompositingLayerForRepaint, to check the repaintTargetForLayer and paintOrderParents.
     11
     12        * rendering/RenderLayer.cpp:
     13        (WebCore::repaintTargetForLayer):
     14        (WebCore::RenderLayer::enclosingCompositingLayerForRepaint const):
     15        (WebCore::RenderLayer::sharesCompositingLayerForRepaint const):
     16        (WebCore::RenderLayer::clipCrossesPaintingBoundary const):
     17        * rendering/RenderLayer.h:
     18
    1192021-09-30  Simon Fraser  <simon.fraser@apple.com>
    220
  • trunk/Source/WebCore/rendering/RenderLayer.cpp

    r283340 r283354  
    19211921}
    19221922
     1923static RenderLayer* repaintTargetForLayer(const RenderLayer& layer)
     1924{
     1925    if (compositedWithOwnBackingStore(layer))
     1926        return const_cast<RenderLayer*>(&layer);
     1927
     1928    if (layer.paintsIntoProvidedBacking())
     1929        return layer.backingProviderLayer();
     1930
     1931    return nullptr;
     1932}
     1933
    19231934RenderLayer* RenderLayer::enclosingCompositingLayerForRepaint(IncludeSelfOrNot includeSelf) const
    19241935{
    1925     auto repaintTargetForLayer = [](const RenderLayer& layer) -> RenderLayer* {
    1926         if (compositedWithOwnBackingStore(layer))
    1927             return const_cast<RenderLayer*>(&layer);
    1928        
    1929         if (layer.paintsIntoProvidedBacking())
    1930             return layer.backingProviderLayer();
    1931        
    1932         return nullptr;
    1933     };
    1934 
    19351936    RenderLayer* repaintTarget = nullptr;
    19361937    if (includeSelf == IncludeSelf && (repaintTarget = repaintTargetForLayer(*this)))
     
    19431944         
    19441945    return nullptr;
     1946}
     1947
     1948bool RenderLayer::sharesCompositingLayerForRepaint(const RenderLayer& otherLayer) const
     1949{
     1950    if (repaintTargetForLayer(*this))
     1951        return false;
     1952
     1953    const RenderLayer* paintParent = paintOrderParent();
     1954    if (&otherLayer == paintParent)
     1955        return true;
     1956    auto* otherPaintParent = otherLayer.paintOrderParent();
     1957    return paintParent == otherPaintParent || this == otherPaintParent;
    19451958}
    19461959
     
    44544467bool RenderLayer::clipCrossesPaintingBoundary() const
    44554468{
    4456     return parent()->enclosingPaginationLayer(IncludeCompositedPaginatedLayers) != enclosingPaginationLayer(IncludeCompositedPaginatedLayers)
    4457         || parent()->enclosingCompositingLayerForRepaint() != enclosingCompositingLayerForRepaint();
     4469    auto* parentLayer = parent();
     4470    if (!sharesCompositingLayerForRepaint(*parentLayer))
     4471        return true;
     4472
     4473    return parentLayer->enclosingPaginationLayer(IncludeCompositedPaginatedLayers) != enclosingPaginationLayer(IncludeCompositedPaginatedLayers);
    44584474}
    44594475
  • trunk/Source/WebCore/rendering/RenderLayer.h

    r283340 r283354  
    588588    RenderLayer* enclosingCompositingLayer(IncludeSelfOrNot = IncludeSelf) const;
    589589    RenderLayer* enclosingCompositingLayerForRepaint(IncludeSelfOrNot = IncludeSelf) const;
     590    bool sharesCompositingLayerForRepaint(const RenderLayer& otherLayer) const;
    590591    // Ancestor compositing layer, excluding this.
    591592    RenderLayer* ancestorCompositingLayer() const { return enclosingCompositingLayer(ExcludeSelf); }
Note: See TracChangeset for help on using the changeset viewer.