Title: [208328] trunk/Source
Revision
208328
Author
m...@apple.com
Date
2016-11-03 09:19:48 -0700 (Thu, 03 Nov 2016)

Log Message

REGRESSION (r206247): Painting milestones can be delayed until the next layer flush
https://bugs.webkit.org/show_bug.cgi?id=164340
<rdar://problem/29074344>

Reviewed by Tim Horton.

Source/WebCore:

To give WebKit a chance to deliver the painting milestones to its client after the commit,
we must tell it about them before or during the commit. To that end, we should not defer
the call to firePaintRelatedMilestonesIfNeeded until after the commit.

* rendering/RenderLayerCompositor.cpp:
(WebCore::RenderLayerCompositor::RenderLayerCompositor): Removed
  m_paintRelatedMilestonesTimer initializer.
(WebCore::RenderLayerCompositor::didPaintBacking): Call
  FrameView::firePaintRelatedMilestonesIfNeeded directly from here.
(WebCore::RenderLayerCompositor::paintRelatedMilestonesTimerFired): Deleted.
* rendering/RenderLayerCompositor.h:

Source/WebKit2:

* WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.h: Declared new helper function.
* WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm:
(WebKit::TiledCoreAnimationDrawingArea::sendPendingNewlyReachedLayoutMilestones): Helper
  function that sends the message to the UI process and resets
  m_pendingNewlyReachedLayoutMilestones.
(WebKit::TiledCoreAnimationDrawingArea::flushLayers): Wait until after the commit to get the
  pending milestones and send them to the UI process. This way we don’t miss milestones that
  fire during the commit.

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (208327 => 208328)


--- trunk/Source/WebCore/ChangeLog	2016-11-03 15:51:52 UTC (rev 208327)
+++ trunk/Source/WebCore/ChangeLog	2016-11-03 16:19:48 UTC (rev 208328)
@@ -1,3 +1,23 @@
+2016-11-03  Dan Bernstein  <m...@apple.com>
+
+        REGRESSION (r206247): Painting milestones can be delayed until the next layer flush
+        https://bugs.webkit.org/show_bug.cgi?id=164340
+        <rdar://problem/29074344>
+
+        Reviewed by Tim Horton.
+
+        To give WebKit a chance to deliver the painting milestones to its client after the commit,
+        we must tell it about them before or during the commit. To that end, we should not defer
+        the call to firePaintRelatedMilestonesIfNeeded until after the commit.
+
+        * rendering/RenderLayerCompositor.cpp:
+        (WebCore::RenderLayerCompositor::RenderLayerCompositor): Removed
+          m_paintRelatedMilestonesTimer initializer.
+        (WebCore::RenderLayerCompositor::didPaintBacking): Call
+          FrameView::firePaintRelatedMilestonesIfNeeded directly from here.
+        (WebCore::RenderLayerCompositor::paintRelatedMilestonesTimerFired): Deleted.
+        * rendering/RenderLayerCompositor.h:
+
 2016-11-03  Antti Koivisto  <an...@apple.com>
 
         imported/mozilla/svg/paint-order-01.svg and imported/mozilla/svg/paint-order-02.svg are flaky failures

Modified: trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp (208327 => 208328)


--- trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp	2016-11-03 15:51:52 UTC (rev 208327)
+++ trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp	2016-11-03 16:19:48 UTC (rev 208328)
@@ -274,7 +274,6 @@
 RenderLayerCompositor::RenderLayerCompositor(RenderView& renderView)
     : m_renderView(renderView)
     , m_updateCompositingLayersTimer(*this, &RenderLayerCompositor::updateCompositingLayersTimerFired)
-    , m_paintRelatedMilestonesTimer(*this, &RenderLayerCompositor::paintRelatedMilestonesTimerFired)
     , m_layerFlushTimer(*this, &RenderLayerCompositor::layerFlushTimerFired)
 {
 }
@@ -569,8 +568,8 @@
 {
     FrameView& frameView = m_renderView.frameView();
     frameView.setLastPaintTime(monotonicallyIncreasingTime());
-    if (frameView.milestonesPendingPaint() && !m_paintRelatedMilestonesTimer.isActive())
-        m_paintRelatedMilestonesTimer.startOneShot(0);
+    if (frameView.milestonesPendingPaint())
+        frameView.firePaintRelatedMilestonesIfNeeded();
 }
 
 void RenderLayerCompositor::didChangeVisibleRect()
@@ -4200,20 +4199,6 @@
     scheduleLayerFlushNow();
 }
 
