<!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>[210815] releases/WebKitGTK/webkit-2.14/Source/WebCore</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/210815">210815</a></dd>
<dt>Author</dt> <dd>carlosgc@webkit.org</dd>
<dt>Date</dt> <dd>2017-01-17 05:47:22 -0800 (Tue, 17 Jan 2017)</dd>
</dl>

<h3>Log Message</h3>
<pre>Merge <a href="http://trac.webkit.org/projects/webkit/changeset/210543">r210543</a> - [CoordinatedGraphics] TextureMapperPlatformLayerProxy is constantly getting activated
https://bugs.webkit.org/show_bug.cgi?id=166856

Reviewed by Michael Catanzaro.

When CoordinatedGraphicsLayer::setContentsNeedsDisplay() is called, currently with
the threaded CoordinatedGraphics mode the platform layer is marked for synchronizing.
This means that at flush-time this layer swaps the buffer of the wrapped platform
layer and updates the layer state to indicate that the underlying
TextureMapperPlatformLayerProxy object has to be activated on the composition thread.

This current logic results in the TextureMapperPlatformLayerProxy object being
reactivated for every display request that arrives via setContentsNeedsDisplay().
This is pretty wasteful since this activation heap-allocates a RunLoop::Timer object
which internally also locks up the GLib main context to attach a new source, and
that's only after the source on the previous RunLoop::Timer was detached before
that RunLoop::Timer was destroyed.

To avoid this, CoordinatedGraphicsLayer::setContentsNeedsDisplay() sets a new flag,
m_shouldUpdatePlatformLayer. During flush, this flag is checked in
CoordinatedGraphicsLayer::updatePlatformLayer(), with the buffer swap performed in
case it's set. CoordinatedGraphicsLayer::syncPlatformLayer() now only sets the
platform layer proxy object for that layer's state.

