<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[215259] trunk/Source</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/215259">215259</a></dd>
<dt>Author</dt> <dd>zandobersek@gmail.com</dd>
<dt>Date</dt> <dd>2017-04-11 23:50:50 -0700 (Tue, 11 Apr 2017)</dd>
</dl>

<h3>Log Message</h3>
<pre>[GTK] Use the DisplayRefreshMonitor facilities
https://bugs.webkit.org/show_bug.cgi?id=170599

Reviewed by Carlos Garcia Campos.

Source/WebCore:

* CMakeLists.txt: Add missing files to the build.
* platform/graphics/DisplayRefreshMonitor.cpp: Build fixes.
(WebCore::DisplayRefreshMonitor::createDefaultDisplayRefreshMonitor):
* platform/graphics/texmap/coordinated/CoordinatedGraphicsLayer.cpp:
(WebCore::CoordinatedGraphicsLayer::updatePlatformLayer): Mark the
platform layer as updated in the layer's CoordinatedGraphicsState.
* platform/graphics/texmap/coordinated/CoordinatedGraphicsState.h:

Source/WebKit2:

ThreadedCompositor gains a DisplayRefreshMonitor member that it can use
to better coordinate display refresh callbacks on the main thread. Still,
because currently the GTK+ port doesn't have a reliable way of notifying
the ThreadedCompositor of a vsync event, a timer targeting 60FPS is used
in order to keep the updates at a reasonable rate. When the timer is fired,
the ThreadedCompositor decides how to proceed based on state changes that
might have occurred during composition or whether there's any display
refresh callbacks that require handling on the main thread.

CompositingRunLoop now stores its state in an atomic variable that's then
inspected whenever a new update is scheduled or completed. When scheduled,
if there's no update in progress, a new update is requested through the
timer. If there's already an update in progress, a new update is marked
as pending after the current one completes. In that case, when the update
is completed, a new update is requested through the timer.

ThreadedDisplayRefreshMonitor is used to coordinate updates between the
main and the composition thread whenever the CoordinatedGraphics state
demands it, or whenever there are clients registered to that monitor that
require an update (e.g. a requestAnimationFrame() callback). After the
update on the composition thread is finished, and the DisplayRefreshMonitor
object requires an update, a callback at the same priority as the layer
flush timer is scheduled on the main thread. In that callback we handle
any clients registered for this DisplayRefreshMonitor before proceeding
to handle any changes to the CoordinatedGraphics scene. In case the
DisplayRefreshMonitor clients or the layer flushes already queued up
any changes to the state, we immediately ask the ThreadedCompositor for
an update.

* PlatformGTK.cmake:
* Shared/CoordinatedGraphics/CoordinatedGraphicsScene.cpp:
(WebKit::CoordinatedGraphicsScene::updateViewport):
(WebKit::CoordinatedGraphicsScene::commitSceneState):
* Shared/CoordinatedGraphics/CoordinatedGraphicsScene.h:
* Shared/CoordinatedGraphics/threadedcompositor/CompositingRunLoop.cpp:
(WebKit::CompositingRunLoop::CompositingRunLoop):
(WebKit::CompositingRunLoop::isActive):
(WebKit::CompositingRunLoop::scheduleUpdate):
(WebKit::CompositingRunLoop::stopUpdates):
(WebKit::CompositingRunLoop::updateCompleted):
(WebKit::CompositingRunLoop::updateTimerFired):
(WebKit::CompositingRunLoop::isCurrent):
(WebKit::CompositingRunLoop::startUpdateTimer): Deleted.
(WebKit::CompositingRunLoop::stopUpdateTimer): Deleted.
* Shared/CoordinatedGraphics/threadedcompositor/CompositingRunLoop.h:
(): Deleted.
* Shared/CoordinatedGraphics/threadedcompositor/ThreadedCompositor.cpp:
(WebKit::m_displayRefreshMonitor):
(WebKit::ThreadedCompositor::invalidate):
(WebKit::ThreadedCompositor::setNativeSurfaceHandleForCompositing):
(WebKit::ThreadedCompositor::updateViewport):
(WebKit::ThreadedCompositor::scheduleDisplayImmediately):
(WebKit::ThreadedCompositor::renderLayerTree):
(WebKit::ThreadedCompositor::sceneUpdateFinished):
(WebKit::ThreadedCompositor::updateSceneState):
(WebKit::ThreadedCompositor::displayRefreshMonitor):
(WebKit::ThreadedCompositor::renderNextFrameIfNeeded):
(WebKit::ThreadedCompositor::completeCoordinatedUpdateIfNeeded):
(WebKit::ThreadedCompositor::coordinateUpdateCompletionWithClient):
(WebKit::ThreadedCompositor::performFrameCompletion):
* Shared/CoordinatedGraphics/threadedcompositor/ThreadedCompositor.h:
* Shared/CoordinatedGraphics/threadedcompositor/ThreadedDisplayRefreshMonitor.cpp: Added.
(WebKit::ThreadedDisplayRefreshMonitor::ThreadedDisplayRefreshMonitor):
(WebKit::ThreadedDisplayRefreshMonitor::requestRefreshCallback):
(WebKit::ThreadedDisplayRefreshMonitor::requiresDisplayRefreshCallback):
(WebKit::ThreadedDisplayRefreshMonitor::dispatchDisplayRefreshCallback):
(WebKit::ThreadedDisplayRefreshMonitor::invalidate):
(WebKit::ThreadedDisplayRefreshMonitor::displayRefreshCallback):
* Shared/CoordinatedGraphics/threadedcompositor/ThreadedDisplayRefreshMonitor.h: Copied from Source/WebKit2/Shared/CoordinatedGraphics/threadedcompositor/CompositingRunLoop.h.
* WebProcess/WebPage/AcceleratedDrawingArea.cpp:
(WebKit::AcceleratedDrawingArea::createDisplayRefreshMonitor):
* WebProcess/WebPage/AcceleratedDrawingArea.h:
* WebProcess/WebPage/CoordinatedGraphics/ThreadedCoordinatedLayerTreeHost.cpp:
(WebKit::ThreadedCoordinatedLayerTreeHost::createDisplayRefreshMonitor):
* WebProcess/WebPage/CoordinatedGraphics/ThreadedCoordinatedLayerTreeHost.h:
* WebProcess/WebPage/LayerTreeHost.h:
(WebKit::LayerTreeHost::createDisplayRefreshMonitor):

Source/WTF:

