Title: [222254] trunk
Revision
222254
Author
[email protected]
Date
2017-09-19 23:16:44 -0700 (Tue, 19 Sep 2017)

Log Message

Simplify compositing layer updating
https://bugs.webkit.org/show_bug.cgi?id=176196

Reviewed by Zalan Bujtas.

Source/WebCore:

Remove compositing layer updating from the updateLayerPositions() code path, which
was problematic because it wasn't pre-order. Instead, just rely on post-layout
compositing updates, which now need to do geometry updates. Micro benchmarking shows
this to be no slower.

We can remove the 'OnHitTest' update type, since we always ensure that layout is updated
before hit testing now.

Also remove a code path that could trigger updateGeometry() during a style change, and
in response to images loads, which were bad because layout may not be up-to-date at this time.

Tested by existing compositing tests. Rebaselined two tests after confirming they are progressions.

* rendering/RenderLayer.cpp:
(WebCore::RenderLayer::updateLayerPositions):
(WebCore::RenderLayer::hitTestLayer):
(WebCore::RenderLayer::calculateClipRects const):
* rendering/RenderLayer.h:
* rendering/RenderLayerBacking.cpp:
(WebCore::RenderLayerBacking::updateGeometry):
(WebCore::RenderLayerBacking::contentChanged):
(WebCore::RenderLayerBacking::updateAfterLayout): Deleted.
* rendering/RenderLayerBacking.h:
* rendering/RenderLayerCompositor.cpp:
(WebCore::RenderLayerCompositor::updateCompositingLayers):
(WebCore::RenderLayerCompositor::layerStyleChanged):
(WebCore::operator<<):
* rendering/RenderLayerCompositor.h:

LayoutTests:

New baselines.

* scrollingcoordinator/ios/sync-layer-positions-after-scroll-expected.txt:
* tiled-drawing/background-transparency-toggle-expected.txt:

Modified Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (222253 => 222254)


--- trunk/LayoutTests/ChangeLog	2017-09-20 06:13:54 UTC (rev 222253)
+++ trunk/LayoutTests/ChangeLog	2017-09-20 06:16:44 UTC (rev 222254)
@@ -1,3 +1,15 @@
+2017-09-19  Simon Fraser  <[email protected]>
+
+        Simplify compositing layer updating
+        https://bugs.webkit.org/show_bug.cgi?id=176196
+
+        Reviewed by Zalan Bujtas.
+
+        New baselines.
+
+        * scrollingcoordinator/ios/sync-layer-positions-after-scroll-expected.txt:
+        * tiled-drawing/background-transparency-toggle-expected.txt:
+
 2017-09-19  Joseph Pecoraro  <[email protected]>
 
         Move non-upstreamed Resource Timing tests out of web-platform-tests

Modified: trunk/LayoutTests/scrollingcoordinator/ios/sync-layer-positions-after-scroll-expected.txt (222253 => 222254)