* platform/graphics/texmap/coordinated/CoordinatedGraphicsLayer.cpp:
(WebCore::CoordinatedGraphicsLayer::CoordinatedGraphicsLayer):
(WebCore::CoordinatedGraphicsLayer::setContentsNeedsDisplay):
(WebCore::CoordinatedGraphicsLayer::syncPlatformLayer):
(WebCore::CoordinatedGraphicsLayer::updatePlatformLayer):
(WebCore::CoordinatedGraphicsLayer::flushCompositingStateForThisLayerOnly):
* platform/graphics/texmap/coordinated/CoordinatedGraphicsLayer.h:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#releasesWebKitGTKwebkit214SourceWebCoreChangeLog">releases/WebKitGTK/webkit-2.14/Source/WebCore/ChangeLog</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceWebCoreplatformgraphicstexmapcoordinatedCoordinatedGraphicsLayercpp">releases/WebKitGTK/webkit-2.14/Source/WebCore/platform/graphics/texmap/coordinated/CoordinatedGraphicsLayer.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceWebCoreplatformgraphicstexmapcoordinatedCoordinatedGraphicsLayerh">releases/WebKitGTK/webkit-2.14/Source/WebCore/platform/graphics/texmap/coordinated/CoordinatedGraphicsLayer.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="releasesWebKitGTKwebkit214SourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/WebCore/ChangeLog (210814 => 210815)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WebCore/ChangeLog        2017-01-17 13:47:15 UTC (rev 210814)
+++ releases/WebKitGTK/webkit-2.14/Source/WebCore/ChangeLog        2017-01-17 13:47:22 UTC (rev 210815)
</span><span class="lines">@@ -1,5 +1,39 @@
</span><span class="cx"> 2017-01-10  Zan Dobersek  &lt;zdobersek@igalia.com&gt;
</span><span class="cx"> 
</span><ins>+        [CoordinatedGraphics] TextureMapperPlatformLayerProxy is constantly getting activated
+        https://bugs.webkit.org/show_bug.cgi?id=166856
+
+        Reviewed by Michael Catanzaro.
+
+        When CoordinatedGraphicsLayer::setContentsNeedsDisplay() is called, currently with
+        the threaded CoordinatedGraphics mode the platform layer is marked for synchronizing.
+        This means that at flush-time this layer swaps the buffer of the wrapped platform
+        layer and updates the layer state to indicate that the underlying
+        TextureMapperPlatformLayerProxy object has to be activated on the composition thread.
+
+        This current logic results in the TextureMapperPlatformLayerProxy object being
+        reactivated for every display request that arrives via setContentsNeedsDisplay().
+        This is pretty wasteful since this activation heap-allocates a RunLoop::Timer object
+        which internally also locks up the GLib main context to attach a new source, and
+        that's only after the source on the previous RunLoop::Timer was detached before
+        that RunLoop::Timer was destroyed.
+
+        To avoid this, CoordinatedGraphicsLayer::setContentsNeedsDisplay() sets a new flag,
+        m_shouldUpdatePlatformLayer. During flush, this flag is checked in
+        CoordinatedGraphicsLayer::updatePlatformLayer(), with the buffer swap performed in
+        case it's set. CoordinatedGraphicsLayer::syncPlatformLayer() now only sets the
+        platform layer proxy object for that layer's state.
+
+        * platform/graphics/texmap/coordinated/CoordinatedGraphicsLayer.cpp:
+        (WebCore::CoordinatedGraphicsLayer::CoordinatedGraphicsLayer):
+        (WebCore::CoordinatedGraphicsLayer::setContentsNeedsDisplay):
+        (WebCore::CoordinatedGraphicsLayer::syncPlatformLayer):
+        (WebCore::CoordinatedGraphicsLayer::updatePlatformLayer):
+        (WebCore::CoordinatedGraphicsLayer::flushCompositingStateForThisLayerOnly):
+        * platform/graphics/texmap/coordinated/CoordinatedGraphicsLayer.h:
+
+2017-01-10  Zan Dobersek  &lt;zdobersek@igalia.com&gt;
+
</ins><span class="cx">         [TexMap] Use WTF::Function in TextureMapperPlatformLayerProxy
</span><span class="cx">         https://bugs.webkit.org/show_bug.cgi?id=166853
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceWebCoreplatformgraphicstexmapcoordinatedCoordinatedGraphicsLayercpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/WebCore/platform/graphics/texmap/coordinated/CoordinatedGraphicsLayer.cpp (210814 => 210815)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WebCore/platform/graphics/texmap/coordinated/CoordinatedGraphicsLayer.cpp        2017-01-17 13:47:15 UTC (rev 210814)
+++ releases/WebKitGTK/webkit-2.14/Source/WebCore/platform/graphics/texmap/coordinated/CoordinatedGraphicsLayer.cpp        2017-01-17 13:47:22 UTC (rev 210815)
</span><span class="lines">@@ -126,6 +126,7 @@
</span><span class="cx"> #endif
</span><span class="cx"> #if USE(COORDINATED_GRAPHICS_THREADED)
</span><span class="cx">     , m_shouldSyncPlatformLayer(false)
</span><ins>+    , m_shouldUpdatePlatformLayer(false)
</ins><span class="cx"> #endif
</span><span class="cx">     , m_coordinator(0)
</span><span class="cx">     , m_compositedNativeImagePtr(0)
</span><span class="lines">@@ -383,7 +384,7 @@
</span><span class="cx">         m_pendingPlatformLayerOperation |= SyncPlatformLayer;
</span><span class="cx"> #elif USE(COORDINATED_GRAPHICS_THREADED)
</span><span class="cx">     if (m_platformLayer)
</span><del>-        m_shouldSyncPlatformLayer = true;
</del><ins>+        m_shouldUpdatePlatformLayer = true;
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">     notifyFlushRequired();
</span><span class="lines">@@ -744,13 +745,23 @@
</span><span class="cx"> 
</span><span class="cx">     m_shouldSyncPlatformLayer = false;
</span><span class="cx">     m_layerState.platformLayerChanged = true;
</span><del>-    if (m_platformLayer) {
-        m_platformLayer-&gt;swapBuffersIfNeeded();
</del><ins>+    if (m_platformLayer)
</ins><span class="cx">         m_layerState.platformLayerProxy = m_platformLayer-&gt;proxy();
</span><del>-    }
</del><span class="cx"> #endif
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void CoordinatedGraphicsLayer::updatePlatformLayer()
+{
+#if USE(COORDINATED_GRAPHICS_THREADED)
+    if (!m_shouldUpdatePlatformLayer)
+        return;
+
+    m_shouldUpdatePlatformLayer = false;
+    if (m_platformLayer)
+        m_platformLayer-&gt;swapBuffersIfNeeded();
+#endif
+}
+
</ins><span class="cx"> #if USE(GRAPHICS_SURFACE)
</span><span class="cx"> void CoordinatedGraphicsLayer::destroyPlatformLayerIfNeeded()
</span><span class="cx"> {
</span><span class="lines">@@ -801,6 +812,7 @@
</span><span class="cx">     syncChildren();
</span><span class="cx">     syncFilters();
</span><span class="cx">     syncPlatformLayer();
</span><ins>+    updatePlatformLayer();
</ins><span class="cx"> 
</span><span class="cx">     // Only unset m_movingVisibleRect after we have updated the visible rect after the animation stopped.
</span><span class="cx">     if (!hasActiveTransformAnimation)
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceWebCoreplatformgraphicstexmapcoordinatedCoordinatedGraphicsLayerh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/WebCore/platform/graphics/texmap/coordinated/CoordinatedGraphicsLayer.h (210814 => 210815)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WebCore/platform/graphics/texmap/coordinated/CoordinatedGraphicsLayer.h        2017-01-17 13:47:15 UTC (rev 210814)
+++ releases/WebKitGTK/webkit-2.14/Source/WebCore/platform/graphics/texmap/coordinated/CoordinatedGraphicsLayer.h        2017-01-17 13:47:22 UTC (rev 210815)
</span><span class="lines">@@ -165,6 +165,7 @@
</span><span class="cx">     void createPlatformLayerIfNeeded();
</span><span class="cx"> #endif
</span><span class="cx">     void syncPlatformLayer();
</span><ins>+    void updatePlatformLayer();
</ins><span class="cx"> #if USE(COORDINATED_GRAPHICS_THREADED)
</span><span class="cx">     void platformLayerWillBeDestroyed() override;
</span><span class="cx">     void setPlatformLayerNeedsDisplay() override;
</span><span class="lines">@@ -237,6 +238,7 @@
</span><span class="cx"> #endif
</span><span class="cx"> #if USE(COORDINATED_GRAPHICS_THREADED)
</span><span class="cx">     bool m_shouldSyncPlatformLayer : 1;
</span><ins>+    bool m_shouldUpdatePlatformLayer : 1;
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">     CoordinatedGraphicsLayerClient* m_coordinator;
</span></span></pre>
</div>
</div>

</body>
</html>