* wtf/Platform.h: Enable USE_REQUEST_ANIMATION_FRAME_DISPLAY_MONITOR for the GTK+ port.
* wtf/glib/RunLoopSourcePriority.h: Add the DisplayRefreshMonitorTimer entry that
matches the value of LayerFlushTimer.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWTFChangeLog">trunk/Source/WTF/ChangeLog</a></li>
<li><a href="#trunkSourceWTFwtfPlatformh">trunk/Source/WTF/wtf/Platform.h</a></li>
<li><a href="#trunkSourceWTFwtfglibRunLoopSourcePriorityh">trunk/Source/WTF/wtf/glib/RunLoopSourcePriority.h</a></li>
<li><a href="#trunkSourceWebCoreCMakeListstxt">trunk/Source/WebCore/CMakeLists.txt</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsDisplayRefreshMonitorcpp">trunk/Source/WebCore/platform/graphics/DisplayRefreshMonitor.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicstexmapcoordinatedCoordinatedGraphicsLayercpp">trunk/Source/WebCore/platform/graphics/texmap/coordinated/CoordinatedGraphicsLayer.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicstexmapcoordinatedCoordinatedGraphicsStateh">trunk/Source/WebCore/platform/graphics/texmap/coordinated/CoordinatedGraphicsState.h</a></li>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2PlatformGTKcmake">trunk/Source/WebKit2/PlatformGTK.cmake</a></li>
<li><a href="#trunkSourceWebKit2SharedCoordinatedGraphicsCoordinatedGraphicsScenecpp">trunk/Source/WebKit2/Shared/CoordinatedGraphics/CoordinatedGraphicsScene.cpp</a></li>
<li><a href="#trunkSourceWebKit2SharedCoordinatedGraphicsCoordinatedGraphicsSceneh">trunk/Source/WebKit2/Shared/CoordinatedGraphics/CoordinatedGraphicsScene.h</a></li>
<li><a href="#trunkSourceWebKit2SharedCoordinatedGraphicsthreadedcompositorCompositingRunLoopcpp">trunk/Source/WebKit2/Shared/CoordinatedGraphics/threadedcompositor/CompositingRunLoop.cpp</a></li>
<li><a href="#trunkSourceWebKit2SharedCoordinatedGraphicsthreadedcompositorCompositingRunLooph">trunk/Source/WebKit2/Shared/CoordinatedGraphics/threadedcompositor/CompositingRunLoop.h</a></li>
<li><a href="#trunkSourceWebKit2SharedCoordinatedGraphicsthreadedcompositorThreadedCompositorcpp">trunk/Source/WebKit2/Shared/CoordinatedGraphics/threadedcompositor/ThreadedCompositor.cpp</a></li>
<li><a href="#trunkSourceWebKit2SharedCoordinatedGraphicsthreadedcompositorThreadedCompositorh">trunk/Source/WebKit2/Shared/CoordinatedGraphics/threadedcompositor/ThreadedCompositor.h</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPageAcceleratedDrawingAreacpp">trunk/Source/WebKit2/WebProcess/WebPage/AcceleratedDrawingArea.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPageAcceleratedDrawingAreah">trunk/Source/WebKit2/WebProcess/WebPage/AcceleratedDrawingArea.h</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPageCoordinatedGraphicsThreadedCoordinatedLayerTreeHostcpp">trunk/Source/WebKit2/WebProcess/WebPage/CoordinatedGraphics/ThreadedCoordinatedLayerTreeHost.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPageCoordinatedGraphicsThreadedCoordinatedLayerTreeHosth">trunk/Source/WebKit2/WebProcess/WebPage/CoordinatedGraphics/ThreadedCoordinatedLayerTreeHost.h</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPageLayerTreeHosth">trunk/Source/WebKit2/WebProcess/WebPage/LayerTreeHost.h</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkSourceWebKit2SharedCoordinatedGraphicsthreadedcompositorThreadedDisplayRefreshMonitorcpp">trunk/Source/WebKit2/Shared/CoordinatedGraphics/threadedcompositor/ThreadedDisplayRefreshMonitor.cpp</a></li>
<li><a href="#trunkSourceWebKit2SharedCoordinatedGraphicsthreadedcompositorThreadedDisplayRefreshMonitorh">trunk/Source/WebKit2/Shared/CoordinatedGraphics/threadedcompositor/ThreadedDisplayRefreshMonitor.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWTFChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/ChangeLog (215258 => 215259)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/ChangeLog        2017-04-12 06:12:26 UTC (rev 215258)
+++ trunk/Source/WTF/ChangeLog        2017-04-12 06:50:50 UTC (rev 215259)
</span><span class="lines">@@ -1,3 +1,14 @@
</span><ins>+2017-04-11  Zan Dobersek  &lt;zdobersek@igalia.com&gt;
+
+        [GTK] Use the DisplayRefreshMonitor facilities
+        https://bugs.webkit.org/show_bug.cgi?id=170599
+
+        Reviewed by Carlos Garcia Campos.
+
+        * wtf/Platform.h: Enable USE_REQUEST_ANIMATION_FRAME_DISPLAY_MONITOR for the GTK+ port.
+        * wtf/glib/RunLoopSourcePriority.h: Add the DisplayRefreshMonitorTimer entry that
+        matches the value of LayerFlushTimer.
+
</ins><span class="cx"> 2017-04-11  Yusuke Suzuki  &lt;utatane.tea@gmail.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [WebCore][JSC] ResourceUsageData.{timeOfNextEdenCollection,timeOfNextFullCollection} should be MonotonicTime
</span></span></pre></div>
<a id="trunkSourceWTFwtfPlatformh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/Platform.h (215258 => 215259)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/Platform.h        2017-04-12 06:12:26 UTC (rev 215258)
+++ trunk/Source/WTF/wtf/Platform.h        2017-04-12 06:50:50 UTC (rev 215259)
</span><span class="lines">@@ -1048,7 +1048,7 @@
</span><span class="cx"> #define USE_REQUEST_ANIMATION_FRAME_TIMER 1
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-#if PLATFORM(COCOA)
</del><ins>+#if PLATFORM(COCOA) || PLATFORM(GTK)
</ins><span class="cx"> #define USE_REQUEST_ANIMATION_FRAME_DISPLAY_MONITOR 1
</span><span class="cx"> #endif
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWTFwtfglibRunLoopSourcePriorityh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/glib/RunLoopSourcePriority.h (215258 => 215259)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/glib/RunLoopSourcePriority.h        2017-04-12 06:12:26 UTC (rev 215258)
+++ trunk/Source/WTF/wtf/glib/RunLoopSourcePriority.h        2017-04-12 06:50:50 UTC (rev 215259)
</span><span class="lines">@@ -64,6 +64,9 @@
</span><span class="cx">     // Layer flush.
</span><span class="cx">     LayerFlushTimer = -100,
</span><span class="cx"> 
</span><ins>+    // DisplayRefreshMonitor timer, should have the same value as the LayerFlushTimer.
+    DisplayRefreshMonitorTimer = -100,
+
</ins><span class="cx">     // Rendering timer in the main thread when accelerated compositing is not used.
</span><span class="cx">     NonAcceleratedDrawingTimer = 100
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceWebCoreCMakeListstxt"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/CMakeLists.txt (215258 => 215259)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/CMakeLists.txt        2017-04-12 06:12:26 UTC (rev 215258)
+++ trunk/Source/WebCore/CMakeLists.txt        2017-04-12 06:50:50 UTC (rev 215259)
</span><span class="lines">@@ -2253,7 +2253,9 @@
</span><span class="cx">     platform/graphics/Color.cpp
</span><span class="cx">     platform/graphics/ComplexTextController.cpp
</span><span class="cx">     platform/graphics/CrossfadeGeneratedImage.cpp
</span><ins>+    platform/graphics/DisplayRefreshMonitor.cpp
</ins><span class="cx">     platform/graphics/DisplayRefreshMonitorClient.cpp
</span><ins>+    platform/graphics/DisplayRefreshMonitorManager.cpp
</ins><span class="cx">     platform/graphics/ExtendedColor.cpp
</span><span class="cx">     platform/graphics/FloatPoint.cpp
</span><span class="cx">     platform/graphics/FloatPoint3D.cpp
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (215258 => 215259)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2017-04-12 06:12:26 UTC (rev 215258)
+++ trunk/Source/WebCore/ChangeLog        2017-04-12 06:50:50 UTC (rev 215259)
</span><span class="lines">@@ -1,3 +1,18 @@
</span><ins>+2017-04-11  Zan Dobersek  &lt;zdobersek@igalia.com&gt;
+
+        [GTK] Use the DisplayRefreshMonitor facilities
+        https://bugs.webkit.org/show_bug.cgi?id=170599
+
+        Reviewed by Carlos Garcia Campos.
+
+        * CMakeLists.txt: Add missing files to the build.
+        * platform/graphics/DisplayRefreshMonitor.cpp: Build fixes.
+        (WebCore::DisplayRefreshMonitor::createDefaultDisplayRefreshMonitor):
+        * platform/graphics/texmap/coordinated/CoordinatedGraphicsLayer.cpp:
+        (WebCore::CoordinatedGraphicsLayer::updatePlatformLayer): Mark the
+        platform layer as updated in the layer's CoordinatedGraphicsState.
+        * platform/graphics/texmap/coordinated/CoordinatedGraphicsState.h:
+
</ins><span class="cx"> 2017-04-11  Antoine Quint  &lt;graouts@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [Modern Media Controls] Allow modern-media-controls to be provided through WebKitAdditions
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsDisplayRefreshMonitorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/DisplayRefreshMonitor.cpp (215258 => 215259)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/DisplayRefreshMonitor.cpp        2017-04-12 06:12:26 UTC (rev 215258)
+++ trunk/Source/WebCore/platform/graphics/DisplayRefreshMonitor.cpp        2017-04-12 06:50:50 UTC (rev 215259)
</span><span class="lines">@@ -33,7 +33,7 @@
</span><span class="cx"> 
</span><span class="cx"> #if PLATFORM(IOS)
</span><span class="cx"> #include &quot;DisplayRefreshMonitorIOS.h&quot;
</span><del>-#else
</del><ins>+#elif PLATFORM(MAC)
</ins><span class="cx"> #include &quot;DisplayRefreshMonitorMac.h&quot;
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="lines">@@ -47,6 +47,7 @@
</span><span class="cx"> #if PLATFORM(IOS)
</span><span class="cx">     return DisplayRefreshMonitorIOS::create(displayID);
</span><span class="cx"> #endif
</span><ins>+    UNUSED_PARAM(displayID);
</ins><span class="cx">     return nullptr;
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicstexmapcoordinatedCoordinatedGraphicsLayercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/texmap/coordinated/CoordinatedGraphicsLayer.cpp (215258 => 215259)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/texmap/coordinated/CoordinatedGraphicsLayer.cpp        2017-04-12 06:12:26 UTC (rev 215258)
+++ trunk/Source/WebCore/platform/graphics/texmap/coordinated/CoordinatedGraphicsLayer.cpp        2017-04-12 06:50:50 UTC (rev 215259)
</span><span class="lines">@@ -714,6 +714,7 @@
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     m_shouldUpdatePlatformLayer = false;
</span><ins>+    m_layerState.platformLayerUpdated = true;
</ins><span class="cx">     if (m_platformLayer)
</span><span class="cx">         m_platformLayer-&gt;swapBuffersIfNeeded();
</span><span class="cx"> #endif
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicstexmapcoordinatedCoordinatedGraphicsStateh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/texmap/coordinated/CoordinatedGraphicsState.h (215258 => 215259)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/texmap/coordinated/CoordinatedGraphicsState.h        2017-04-12 06:12:26 UTC (rev 215258)
+++ trunk/Source/WebCore/platform/graphics/texmap/coordinated/CoordinatedGraphicsState.h        2017-04-12 06:50:50 UTC (rev 215259)
</span><span class="lines">@@ -86,6 +86,7 @@
</span><span class="cx">             bool childrenChanged: 1;
</span><span class="cx">             bool repaintCountChanged : 1;
</span><span class="cx">             bool platformLayerChanged: 1;
</span><ins>+            bool platformLayerUpdated: 1;
</ins><span class="cx">             bool platformLayerShouldSwapBuffers: 1;
</span><span class="cx">             bool isScrollableChanged: 1;
</span><span class="cx">             bool committedScrollOffsetChanged: 1;
</span></span></pre></div>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (215258 => 215259)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2017-04-12 06:12:26 UTC (rev 215258)
+++ trunk/Source/WebKit2/ChangeLog        2017-04-12 06:50:50 UTC (rev 215259)
</span><span class="lines">@@ -1,3 +1,88 @@
</span><ins>+2017-04-11  Zan Dobersek  &lt;zdobersek@igalia.com&gt;
+
+        [GTK] Use the DisplayRefreshMonitor facilities
+        https://bugs.webkit.org/show_bug.cgi?id=170599
+
+        Reviewed by Carlos Garcia Campos.
+
+        ThreadedCompositor gains a DisplayRefreshMonitor member that it can use
+        to better coordinate display refresh callbacks on the main thread. Still,
+        because currently the GTK+ port doesn't have a reliable way of notifying
+        the ThreadedCompositor of a vsync event, a timer targeting 60FPS is used
+        in order to keep the updates at a reasonable rate. When the timer is fired,
+        the ThreadedCompositor decides how to proceed based on state changes that
+        might have occurred during composition or whether there's any display
+        refresh callbacks that require handling on the main thread.
+
+        CompositingRunLoop now stores its state in an atomic variable that's then
+        inspected whenever a new update is scheduled or completed. When scheduled,
+        if there's no update in progress, a new update is requested through the
+        timer. If there's already an update in progress, a new update is marked
+        as pending after the current one completes. In that case, when the update
+        is completed, a new update is requested through the timer.
+
+        ThreadedDisplayRefreshMonitor is used to coordinate updates between the
+        main and the composition thread whenever the CoordinatedGraphics state
+        demands it, or whenever there are clients registered to that monitor that
+        require an update (e.g. a requestAnimationFrame() callback). After the
+        update on the composition thread is finished, and the DisplayRefreshMonitor
+        object requires an update, a callback at the same priority as the layer
+        flush timer is scheduled on the main thread. In that callback we handle
+        any clients registered for this DisplayRefreshMonitor before proceeding
+        to handle any changes to the CoordinatedGraphics scene. In case the
+        DisplayRefreshMonitor clients or the layer flushes already queued up
+        any changes to the state, we immediately ask the ThreadedCompositor for
+        an update.
+
+        * PlatformGTK.cmake:
+        * Shared/CoordinatedGraphics/CoordinatedGraphicsScene.cpp:
+        (WebKit::CoordinatedGraphicsScene::updateViewport):
+        (WebKit::CoordinatedGraphicsScene::commitSceneState):
+        * Shared/CoordinatedGraphics/CoordinatedGraphicsScene.h:
+        * Shared/CoordinatedGraphics/threadedcompositor/CompositingRunLoop.cpp:
+        (WebKit::CompositingRunLoop::CompositingRunLoop):
+        (WebKit::CompositingRunLoop::isActive):
+        (WebKit::CompositingRunLoop::scheduleUpdate):
+        (WebKit::CompositingRunLoop::stopUpdates):
+        (WebKit::CompositingRunLoop::updateCompleted):
+        (WebKit::CompositingRunLoop::updateTimerFired):
+        (WebKit::CompositingRunLoop::isCurrent):
+        (WebKit::CompositingRunLoop::startUpdateTimer): Deleted.
+        (WebKit::CompositingRunLoop::stopUpdateTimer): Deleted.
+        * Shared/CoordinatedGraphics/threadedcompositor/CompositingRunLoop.h:
+        (): Deleted.
+        * Shared/CoordinatedGraphics/threadedcompositor/ThreadedCompositor.cpp:
+        (WebKit::m_displayRefreshMonitor):
+        (WebKit::ThreadedCompositor::invalidate):
+        (WebKit::ThreadedCompositor::setNativeSurfaceHandleForCompositing):
+        (WebKit::ThreadedCompositor::updateViewport):
+        (WebKit::ThreadedCompositor::scheduleDisplayImmediately):
+        (WebKit::ThreadedCompositor::renderLayerTree):
+        (WebKit::ThreadedCompositor::sceneUpdateFinished):
+        (WebKit::ThreadedCompositor::updateSceneState):
+        (WebKit::ThreadedCompositor::displayRefreshMonitor):
+        (WebKit::ThreadedCompositor::renderNextFrameIfNeeded):
+        (WebKit::ThreadedCompositor::completeCoordinatedUpdateIfNeeded):
+        (WebKit::ThreadedCompositor::coordinateUpdateCompletionWithClient):
+        (WebKit::ThreadedCompositor::performFrameCompletion):
+        * Shared/CoordinatedGraphics/threadedcompositor/ThreadedCompositor.h:
+        * Shared/CoordinatedGraphics/threadedcompositor/ThreadedDisplayRefreshMonitor.cpp: Added.
+        (WebKit::ThreadedDisplayRefreshMonitor::ThreadedDisplayRefreshMonitor):
+        (WebKit::ThreadedDisplayRefreshMonitor::requestRefreshCallback):
+        (WebKit::ThreadedDisplayRefreshMonitor::requiresDisplayRefreshCallback):
+        (WebKit::ThreadedDisplayRefreshMonitor::dispatchDisplayRefreshCallback):
+        (WebKit::ThreadedDisplayRefreshMonitor::invalidate):
+        (WebKit::ThreadedDisplayRefreshMonitor::displayRefreshCallback):
+        * Shared/CoordinatedGraphics/threadedcompositor/ThreadedDisplayRefreshMonitor.h: Copied from Source/WebKit2/Shared/CoordinatedGraphics/threadedcompositor/CompositingRunLoop.h.
+        * WebProcess/WebPage/AcceleratedDrawingArea.cpp:
+        (WebKit::AcceleratedDrawingArea::createDisplayRefreshMonitor):
+        * WebProcess/WebPage/AcceleratedDrawingArea.h:
+        * WebProcess/WebPage/CoordinatedGraphics/ThreadedCoordinatedLayerTreeHost.cpp:
+        (WebKit::ThreadedCoordinatedLayerTreeHost::createDisplayRefreshMonitor):
+        * WebProcess/WebPage/CoordinatedGraphics/ThreadedCoordinatedLayerTreeHost.h:
+        * WebProcess/WebPage/LayerTreeHost.h:
+        (WebKit::LayerTreeHost::createDisplayRefreshMonitor):
+
</ins><span class="cx"> 2017-04-11  Alex Christensen  &lt;achristensen@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         Modernize and clean up code
</span></span></pre></div>
<a id="trunkSourceWebKit2PlatformGTKcmake"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/PlatformGTK.cmake (215258 => 215259)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/PlatformGTK.cmake        2017-04-12 06:12:26 UTC (rev 215258)
+++ trunk/Source/WebKit2/PlatformGTK.cmake        2017-04-12 06:50:50 UTC (rev 215259)
</span><span class="lines">@@ -65,6 +65,7 @@
</span><span class="cx"> 
</span><span class="cx">     Shared/CoordinatedGraphics/threadedcompositor/CompositingRunLoop.cpp
</span><span class="cx">     Shared/CoordinatedGraphics/threadedcompositor/ThreadSafeCoordinatedSurface.cpp
</span><ins>+    Shared/CoordinatedGraphics/threadedcompositor/ThreadedDisplayRefreshMonitor.cpp
</ins><span class="cx">     Shared/CoordinatedGraphics/threadedcompositor/ThreadedCompositor.cpp
</span><span class="cx"> 
</span><span class="cx">     Shared/Plugins/Netscape/x11/NetscapePluginModuleX11.cpp
</span></span></pre></div>
<a id="trunkSourceWebKit2SharedCoordinatedGraphicsCoordinatedGraphicsScenecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/Shared/CoordinatedGraphics/CoordinatedGraphicsScene.cpp (215258 => 215259)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Shared/CoordinatedGraphics/CoordinatedGraphicsScene.cpp        2017-04-12 06:12:26 UTC (rev 215258)
+++ trunk/Source/WebKit2/Shared/CoordinatedGraphics/CoordinatedGraphicsScene.cpp        2017-04-12 06:50:50 UTC (rev 215259)
</span><span class="lines">@@ -127,12 +127,8 @@
</span><span class="cx"> 
</span><span class="cx"> void CoordinatedGraphicsScene::updateViewport()
</span><span class="cx"> {
</span><del>-    if (!m_client)
-        return;
-    dispatchOnClientRunLoop([this] {
-        if (m_client)
-            m_client-&gt;updateViewport();
-    });
</del><ins>+    if (m_client)
+        m_client-&gt;updateViewport();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void CoordinatedGraphicsScene::adjustPositionForFixedLayers(const FloatPoint&amp; contentPosition)
</span><span class="lines">@@ -547,9 +543,6 @@
</span><span class="cx"> 
</span><span class="cx">     commitPendingBackingStoreOperations();
</span><span class="cx">     removeReleasedImageBackingsIfNeeded();
</span><del>-
-    // The pending tiles state is on its way for the screen, tell the web process to render the next one.
-    renderNextFrame();
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void CoordinatedGraphicsScene::renderNextFrame()
</span></span></pre></div>
<a id="trunkSourceWebKit2SharedCoordinatedGraphicsCoordinatedGraphicsSceneh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/Shared/CoordinatedGraphics/CoordinatedGraphicsScene.h (215258 => 215259)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Shared/CoordinatedGraphics/CoordinatedGraphicsScene.h        2017-04-12 06:12:26 UTC (rev 215258)
+++ trunk/Source/WebKit2/Shared/CoordinatedGraphics/CoordinatedGraphicsScene.h        2017-04-12 06:50:50 UTC (rev 215259)
</span><span class="lines">@@ -80,6 +80,7 @@
</span><span class="cx">     void setActive(bool);
</span><span class="cx"> 
</span><span class="cx">     void commitSceneState(const WebCore::CoordinatedGraphicsState&amp;);
</span><ins>+    void renderNextFrame();
</ins><span class="cx"> 
</span><span class="cx">     void setViewBackgroundColor(const WebCore::Color&amp; color) { m_viewBackgroundColor = color; }
</span><span class="cx">     WebCore::Color viewBackgroundColor() const { return m_viewBackgroundColor; }
</span><span class="lines">@@ -123,7 +124,6 @@
</span><span class="cx">     void dispatchOnMainThread(Function&lt;void()&gt;&amp;&amp;);
</span><span class="cx">     void dispatchOnClientRunLoop(Function&lt;void()&gt;&amp;&amp;);
</span><span class="cx">     void updateViewport();
</span><del>-    void renderNextFrame();
</del><span class="cx"> 
</span><span class="cx">     void createLayer(WebCore::CoordinatedLayerID);
</span><span class="cx">     void deleteLayer(WebCore::CoordinatedLayerID);
</span></span></pre></div>
<a id="trunkSourceWebKit2SharedCoordinatedGraphicsthreadedcompositorCompositingRunLoopcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/Shared/CoordinatedGraphics/threadedcompositor/CompositingRunLoop.cpp (215258 => 215259)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Shared/CoordinatedGraphics/threadedcompositor/CompositingRunLoop.cpp        2017-04-12 06:12:26 UTC (rev 215258)
+++ trunk/Source/WebKit2/Shared/CoordinatedGraphics/threadedcompositor/CompositingRunLoop.cpp        2017-04-12 06:50:50 UTC (rev 215259)
</span><span class="lines">@@ -112,6 +112,8 @@
</span><span class="cx">     : m_updateTimer(WorkQueuePool::singleton().runLoop(this), this, &amp;CompositingRunLoop::updateTimerFired)
</span><span class="cx">     , m_updateFunction(WTFMove(updateFunction))
</span><span class="cx"> {
</span><ins>+    m_updateState.store(UpdateState::Completed);
+
</ins><span class="cx"> #if USE(GLIB_EVENT_LOOP)
</span><span class="cx">     m_updateTimer.setPriority(RunLoopSourcePriority::CompositingThreadUpdateTimer);
</span><span class="cx"> #endif
</span><span class="lines">@@ -144,28 +146,44 @@
</span><span class="cx">     m_dispatchSyncCondition.wait(m_dispatchSyncConditionMutex);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void CompositingRunLoop::startUpdateTimer(UpdateTiming timing)
</del><ins>+bool CompositingRunLoop::isActive()
</ins><span class="cx"> {
</span><del>-    if (m_updateTimer.isActive())
</del><ins>+    return m_updateState.load() != UpdateState::Completed;
+}
+
+void CompositingRunLoop::scheduleUpdate()
+{
+    if (m_updateState.compareExchangeStrong(UpdateState::Completed, UpdateState::InProgress) == UpdateState::Completed) {
+        m_updateTimer.startOneShot(0);
</ins><span class="cx">         return;
</span><ins>+    }
</ins><span class="cx"> 
</span><del>-    const static double targetFPS = 60;
-    double nextUpdateTime = 0;
-    if (timing == WaitUntilNextFrame)
-        nextUpdateTime = std::max((1 / targetFPS) - (monotonicallyIncreasingTime() - m_lastUpdateTime), 0.0);
-
-    m_updateTimer.startOneShot(1_s * nextUpdateTime);
</del><ins>+    if (m_updateState.compareExchangeStrong(UpdateState::InProgress, UpdateState::PendingAfterCompletion) == UpdateState::InProgress)
+        return;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void CompositingRunLoop::stopUpdateTimer()
</del><ins>+void CompositingRunLoop::stopUpdates()
</ins><span class="cx"> {
</span><span class="cx">     m_updateTimer.stop();
</span><ins>+    m_updateState.store(UpdateState::Completed);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void CompositingRunLoop::updateCompleted()
+{
+    if (m_updateState.compareExchangeStrong(UpdateState::InProgress, UpdateState::Completed) == UpdateState::InProgress)
+        return;
+
+    if (m_updateState.compareExchangeStrong(UpdateState::PendingAfterCompletion, UpdateState::InProgress) == UpdateState::PendingAfterCompletion) {
+        m_updateTimer.startOneShot(0);
+        return;
+    }
+
+    ASSERT_NOT_REACHED();
+}
+
</ins><span class="cx"> void CompositingRunLoop::updateTimerFired()
</span><span class="cx"> {
</span><span class="cx">     m_updateFunction();
</span><del>-    m_lastUpdateTime = monotonicallyIncreasingTime();
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebKit
</span></span></pre></div>
<a id="trunkSourceWebKit2SharedCoordinatedGraphicsthreadedcompositorCompositingRunLooph"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/Shared/CoordinatedGraphics/threadedcompositor/CompositingRunLoop.h (215258 => 215259)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Shared/CoordinatedGraphics/threadedcompositor/CompositingRunLoop.h        2017-04-12 06:12:26 UTC (rev 215258)
+++ trunk/Source/WebKit2/Shared/CoordinatedGraphics/threadedcompositor/CompositingRunLoop.h        2017-04-12 06:50:50 UTC (rev 215259)
</span><span class="lines">@@ -28,6 +28,7 @@
</span><span class="cx"> 
</span><span class="cx"> #if USE(COORDINATED_GRAPHICS_THREADED)
</span><span class="cx"> 
</span><ins>+#include &lt;wtf/Atomics.h&gt;
</ins><span class="cx"> #include &lt;wtf/Condition.h&gt;
</span><span class="cx"> #include &lt;wtf/FastMalloc.h&gt;
</span><span class="cx"> #include &lt;wtf/Function.h&gt;
</span><span class="lines">@@ -41,11 +42,6 @@
</span><span class="cx">     WTF_MAKE_NONCOPYABLE(CompositingRunLoop);
</span><span class="cx">     WTF_MAKE_FAST_ALLOCATED;
</span><span class="cx"> public:
</span><del>-    enum UpdateTiming {
-        Immediate,
-        WaitUntilNextFrame,
-    };
-
</del><span class="cx">     CompositingRunLoop(std::function&lt;void ()&gt;&amp;&amp;);
</span><span class="cx">     ~CompositingRunLoop();
</span><span class="cx"> 
</span><span class="lines">@@ -52,18 +48,33 @@
</span><span class="cx">     void performTask(Function&lt;void ()&gt;&amp;&amp;);
</span><span class="cx">     void performTaskSync(Function&lt;void ()&gt;&amp;&amp;);
</span><span class="cx"> 
</span><del>-    void startUpdateTimer(UpdateTiming = Immediate);
-    void stopUpdateTimer();
</del><ins>+    bool isActive();
+    void scheduleUpdate();
+    void stopUpdates();
</ins><span class="cx"> 
</span><ins>+    void updateCompleted();
+
+#ifndef NDEBUG
+    bool isCurrent();
+#endif
+
</ins><span class="cx"> private:
</span><ins>+    enum class UpdateState {
+        Completed,
+        InProgress,
+        PendingAfterCompletion,
+    };
+
</ins><span class="cx">     void updateTimerFired();
</span><span class="cx"> 
</span><span class="cx">     RunLoop::Timer&lt;CompositingRunLoop&gt; m_updateTimer;
</span><ins>+#ifndef NDEBUG
+    RunLoop&amp; m_runLoop;
+#endif
</ins><span class="cx">     std::function&lt;void ()&gt; m_updateFunction;
</span><ins>+    Atomic&lt;UpdateState&gt; m_updateState;
</ins><span class="cx">     Lock m_dispatchSyncConditionMutex;
</span><span class="cx">     Condition m_dispatchSyncCondition;
</span><del>-
-    double m_lastUpdateTime { 0 };
</del><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebKit
</span></span></pre></div>
<a id="trunkSourceWebKit2SharedCoordinatedGraphicsthreadedcompositorThreadedCompositorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/Shared/CoordinatedGraphics/threadedcompositor/ThreadedCompositor.cpp (215258 => 215259)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Shared/CoordinatedGraphics/threadedcompositor/ThreadedCompositor.cpp        2017-04-12 06:12:26 UTC (rev 215258)
+++ trunk/Source/WebKit2/Shared/CoordinatedGraphics/threadedcompositor/ThreadedCompositor.cpp        2017-04-12 06:50:50 UTC (rev 215259)
</span><span class="lines">@@ -29,6 +29,7 @@
</span><span class="cx"> #if USE(COORDINATED_GRAPHICS_THREADED)
</span><span class="cx"> 
</span><span class="cx"> #include &quot;CompositingRunLoop.h&quot;
</span><ins>+#include &quot;ThreadedDisplayRefreshMonitor.h&quot;
</ins><span class="cx"> #include &lt;WebCore/PlatformDisplay.h&gt;
</span><span class="cx"> #include &lt;WebCore/TransformationMatrix.h&gt;
</span><span class="cx"> 
</span><span class="lines">@@ -56,7 +57,13 @@
</span><span class="cx">     , m_paintFlags(paintFlags)
</span><span class="cx">     , m_needsResize(!viewportSize.isEmpty())
</span><span class="cx">     , m_compositingRunLoop(std::make_unique&lt;CompositingRunLoop&gt;([this] { renderLayerTree(); }))
</span><ins>+#if USE(REQUEST_ANIMATION_FRAME_DISPLAY_MONITOR)
+    , m_displayRefreshMonitor(ThreadedDisplayRefreshMonitor::create(*this))
+#endif
</ins><span class="cx"> {
</span><ins>+    m_clientRendersNextFrame.store(false);
+    m_coordinateUpdateCompletionWithClient.store(false);
+
</ins><span class="cx">     m_compositingRunLoop-&gt;performTaskSync([this, protectedThis = makeRef(*this)] {
</span><span class="cx">         m_scene = adoptRef(new CoordinatedGraphicsScene(this));
</span><span class="cx">         if (m_nativeSurfaceHandle) {
</span><span class="lines">@@ -89,18 +96,21 @@
</span><span class="cx"> void ThreadedCompositor::invalidate()
</span><span class="cx"> {
</span><span class="cx">     m_scene-&gt;detach();
</span><del>-    m_compositingRunLoop-&gt;stopUpdateTimer();
</del><ins>+    m_compositingRunLoop-&gt;stopUpdates();
</ins><span class="cx">     m_compositingRunLoop-&gt;performTaskSync([this, protectedThis = makeRef(*this)] {
</span><span class="cx">         m_scene-&gt;purgeGLResources();
</span><span class="cx">         m_context = nullptr;
</span><span class="cx">         m_scene = nullptr;
</span><span class="cx">     });
</span><ins>+#if USE(REQUEST_ANIMATION_FRAME_DISPLAY_MONITOR)
+    m_displayRefreshMonitor-&gt;invalidate();
+#endif
</ins><span class="cx">     m_compositingRunLoop = nullptr;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void ThreadedCompositor::setNativeSurfaceHandleForCompositing(uint64_t handle)
</span><span class="cx"> {
</span><del>-    m_compositingRunLoop-&gt;stopUpdateTimer();
</del><ins>+    m_compositingRunLoop-&gt;stopUpdates();
</ins><span class="cx">     m_compositingRunLoop-&gt;performTaskSync([this, protectedThis = makeRef(*this), handle] {
</span><span class="cx">         // A new native handle can't be set without destroying the previous one first if any.
</span><span class="cx">         ASSERT(!!handle ^ !!m_nativeSurfaceHandle);
</span><span class="lines">@@ -119,7 +129,7 @@
</span><span class="cx"> {
</span><span class="cx">     m_compositingRunLoop-&gt;performTask([this, protectedThis = makeRef(*this), scale] {
</span><span class="cx">         m_scaleFactor = scale;
</span><del>-        scheduleDisplayImmediately();
</del><ins>+        m_compositingRunLoop-&gt;scheduleUpdate();
</ins><span class="cx">     });
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -128,7 +138,7 @@
</span><span class="cx">     m_compositingRunLoop-&gt;performTask([this, protectedThis = makeRef(*this), scrollPosition, scale] {
</span><span class="cx">         m_scrollPosition = scrollPosition;
</span><span class="cx">         m_scaleFactor = scale;
</span><del>-        scheduleDisplayImmediately();
</del><ins>+        m_compositingRunLoop-&gt;scheduleUpdate();
</ins><span class="cx">     });
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -138,7 +148,7 @@
</span><span class="cx">         m_viewportSize = viewportSize;
</span><span class="cx">         m_scaleFactor = scale;
</span><span class="cx">         m_needsResize = true;
</span><del>-        scheduleDisplayImmediately();
</del><ins>+        m_compositingRunLoop-&gt;scheduleUpdate();
</ins><span class="cx">     });
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -146,7 +156,7 @@
</span><span class="cx"> {
</span><span class="cx">     m_compositingRunLoop-&gt;performTask([this, protectedThis = Ref&lt;ThreadedCompositor&gt;(*this), drawsBackground] {
</span><span class="cx">         m_drawsBackground = drawsBackground;
</span><del>-        scheduleDisplayImmediately();
</del><ins>+        m_compositingRunLoop-&gt;scheduleUpdate();
</ins><span class="cx">     });
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -164,14 +174,9 @@
</span><span class="cx"> 
</span><span class="cx"> void ThreadedCompositor::updateViewport()
</span><span class="cx"> {
</span><del>-    m_compositingRunLoop-&gt;startUpdateTimer(CompositingRunLoop::WaitUntilNextFrame);
</del><ins>+    m_compositingRunLoop-&gt;scheduleUpdate();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void ThreadedCompositor::scheduleDisplayImmediately()
-{
-    m_compositingRunLoop-&gt;startUpdateTimer(CompositingRunLoop::Immediate);
-}
-
</del><span class="cx"> void ThreadedCompositor::forceRepaint()
</span><span class="cx"> {
</span><span class="cx">     m_compositingRunLoop-&gt;performTaskSync([this, protectedThis = makeRef(*this)] {
</span><span class="lines">@@ -205,18 +210,65 @@
</span><span class="cx">     m_scene-&gt;paintToCurrentGLContext(viewportTransform, 1, clipRect, Color::transparent, !m_drawsBackground, m_scrollPosition, m_paintFlags);
</span><span class="cx"> 
</span><span class="cx">     m_context-&gt;swapBuffers();
</span><ins>+
+    sceneUpdateFinished();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void ThreadedCompositor::sceneUpdateFinished()
+{
+    bool shouldDispatchDisplayRefreshCallback = m_clientRendersNextFrame.load()
+        || m_displayRefreshMonitor-&gt;requiresDisplayRefreshCallback();
+    bool shouldCoordinateUpdateCompletionWithClient = m_coordinateUpdateCompletionWithClient.load();
+
+    if (shouldDispatchDisplayRefreshCallback)
+        m_displayRefreshMonitor-&gt;dispatchDisplayRefreshCallback();
+    if (!shouldCoordinateUpdateCompletionWithClient)
+        m_compositingRunLoop-&gt;updateCompleted();
+}
+
</ins><span class="cx"> void ThreadedCompositor::updateSceneState(const CoordinatedGraphicsState&amp; state)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(isMainThread());
</span><span class="cx">     RefPtr&lt;CoordinatedGraphicsScene&gt; scene = m_scene;
</span><del>-    m_scene-&gt;appendUpdate([scene, state] {
</del><ins>+    m_scene-&gt;appendUpdate([this, scene, state] {
</ins><span class="cx">         scene-&gt;commitSceneState(state);
</span><ins>+
+        m_clientRendersNextFrame.store(true);
+        bool coordinateUpdate = std::any_of(state.layersToUpdate.begin(), state.layersToUpdate.end(),
+            [](const std::pair&lt;CoordinatedLayerID, CoordinatedGraphicsLayerState&gt;&amp; it) {
+                return it.second.platformLayerChanged || it.second.platformLayerUpdated;
+            });
+        m_coordinateUpdateCompletionWithClient.store(coordinateUpdate);
</ins><span class="cx">     });
</span><span class="cx"> 
</span><del>-    scheduleDisplayImmediately();
</del><ins>+    m_compositingRunLoop-&gt;scheduleUpdate();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+#if USE(REQUEST_ANIMATION_FRAME_DISPLAY_MONITOR)
+RefPtr&lt;WebCore::DisplayRefreshMonitor&gt; ThreadedCompositor::displayRefreshMonitor(PlatformDisplayID)
+{
+    return m_displayRefreshMonitor.copyRef();
</ins><span class="cx"> }
</span><ins>+
+void ThreadedCompositor::renderNextFrameIfNeeded()
+{
+    if (m_clientRendersNextFrame.compareExchangeStrong(true, false))
+        m_scene-&gt;renderNextFrame();
+}
+
+void ThreadedCompositor::completeCoordinatedUpdateIfNeeded()
+{
+    if (m_coordinateUpdateCompletionWithClient.compareExchangeStrong(true, false))
+        m_compositingRunLoop-&gt;updateCompleted();
+}
+
+void ThreadedCompositor::coordinateUpdateCompletionWithClient()
+{
+    m_coordinateUpdateCompletionWithClient.store(true);
+    if (!m_compositingRunLoop-&gt;isActive())
+        m_compositingRunLoop-&gt;scheduleUpdate();
+}
+#endif
+
+}
</ins><span class="cx"> #endif // USE(COORDINATED_GRAPHICS_THREADED)
</span></span></pre></div>
<a id="trunkSourceWebKit2SharedCoordinatedGraphicsthreadedcompositorThreadedCompositorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/Shared/CoordinatedGraphics/threadedcompositor/ThreadedCompositor.h (215258 => 215259)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Shared/CoordinatedGraphics/threadedcompositor/ThreadedCompositor.h        2017-04-12 06:12:26 UTC (rev 215258)
+++ trunk/Source/WebKit2/Shared/CoordinatedGraphics/threadedcompositor/ThreadedCompositor.h        2017-04-12 06:50:50 UTC (rev 215259)
</span><span class="lines">@@ -33,10 +33,15 @@
</span><span class="cx"> #include &lt;WebCore/GLContext.h&gt;
</span><span class="cx"> #include &lt;WebCore/IntSize.h&gt;
</span><span class="cx"> #include &lt;WebCore/TextureMapper.h&gt;
</span><ins>+#include &lt;wtf/Atomics.h&gt;
</ins><span class="cx"> #include &lt;wtf/FastMalloc.h&gt;
</span><span class="cx"> #include &lt;wtf/Noncopyable.h&gt;
</span><span class="cx"> #include &lt;wtf/ThreadSafeRefCounted.h&gt;
</span><span class="cx"> 
</span><ins>+#if USE(REQUEST_ANIMATION_FRAME_DISPLAY_MONITOR)
+#include &lt;WebCore/DisplayRefreshMonitor.h&gt;
+#endif
+
</ins><span class="cx"> namespace WebCore {
</span><span class="cx"> struct CoordinatedGraphicsState;
</span><span class="cx"> }
</span><span class="lines">@@ -45,6 +50,7 @@
</span><span class="cx"> 
</span><span class="cx"> class CoordinatedGraphicsScene;
</span><span class="cx"> class CoordinatedGraphicsSceneClient;
</span><ins>+class ThreadedDisplayRefreshMonitor;
</ins><span class="cx"> 
</span><span class="cx"> class ThreadedCompositor : public CoordinatedGraphicsSceneClient, public ThreadSafeRefCounted&lt;ThreadedCompositor&gt; {
</span><span class="cx">     WTF_MAKE_NONCOPYABLE(ThreadedCompositor);
</span><span class="lines">@@ -73,6 +79,13 @@
</span><span class="cx"> 
</span><span class="cx">     void forceRepaint();
</span><span class="cx"> 
</span><ins>+#if USE(REQUEST_ANIMATION_FRAME_DISPLAY_MONITOR)
+    RefPtr&lt;WebCore::DisplayRefreshMonitor&gt; displayRefreshMonitor(WebCore::PlatformDisplayID);
+    void renderNextFrameIfNeeded();
+    void completeCoordinatedUpdateIfNeeded();
+    void coordinateUpdateCompletionWithClient();
+#endif
+
</ins><span class="cx"> private:
</span><span class="cx">     ThreadedCompositor(Client&amp;, const WebCore::IntSize&amp;, float scaleFactor, uint64_t nativeSurfaceHandle, ShouldDoFrameSync, WebCore::TextureMapper::PaintFlags);
</span><span class="cx"> 
</span><span class="lines">@@ -82,7 +95,7 @@
</span><span class="cx">     void commitScrollOffset(uint32_t layerID, const WebCore::IntSize&amp; offset) override;
</span><span class="cx"> 
</span><span class="cx">     void renderLayerTree();
</span><del>-    void scheduleDisplayImmediately();
</del><ins>+    void sceneUpdateFinished();
</ins><span class="cx"> 
</span><span class="cx">     void createGLContext();
</span><span class="cx"> 
</span><span class="lines">@@ -100,6 +113,13 @@
</span><span class="cx">     bool m_needsResize { false };
</span><span class="cx"> 
</span><span class="cx">     std::unique_ptr&lt;CompositingRunLoop&gt; m_compositingRunLoop;
</span><ins>+
+#if USE(REQUEST_ANIMATION_FRAME_DISPLAY_MONITOR)
+    Ref&lt;ThreadedDisplayRefreshMonitor&gt; m_displayRefreshMonitor;
+#endif
+
+    Atomic&lt;bool&gt; m_clientRendersNextFrame;
+    Atomic&lt;bool&gt; m_coordinateUpdateCompletionWithClient;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebKit
</span></span></pre></div>
<a id="trunkSourceWebKit2SharedCoordinatedGraphicsthreadedcompositorThreadedDisplayRefreshMonitorcpp"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/Shared/CoordinatedGraphics/threadedcompositor/ThreadedDisplayRefreshMonitor.cpp (0 => 215259)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Shared/CoordinatedGraphics/threadedcompositor/ThreadedDisplayRefreshMonitor.cpp                                (rev 0)
+++ trunk/Source/WebKit2/Shared/CoordinatedGraphics/threadedcompositor/ThreadedDisplayRefreshMonitor.cpp        2017-04-12 06:50:50 UTC (rev 215259)
</span><span class="lines">@@ -0,0 +1,101 @@
</span><ins>+/*
+ * Copyright (C) 2014 Igalia S.L.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include &quot;config.h&quot;
+#include &quot;ThreadedDisplayRefreshMonitor.h&quot;
+
+#if USE(COORDINATED_GRAPHICS_THREADED) &amp;&amp; USE(REQUEST_ANIMATION_FRAME_DISPLAY_MONITOR)
+
+#include &quot;CompositingRunLoop.h&quot;
+#include &quot;ThreadedCompositor.h&quot;
+#include &lt;wtf/glib/RunLoopSourcePriority.h&gt;
+
+namespace WebKit {
+
+ThreadedDisplayRefreshMonitor::ThreadedDisplayRefreshMonitor(ThreadedCompositor&amp; compositor)
+    : WebCore::DisplayRefreshMonitor(0)
+    , m_displayRefreshTimer(RunLoop::main(), this, &amp;ThreadedDisplayRefreshMonitor::displayRefreshCallback)
+    , m_compositor(&amp;compositor)
+{
+#if USE(GLIB_EVENT_LOOP)
+    m_displayRefreshTimer.setPriority(RunLoopSourcePriority::DisplayRefreshMonitorTimer);
+#endif
+}
+
+bool ThreadedDisplayRefreshMonitor::requestRefreshCallback()
+{
+    if (!m_compositor)
+        return false;
+
+    LockHolder locker(mutex());
+    setIsScheduled(true);
+
+    if (isPreviousFrameDone())
+        m_compositor-&gt;coordinateUpdateCompletionWithClient();
+
+    return true;
+}
+
+bool ThreadedDisplayRefreshMonitor::requiresDisplayRefreshCallback()
+{
+    LockHolder locker(mutex());
+    return isScheduled() &amp;&amp; isPreviousFrameDone();
+}
+
+void ThreadedDisplayRefreshMonitor::dispatchDisplayRefreshCallback()
+{
+    m_displayRefreshTimer.startOneShot(0);
+}
+
+void ThreadedDisplayRefreshMonitor::invalidate()
+{
+    m_displayRefreshTimer.stop();
+    m_compositor = nullptr;
+}
+
+void ThreadedDisplayRefreshMonitor::displayRefreshCallback()
+{
+    bool shouldHandleDisplayRefreshNotification = false;
+    {
+        LockHolder locker(mutex());
+        shouldHandleDisplayRefreshNotification = isScheduled() &amp;&amp; isPreviousFrameDone();
+        if (shouldHandleDisplayRefreshNotification)
+            setIsPreviousFrameDone(false);
+    }
+
+    if (shouldHandleDisplayRefreshNotification)
+        DisplayRefreshMonitor::handleDisplayRefreshedNotificationOnMainThread(this);
+
+    if (m_compositor) {
+        m_compositor-&gt;renderNextFrameIfNeeded();
+        m_compositor-&gt;completeCoordinatedUpdateIfNeeded();
+        if (isScheduled())
+            m_compositor-&gt;coordinateUpdateCompletionWithClient();
+    }
+}
+
+} // namespace WebKit
+
+#endif // USE(COORDINATED_GRAPHICS_THREADED) &amp;&amp; USE(REQUEST_ANIMATION_FRAME_DISPLAY_MONITOR)
</ins></span></pre></div>
<a id="trunkSourceWebKit2SharedCoordinatedGraphicsthreadedcompositorThreadedDisplayRefreshMonitorh"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/Shared/CoordinatedGraphics/threadedcompositor/ThreadedDisplayRefreshMonitor.h (0 => 215259)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Shared/CoordinatedGraphics/threadedcompositor/ThreadedDisplayRefreshMonitor.h                                (rev 0)
+++ trunk/Source/WebKit2/Shared/CoordinatedGraphics/threadedcompositor/ThreadedDisplayRefreshMonitor.h        2017-04-12 06:50:50 UTC (rev 215259)
</span><span class="lines">@@ -0,0 +1,61 @@
</span><ins>+/*
+ * Copyright (C) 2014 Igalia S.L.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#if USE(COORDINATED_GRAPHICS_THREADED) &amp;&amp; USE(REQUEST_ANIMATION_FRAME_DISPLAY_MONITOR)
+
+#include &lt;WebCore/DisplayRefreshMonitor.h&gt;
+#include &lt;wtf/RunLoop.h&gt;
+
+namespace WebKit {
+
+class ThreadedCompositor;
+
+class ThreadedDisplayRefreshMonitor : public WebCore::DisplayRefreshMonitor {
+public:
+    static Ref&lt;ThreadedDisplayRefreshMonitor&gt; create(ThreadedCompositor&amp; compositor)
+    {
+        return adoptRef(*new ThreadedDisplayRefreshMonitor(compositor));
+    }
+    virtual ~ThreadedDisplayRefreshMonitor() = default;
+
+    bool requestRefreshCallback() override;
+
+    bool requiresDisplayRefreshCallback();
+    void dispatchDisplayRefreshCallback();
+    void invalidate();
+
+private:
+    ThreadedDisplayRefreshMonitor(ThreadedCompositor&amp;);
+
+    void displayRefreshCallback();
+    RunLoop::Timer&lt;ThreadedDisplayRefreshMonitor&gt; m_displayRefreshTimer;
+    ThreadedCompositor* m_compositor;
+};
+
+} // namespace WebKit
+
+#endif // USE(COORDINATED_GRAPHICS_THREADED) &amp;&amp; USE(REQUEST_ANIMATION_FRAME_DISPLAY_MONITOR)
</ins></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageAcceleratedDrawingAreacpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/AcceleratedDrawingArea.cpp (215258 => 215259)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/AcceleratedDrawingArea.cpp        2017-04-12 06:12:26 UTC (rev 215258)
+++ trunk/Source/WebKit2/WebProcess/WebPage/AcceleratedDrawingArea.cpp        2017-04-12 06:50:50 UTC (rev 215259)
</span><span class="lines">@@ -223,6 +223,15 @@
</span><span class="cx">     scheduleCompositingLayerFlush();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+#if USE(REQUEST_ANIMATION_FRAME_DISPLAY_MONITOR)
+RefPtr&lt;WebCore::DisplayRefreshMonitor&gt; AcceleratedDrawingArea::createDisplayRefreshMonitor(WebCore::PlatformDisplayID displayID)
+{
+    if (!m_layerTreeHost || m_wantsToExitAcceleratedCompositingMode || exitAcceleratedCompositingModePending())
+        return nullptr;
+    return m_layerTreeHost-&gt;createDisplayRefreshMonitor(displayID);
+}
+#endif
+
</ins><span class="cx"> void AcceleratedDrawingArea::updateBackingStoreState(uint64_t stateID, bool respondImmediately, float deviceScaleFactor, const IntSize&amp; size, const IntSize&amp; scrollOffset)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(!m_inUpdateBackingStoreState);
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageAcceleratedDrawingAreah"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/AcceleratedDrawingArea.h (215258 => 215259)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/AcceleratedDrawingArea.h        2017-04-12 06:12:26 UTC (rev 215258)
+++ trunk/Source/WebKit2/WebProcess/WebPage/AcceleratedDrawingArea.h        2017-04-12 06:50:50 UTC (rev 215259)
</span><span class="lines">@@ -59,6 +59,10 @@
</span><span class="cx">     void scheduleCompositingLayerFlush() override;
</span><span class="cx">     void scheduleCompositingLayerFlushImmediately() override;
</span><span class="cx"> 
</span><ins>+#if USE(REQUEST_ANIMATION_FRAME_DISPLAY_MONITOR)
+    virtual RefPtr&lt;WebCore::DisplayRefreshMonitor&gt; createDisplayRefreshMonitor(WebCore::PlatformDisplayID);
+#endif
+
</ins><span class="cx"> #if USE(TEXTURE_MAPPER_GL) &amp;&amp; PLATFORM(GTK) &amp;&amp; PLATFORM(X11) &amp;&amp; !USE(REDIRECTED_XCOMPOSITE_WINDOW)
</span><span class="cx">     void setNativeSurfaceHandleForCompositing(uint64_t) override;
</span><span class="cx">     void destroyNativeSurfaceHandleForCompositing(bool&amp;) override;
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageCoordinatedGraphicsThreadedCoordinatedLayerTreeHostcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/CoordinatedGraphics/ThreadedCoordinatedLayerTreeHost.cpp (215258 => 215259)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/CoordinatedGraphics/ThreadedCoordinatedLayerTreeHost.cpp        2017-04-12 06:12:26 UTC (rev 215258)
+++ trunk/Source/WebKit2/WebProcess/WebPage/CoordinatedGraphics/ThreadedCoordinatedLayerTreeHost.cpp        2017-04-12 06:50:50 UTC (rev 215259)
</span><span class="lines">@@ -74,7 +74,7 @@
</span><span class="cx">         // Do not do frame sync when rendering offscreen in the web process to ensure that SwapBuffers never blocks.
</span><span class="cx">         // Rendering to the actual screen will happen later anyway since the UI process schedules a redraw for every update,
</span><span class="cx">         // the compositor will take care of syncing to vblank.
</span><del>-        m_compositor = ThreadedCompositor::create(m_compositorClient, scaledSize, scaleFactor, m_surface-&gt;window(), ThreadedCompositor::ShouldDoFrameSync::No, paintFlags);
</del><ins>+        m_compositor = ThreadedCompositor::create(m_compositorClient, scaledSize, scaleFactor, m_surface-&gt;window(), ThreadedCompositor::ShouldDoFrameSync::Yes, paintFlags);
</ins><span class="cx">         m_layerTreeContext.contextID = m_surface-&gt;surfaceID();
</span><span class="cx">     } else
</span><span class="cx">         m_compositor = ThreadedCompositor::create(m_compositorClient, scaledSize, scaleFactor);
</span><span class="lines">@@ -247,6 +247,13 @@
</span><span class="cx">         didChangeViewport();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+#if USE(REQUEST_ANIMATION_FRAME_DISPLAY_MONITOR)
+RefPtr&lt;WebCore::DisplayRefreshMonitor&gt; ThreadedCoordinatedLayerTreeHost::createDisplayRefreshMonitor(PlatformDisplayID displayID)
+{
+    return m_compositor-&gt;displayRefreshMonitor(displayID);
+}
+#endif
+
</ins><span class="cx"> } // namespace WebKit
</span><span class="cx"> 
</span><span class="cx"> #endif // USE(COORDINATED_GRAPHICS)
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageCoordinatedGraphicsThreadedCoordinatedLayerTreeHosth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/CoordinatedGraphics/ThreadedCoordinatedLayerTreeHost.h (215258 => 215259)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/CoordinatedGraphics/ThreadedCoordinatedLayerTreeHost.h        2017-04-12 06:12:26 UTC (rev 215258)
+++ trunk/Source/WebKit2/WebProcess/WebPage/CoordinatedGraphics/ThreadedCoordinatedLayerTreeHost.h        2017-04-12 06:50:50 UTC (rev 215259)
</span><span class="lines">@@ -101,6 +101,10 @@
</span><span class="cx">     void didFlushRootLayer(const WebCore::FloatRect&amp;) override { }
</span><span class="cx">     void commitSceneState(const WebCore::CoordinatedGraphicsState&amp;) override;
</span><span class="cx"> 
</span><ins>+#if USE(REQUEST_ANIMATION_FRAME_DISPLAY_MONITOR)
+    RefPtr&lt;WebCore::DisplayRefreshMonitor&gt; createDisplayRefreshMonitor(WebCore::PlatformDisplayID) override;
+#endif
+
</ins><span class="cx">     enum class DiscardableSyncActions {
</span><span class="cx">         UpdateSize = 1 &lt;&lt; 1,
</span><span class="cx">         UpdateViewport = 1 &lt;&lt; 2,
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageLayerTreeHosth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/LayerTreeHost.h (215258 => 215259)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/LayerTreeHost.h        2017-04-12 06:12:26 UTC (rev 215258)
+++ trunk/Source/WebKit2/WebProcess/WebPage/LayerTreeHost.h        2017-04-12 06:50:50 UTC (rev 215259)
</span><span class="lines">@@ -29,6 +29,8 @@
</span><span class="cx"> #if USE(COORDINATED_GRAPHICS) || USE(TEXTURE_MAPPER)
</span><span class="cx"> 
</span><span class="cx"> #include &quot;LayerTreeContext.h&quot;
</span><ins>+#include &lt;WebCore/DisplayRefreshMonitor.h&gt;
+#include &lt;WebCore/PlatformScreen.h&gt;
</ins><span class="cx"> #include &lt;wtf/Forward.h&gt;
</span><span class="cx"> #include &lt;wtf/RefCounted.h&gt;
</span><span class="cx"> #include &lt;wtf/RefPtr.h&gt;
</span><span class="lines">@@ -96,6 +98,10 @@
</span><span class="cx">     virtual void deviceOrPageScaleFactorChanged() = 0;
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><ins>+#if USE(REQUEST_ANIMATION_FRAME_DISPLAY_MONITOR)
+    virtual RefPtr&lt;WebCore::DisplayRefreshMonitor&gt; createDisplayRefreshMonitor(WebCore::PlatformDisplayID) { return nullptr; }
+#endif
+
</ins><span class="cx">     virtual void setViewOverlayRootLayer(WebCore::GraphicsLayer* viewOverlayRootLayer) { m_viewOverlayRootLayer = viewOverlayRootLayer; }
</span><span class="cx"> 
</span><span class="cx"> protected:
</span></span></pre>
</div>
</div>

</body>
</html>