--- trunk/LayoutTests/scrollingcoordinator/ios/sync-layer-positions-after-scroll-expected.txt	2017-09-20 06:13:54 UTC (rev 222253)
+++ trunk/LayoutTests/scrollingcoordinator/ios/sync-layer-positions-after-scroll-expected.txt	2017-09-20 06:16:44 UTC (rev 222254)
@@ -8,8 +8,7 @@
       (contentsOpaque 1)
       (children 1
         (GraphicsLayer
-          (position 12.00 10.00)
-          (approximate position 12.00 200.00)
+          (position 12.00 200.00)
           (bounds 100.00 100.00)
           (contentsOpaque 1)
         )

Modified: trunk/LayoutTests/tiled-drawing/background-transparency-toggle-expected.txt (222253 => 222254)


--- trunk/LayoutTests/tiled-drawing/background-transparency-toggle-expected.txt	2017-09-20 06:13:54 UTC (rev 222253)
+++ trunk/LayoutTests/tiled-drawing/background-transparency-toggle-expected.txt	2017-09-20 06:16:44 UTC (rev 222254)
@@ -49,6 +49,7 @@
     (GraphicsLayer
       (bounds 785.00 1024.00)
       (contentsOpaque 1)
+      (backgroundColor #CCCCCC)
       (tile cache coverage 0, 0 785 x 1024)
       (tile size 785 x 512)
       (top left tile 0, 0 tiles grid 1 x 2)

Modified: trunk/Source/WebCore/ChangeLog (222253 => 222254)


--- trunk/Source/WebCore/ChangeLog	2017-09-20 06:13:54 UTC (rev 222253)
+++ trunk/Source/WebCore/ChangeLog	2017-09-20 06:16:44 UTC (rev 222254)
@@ -1,5 +1,41 @@
 2017-09-19  Simon Fraser  <[email protected]>
 
+        Simplify compositing layer updating
+        https://bugs.webkit.org/show_bug.cgi?id=176196
+
+        Reviewed by Zalan Bujtas.
+
+        Remove compositing layer updating from the updateLayerPositions() code path, which
+        was problematic because it wasn't pre-order. Instead, just rely on post-layout
+        compositing updates, which now need to do geometry updates. Micro benchmarking shows
+        this to be no slower.
+
+        We can remove the 'OnHitTest' update type, since we always ensure that layout is updated
+        before hit testing now.
+
+        Also remove a code path that could trigger updateGeometry() during a style change, and
+        in response to images loads, which were bad because layout may not be up-to-date at this time.
+
+        Tested by existing compositing tests. Rebaselined two tests after confirming they are progressions.
+
+        * rendering/RenderLayer.cpp:
+        (WebCore::RenderLayer::updateLayerPositions):
+        (WebCore::RenderLayer::hitTestLayer):
+        (WebCore::RenderLayer::calculateClipRects const):
+        * rendering/RenderLayer.h:
+        * rendering/RenderLayerBacking.cpp:
+        (WebCore::RenderLayerBacking::updateGeometry):
+        (WebCore::RenderLayerBacking::contentChanged):
+        (WebCore::RenderLayerBacking::updateAfterLayout): Deleted.
+        * rendering/RenderLayerBacking.h:
+        * rendering/RenderLayerCompositor.cpp:
+        (WebCore::RenderLayerCompositor::updateCompositingLayers):
+        (WebCore::RenderLayerCompositor::layerStyleChanged):
+        (WebCore::operator<<):
+        * rendering/RenderLayerCompositor.h:
+
+2017-09-19  Simon Fraser  <[email protected]>
+
         Do more math in terms of FloatSizes and FloatPoints
         https://bugs.webkit.org/show_bug.cgi?id=177217
 

Modified: trunk/Source/WebCore/rendering/RenderLayer.cpp (222253 => 222254)


--- trunk/Source/WebCore/rendering/RenderLayer.cpp	2017-09-20 06:13:54 UTC (rev 222253)
+++ trunk/Source/WebCore/rendering/RenderLayer.cpp	2017-09-20 06:16:44 UTC (rev 222254)
@@ -562,11 +562,6 @@
     if (m_reflection)
         m_reflection->layout();
 
-    // Clear the IsCompositingUpdateRoot flag once we've found the first compositing layer in this update.
-    bool isUpdateRoot = (flags & IsCompositingUpdateRoot);
-    if (isComposited())
-        flags &= ~IsCompositingUpdateRoot;
-
     if (renderer().isInFlowRenderFlowThread()) {
         updatePagination();
         flags |= UpdatePagination;
@@ -581,15 +576,6 @@
     for (RenderLayer* child = firstChild(); child; child = child->nextSibling())
         child->updateLayerPositions(geometryMap, flags);
 
-    if ((flags & UpdateCompositingLayers) && isComposited()) {
-        RenderLayerBacking::UpdateAfterLayoutFlags updateFlags = RenderLayerBacking::CompositingChildrenOnly;
-        if (flags & NeedsFullRepaintInBacking)
-            updateFlags |= RenderLayerBacking::NeedsFullRepaint;
-        if (isUpdateRoot)
-            updateFlags |= RenderLayerBacking::IsUpdateRoot;
-        backing()->updateAfterLayout(updateFlags);
-    }
-        
     // With all our children positioned, now update our marquee if we need to.
     if (m_marquee) {
         // FIXME: would like to use SetForScope<> but it doesn't work with bitfields.
@@ -5161,7 +5147,7 @@
     }
 
     // Ensure our lists and 3d status are up-to-date.
-    updateCompositingAndLayerListsIfNeeded();
+    updateLayerListsIfNeeded();
     update3DTransformedDescendantStatus();
 
     RefPtr<HitTestingTransformState> localTransformState;
@@ -6488,17 +6474,6 @@
     }
 }
 
-void RenderLayer::updateCompositingAndLayerListsIfNeeded()
-{
-    if (compositor().inCompositingMode()) {
-        if (isDirtyStackingContainer() || m_normalFlowListDirty)
-            compositor().updateCompositingLayers(CompositingUpdateType::OnHitTest, this);
-        return;
-    }
-
-    updateLayerListsIfNeeded();
-}
-
 void RenderLayer::repaintIncludingDescendants()
 {
     renderer().repaint();

Modified: trunk/Source/WebCore/rendering/RenderLayer.h (222253 => 222254)


--- trunk/Source/WebCore/rendering/RenderLayer.h	2017-09-20 06:13:54 UTC (rev 222253)
+++ trunk/Source/WebCore/rendering/RenderLayer.h	2017-09-20 06:16:44 UTC (rev 222254)
@@ -304,16 +304,14 @@
     bool canRender3DTransforms() const;
 
     enum UpdateLayerPositionsFlag {
-        CheckForRepaint = 1 << 0,
-        NeedsFullRepaintInBacking = 1 << 1,
-        IsCompositingUpdateRoot = 1 << 2,
-        UpdateCompositingLayers = 1 << 3,
-        UpdatePagination = 1 << 4,
-        SeenTransformedLayer = 1 << 5,
-        Seen3DTransformedLayer = 1 << 6
+        CheckForRepaint                 = 1 << 0,
+        NeedsFullRepaintInBacking       = 1 << 1,
+        UpdatePagination                = 1 << 2,
+        SeenTransformedLayer            = 1 << 3,
+        Seen3DTransformedLayer          = 1 << 4
     };
     typedef unsigned UpdateLayerPositionsFlags;
-    static const UpdateLayerPositionsFlags defaultFlags = CheckForRepaint | IsCompositingUpdateRoot | UpdateCompositingLayers;
+    static const UpdateLayerPositionsFlags defaultFlags = CheckForRepaint;
 
     void updateLayerPositionsAfterLayout(const RenderLayer* rootLayer, UpdateLayerPositionsFlags);
 
@@ -823,8 +821,6 @@
 
     void collectLayers(bool includeHiddenLayers, CollectLayersBehavior, std::unique_ptr<Vector<RenderLayer*>>&, std::unique_ptr<Vector<RenderLayer*>>&);
 
-    void updateCompositingAndLayerListsIfNeeded();
-
     bool setupFontSubpixelQuantization(GraphicsContext&, bool& didQuantizeFonts);
 
     Path computeClipPath(const LayoutSize& offsetFromRoot, LayoutRect& rootRelativeBounds, WindRule&) const;

Modified: trunk/Source/WebCore/rendering/RenderLayerBacking.cpp (222253 => 222254)


--- trunk/Source/WebCore/rendering/RenderLayerBacking.cpp	2017-09-20 06:13:54 UTC (rev 222253)
+++ trunk/Source/WebCore/rendering/RenderLayerBacking.cpp	2017-09-20 06:16:44 UTC (rev 222254)
@@ -633,34 +633,6 @@
     }
 }
 
-void RenderLayerBacking::updateAfterLayout(UpdateAfterLayoutFlags flags)
-{
-    LOG(Compositing, "RenderLayerBacking %p updateAfterLayout (layer %p)", this, &m_owningLayer);
-
-    if (!compositor().compositingLayersNeedRebuild()) {
-        // Calling updateGeometry() here gives incorrect results, because the
-        // position of this layer's GraphicsLayer depends on the position of our compositing
-        // ancestor's GraphicsLayer. That cannot be determined until all the descendant 
-        // RenderLayers of that ancestor have been processed via updateLayerPositions().
-        //
-        // The solution is to update compositing children of this layer here,
-        // via updateCompositingChildrenGeometry().
-        updateCompositedBounds();
-        compositor().updateCompositingDescendantGeometry(m_owningLayer, m_owningLayer, flags & CompositingChildrenOnly);
-        
-        if (flags & IsUpdateRoot) {
-            updateGeometry();
-            compositor().updateRootLayerPosition();
-            RenderLayer* stackingContainer = m_owningLayer.enclosingStackingContainer();
-            if (!compositor().compositingLayersNeedRebuild() && stackingContainer && (stackingContainer != &m_owningLayer))
-                compositor().updateCompositingDescendantGeometry(*stackingContainer, *stackingContainer, flags & CompositingChildrenOnly);
-        }
-    }
-    
-    if (flags & NeedsFullRepaint && canIssueSetNeedsDisplay())
-        setContentsNeedDisplay();
-}
-
 bool RenderLayerBacking::updateConfiguration()
 {
     m_owningLayer.updateDescendantDependentFlags();
@@ -979,6 +951,7 @@
 
     RenderLayer* compositedAncestor = m_owningLayer.ancestorCompositingLayer();
     LayoutSize ancestorClippingLayerOffset;
+    // FIXME: can we avoid computeParentGraphicsLayerRect here?
     LayoutRect parentGraphicsLayerRect = computeParentGraphicsLayerRect(compositedAncestor, ancestorClippingLayerOffset);
     LayoutRect primaryGraphicsLayerRect = computePrimaryGraphicsLayerRect(parentGraphicsLayerRect);
 
@@ -2256,12 +2229,12 @@
     }
 
     if ((changeType == BackgroundImageChanged) && canDirectlyCompositeBackgroundBackgroundImage(renderer().style()))
-        updateGeometry();
+        compositor().setCompositingLayersNeedRebuild();
 
     if ((changeType == MaskImageChanged) && m_maskLayer) {
         // The composited layer bounds relies on box->maskClipRect(), which changes
         // when the mask image becomes available.
-        updateAfterLayout(CompositingChildrenOnly | IsUpdateRoot);
+        compositor().setCompositingLayersNeedRebuild();
     }
 
 #if ENABLE(WEBGL) || ENABLE(ACCELERATED_2D_CANVAS)

Modified: trunk/Source/WebCore/rendering/RenderLayerBacking.h (222253 => 222254)


--- trunk/Source/WebCore/rendering/RenderLayerBacking.h	2017-09-20 06:13:54 UTC (rev 222253)
+++ trunk/Source/WebCore/rendering/RenderLayerBacking.h	2017-09-20 06:16:44 UTC (rev 222254)
@@ -65,14 +65,6 @@
 
     RenderLayer& owningLayer() const { return m_owningLayer; }
 
-    enum UpdateAfterLayoutFlag {
-        CompositingChildrenOnly = 1 << 0,
-        NeedsFullRepaint = 1 << 1,
-        IsUpdateRoot = 1 << 2
-    };
-    typedef unsigned UpdateAfterLayoutFlags;
-    void updateAfterLayout(UpdateAfterLayoutFlags);
-    
     // Returns true if layer configuration changed.
     bool updateConfiguration();
 

Modified: trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp (222253 => 222254)


--- trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp	2017-09-20 06:13:54 UTC (rev 222253)
+++ trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp	2017-09-20 06:16:44 UTC (rev 222254)
@@ -666,12 +666,11 @@
     switch (updateType) {
     case CompositingUpdateType::AfterStyleChange:
     case CompositingUpdateType::AfterLayout:
-    case CompositingUpdateType::OnHitTest:
         checkForHierarchyUpdate = true;
+        needGeometryUpdate = true;
         break;
     case CompositingUpdateType::OnScroll:
         checkForHierarchyUpdate = true; // Overlap can change with scrolling, so need to check for hierarchy updates.
-
         needGeometryUpdate = true;
         break;
     case CompositingUpdateType::OnCompositedScroll:
@@ -692,7 +691,7 @@
     if (isFullUpdate && updateType == CompositingUpdateType::AfterLayout)
         m_reevaluateCompositingAfterLayout = false;
 
-    LOG(Compositing, " checkForHierarchyUpdate %d, needGeometryUpdate %d", checkForHierarchyUpdate, needHierarchyUpdate);
+    LOG(Compositing, " checkForHierarchyUpdate %d, needGeometryUpdate %d", checkForHierarchyUpdate, needGeometryUpdate);
 
 #if !LOG_DISABLED
     MonotonicTime startTime;
@@ -746,8 +745,6 @@
         
         reattachSubframeScrollLayers();
     } else if (needGeometryUpdate) {
-        // We just need to do a geometry update. This is only used for position:fixed scrolling;
-        // most of the time, geometry is updated via RenderLayer::styleChanged().
         updateLayerTreeGeometry(*updateRoot, 0);
         ASSERT(!isFullUpdate || !m_subframeScrollLayersNeedReattach);
     }
@@ -767,7 +764,6 @@
     if (!hasAcceleratedCompositing())
         enableCompositingMode(false);
 
-    // Inform the inspector that the layer tree has changed.
     InspectorInstrumentation::layerTreeDidChange(&page());
 
     return true;
@@ -940,16 +936,8 @@
         return;
     }
 