-void RenderLayerCompositor::paintRelatedMilestonesTimerFired()
-{
-    Frame& frame = m_renderView.frameView().frame();
-    Page* page = frame.page();
-    if (!page)
-        return;
-
-    // If the layer tree is frozen, we'll paint when it's unfrozen and schedule the timer again.
-    if (page->chrome().client().layerTreeStateIsFrozen())
-        return;
-
-    m_renderView.frameView().firePaintRelatedMilestonesIfNeeded();
-}
-
 #if USE(REQUEST_ANIMATION_FRAME_DISPLAY_MONITOR)
 RefPtr<DisplayRefreshMonitor> RenderLayerCompositor::createDisplayRefreshMonitor(PlatformDisplayID displayID) const
 {

Modified: trunk/Source/WebCore/rendering/RenderLayerCompositor.h (208327 => 208328)


--- trunk/Source/WebCore/rendering/RenderLayerCompositor.h	2016-11-03 15:51:52 UTC (rev 208327)
+++ trunk/Source/WebCore/rendering/RenderLayerCompositor.h	2016-11-03 16:19:48 UTC (rev 208328)
@@ -475,8 +475,6 @@
     void startLayerFlushTimerIfNeeded();
     void layerFlushTimerFired();
 
-    void paintRelatedMilestonesTimerFired();
-
 #if !LOG_DISABLED
     const char* logReasonsForCompositing(const RenderLayer&);
     void logLayerInfo(const RenderLayer&, int depth);
@@ -548,7 +546,6 @@
 
     std::unique_ptr<GraphicsLayerUpdater> m_layerUpdater; // Updates tiled layer visible area periodically while animations are running.
 
-    Timer m_paintRelatedMilestonesTimer;
     Timer m_layerFlushTimer;
 
     bool m_layerFlushThrottlingEnabled { false };

Modified: trunk/Source/WebKit2/ChangeLog (208327 => 208328)


--- trunk/Source/WebKit2/ChangeLog	2016-11-03 15:51:52 UTC (rev 208327)
+++ trunk/Source/WebKit2/ChangeLog	2016-11-03 16:19:48 UTC (rev 208328)
@@ -1,3 +1,20 @@
+2016-11-03  Dan Bernstein  <m...@apple.com>
+
+        REGRESSION (r206247): Painting milestones can be delayed until the next layer flush
+        https://bugs.webkit.org/show_bug.cgi?id=164340
+        <rdar://problem/29074344>
+
+        Reviewed by Tim Horton.
+
+        * WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.h: Declared new helper function.
+        * WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm:
+        (WebKit::TiledCoreAnimationDrawingArea::sendPendingNewlyReachedLayoutMilestones): Helper
+          function that sends the message to the UI process and resets
+          m_pendingNewlyReachedLayoutMilestones.
+        (WebKit::TiledCoreAnimationDrawingArea::flushLayers): Wait until after the commit to get the
+          pending milestones and send them to the UI process. This way we don’t miss milestones that
+          fire during the commit.
+
 2016-11-02  David Kilzer  <ddkil...@apple.com>
 
         Bug 164333: Add logging for "WebKit encountered an internal error" messages due to Network process crashes

Modified: trunk/Source/WebKit2/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.h (208327 => 208328)


--- trunk/Source/WebKit2/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.h	2016-11-03 15:51:52 UTC (rev 208327)
+++ trunk/Source/WebKit2/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.h	2016-11-03 16:19:48 UTC (rev 208328)
@@ -122,6 +122,8 @@
     void updateScrolledExposedRect();
     void scaleViewToFitDocumentIfNeeded();
 
+    void sendPendingNewlyReachedLayoutMilestones();
+
     bool m_layerTreeStateIsFrozen;
     WebCore::LayerFlushScheduler m_layerFlushScheduler;
 

Modified: trunk/Source/WebKit2/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm (208327 => 208328)


--- trunk/Source/WebKit2/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm	2016-11-03 15:51:52 UTC (rev 208327)
+++ trunk/Source/WebKit2/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm	2016-11-03 16:19:48 UTC (rev 208328)
@@ -394,6 +394,15 @@
 #endif
 }
 
+void TiledCoreAnimationDrawingArea::sendPendingNewlyReachedLayoutMilestones()
+{
+    if (!m_pendingNewlyReachedLayoutMilestones)
+        return;
+
+    m_webPage.send(Messages::WebPageProxy::DidReachLayoutMilestone(m_pendingNewlyReachedLayoutMilestones));
+    m_pendingNewlyReachedLayoutMilestones = 0;
+}
+
 bool TiledCoreAnimationDrawingArea::flushLayers()
 {
     ASSERT(!m_layerTreeStateIsFrozen);
@@ -418,14 +427,21 @@
         if (m_viewOverlayRootLayer)
             m_viewOverlayRootLayer->flushCompositingState(visibleRect, m_webPage.mainFrameView()->viewportIsStable());
 
+        RefPtr<WebPage> retainedPage = &m_webPage;
 #if TARGET_OS_IPHONE || (PLATFORM(MAC) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 101100)
-        RefPtr<WebPage> retainedPage = &m_webPage;
         [CATransaction addCommitHandler:[retainedPage] {
             if (Page* corePage = retainedPage->corePage()) {
                 if (Frame* coreFrame = retainedPage->mainFrame())
                     corePage->inspectorController().didComposite(*coreFrame);
             }
+            if (auto drawingArea = static_cast<TiledCoreAnimationDrawingArea*>(retainedPage->drawingArea()))
+                drawingArea->sendPendingNewlyReachedLayoutMilestones();
         } forPhase:kCATransactionPhasePostCommit];
+#else
+        dispatch_async(dispatch_get_main_queue(), [retainedPage] {
+            if (auto drawingArea = static_cast<TiledCoreAnimationDrawingArea*>(retainedPage->drawingArea()))
+                drawingArea->sendPendingNewlyReachedLayoutMilestones();
+        });
 #endif
 
         bool returnValue = m_webPage.mainFrameView()->flushCompositingStateIncludingSubframes();
@@ -439,10 +455,6 @@
         if (m_transientZoomScale != 1)
             applyTransientZoomToLayers(m_transientZoomScale, m_transientZoomOrigin);
 
-        if (m_pendingNewlyReachedLayoutMilestones)
-            m_webPage.send(Messages::WebPageProxy::DidReachLayoutMilestone(m_pendingNewlyReachedLayoutMilestones));
-        m_pendingNewlyReachedLayoutMilestones = 0;
-
         return returnValue;
     }
 }
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to