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
};