-    if (layer.isComposited()) {
-        // FIXME: updating geometry here is potentially harmful, because layout is not up-to-date.
-        layer.backing()->updateGeometry();
-        layer.backing()->updateAfterDescendants();
+    if (layer.isComposited() || needsCompositingUpdateForStyleChangeOnNonCompositedLayer(layer, oldStyle))
         m_layerNeedsCompositingUpdate = true;
-        return;
-    }
-
-    if (needsCompositingUpdateForStyleChangeOnNonCompositedLayer(layer, oldStyle))
-        m_layerNeedsCompositingUpdate = true;
 }
 
 bool RenderLayerCompositor::needsCompositingUpdateForStyleChangeOnNonCompositedLayer(RenderLayer& layer, const RenderStyle* oldStyle) const
@@ -4225,7 +4213,6 @@
     switch (updateType) {
     case CompositingUpdateType::AfterStyleChange: ts << "after style change"; break;
     case CompositingUpdateType::AfterLayout: ts << "after layout"; break;
-    case CompositingUpdateType::OnHitTest: ts << "on hit test"; break;
     case CompositingUpdateType::OnScroll: ts << "on scroll"; break;
     case CompositingUpdateType::OnCompositedScroll: ts << "on composited scroll"; break;
     }

Modified: trunk/Source/WebCore/rendering/RenderLayerCompositor.h (222253 => 222254)


--- trunk/Source/WebCore/rendering/RenderLayerCompositor.h	2017-09-20 06:13:54 UTC (rev 222253)
+++ trunk/Source/WebCore/rendering/RenderLayerCompositor.h	2017-09-20 06:16:44 UTC (rev 222254)
@@ -50,7 +50,6 @@
 enum class CompositingUpdateType {
     AfterStyleChange,
     AfterLayout,
-    OnHitTest,
     OnScroll,
     OnCompositedScroll
 };
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to