<!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>[206294] trunk/Source/WebKit2</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/206294">206294</a></dd>
<dt>Author</dt> <dd>carlosgc@webkit.org</dd>
<dt>Date</dt> <dd>2016-09-23 01:02:59 -0700 (Fri, 23 Sep 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>[GTK] Improve performance when resizing a window with multiple web views in X11
https://bugs.webkit.org/show_bug.cgi?id=162413

Reviewed by Michael Catanzaro.

Resizing a window with a single way view performs good enough, but when adding more tabs, the performance
decreases a lot. This is because resize is a sync operation, and the UI process waits for the web process to
have a new update for the new size, while still draws the previous frame. This is needed for the visible web
view, to avoid flickering and artifacts while resizing, but for all other hidden web views, we don't really need
to block the UI process. This doesn't happen in Wayland, because in Wayland we never block the UI process while
waiting for web process update after a resize.

* UIProcess/AcceleratedDrawingAreaProxy.cpp:
(WebKit::AcceleratedDrawingAreaProxy::waitForAndDispatchDidUpdateBackingStoreState): Return early if the web
view is not visible.
* UIProcess/gtk/AcceleratedBackingStoreX11.cpp:
(WebKit::AcceleratedBackingStoreX11::update): Only schedule a redraw on a damage event when the view is visible.
* WebProcess/WebPage/gtk/AcceleratedSurfaceX11.cpp:
(WebKit::AcceleratedSurfaceX11::AcceleratedSurfaceX11): Do a XSync right after creating the new pixmap.
(WebKit::AcceleratedSurfaceX11::resize): Ditto.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAcceleratedDrawingAreaProxycpp">trunk/Source/WebKit2/UIProcess/AcceleratedDrawingAreaProxy.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessgtkAcceleratedBackingStoreX11cpp">trunk/Source/WebKit2/UIProcess/gtk/AcceleratedBackingStoreX11.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPagegtkAcceleratedSurfaceX11cpp">trunk/Source/WebKit2/WebProcess/WebPage/gtk/AcceleratedSurfaceX11.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (206293 => 206294)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2016-09-23 05:31:15 UTC (rev 206293)
+++ trunk/Source/WebKit2/ChangeLog        2016-09-23 08:02:59 UTC (rev 206294)
</span><span class="lines">@@ -1,3 +1,26 @@
</span><ins>+2016-09-23  Carlos Garcia Campos  &lt;cgarcia@igalia.com&gt;
+
+        [GTK] Improve performance when resizing a window with multiple web views in X11
+        https://bugs.webkit.org/show_bug.cgi?id=162413
+
+        Reviewed by Michael Catanzaro.
+
+        Resizing a window with a single way view performs good enough, but when adding more tabs, the performance
+        decreases a lot. This is because resize is a sync operation, and the UI process waits for the web process to
+        have a new update for the new size, while still draws the previous frame. This is needed for the visible web
+        view, to avoid flickering and artifacts while resizing, but for all other hidden web views, we don't really need
+        to block the UI process. This doesn't happen in Wayland, because in Wayland we never block the UI process while
+        waiting for web process update after a resize.
+
+        * UIProcess/AcceleratedDrawingAreaProxy.cpp:
+        (WebKit::AcceleratedDrawingAreaProxy::waitForAndDispatchDidUpdateBackingStoreState): Return early if the web
+        view is not visible.
+        * UIProcess/gtk/AcceleratedBackingStoreX11.cpp:
+        (WebKit::AcceleratedBackingStoreX11::update): Only schedule a redraw on a damage event when the view is visible.
+        * WebProcess/WebPage/gtk/AcceleratedSurfaceX11.cpp:
+        (WebKit::AcceleratedSurfaceX11::AcceleratedSurfaceX11): Do a XSync right after creating the new pixmap.
+        (WebKit::AcceleratedSurfaceX11::resize): Ditto.
+
</ins><span class="cx"> 2016-09-22  Daniel Bates  &lt;dabates@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Remove more ENABLE(TEXT_AUTOSIZING) code
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAcceleratedDrawingAreaProxycpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/AcceleratedDrawingAreaProxy.cpp (206293 => 206294)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/AcceleratedDrawingAreaProxy.cpp        2016-09-23 05:31:15 UTC (rev 206293)
+++ trunk/Source/WebKit2/UIProcess/AcceleratedDrawingAreaProxy.cpp        2016-09-23 08:02:59 UTC (rev 206294)
</span><span class="lines">@@ -220,6 +220,8 @@
</span><span class="cx">         return;
</span><span class="cx">     if (m_webPageProxy.process().state() == WebProcessProxy::State::Launching)
</span><span class="cx">         return;
</span><ins>+    if (!m_webPageProxy.isViewVisible())
+        return;
</ins><span class="cx"> 
</span><span class="cx"> #if PLATFORM(WAYLAND)
</span><span class="cx">     // Never block the UI process in Wayland when waiting for DidUpdateBackingStoreState after a resize,
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessgtkAcceleratedBackingStoreX11cpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/gtk/AcceleratedBackingStoreX11.cpp (206293 => 206294)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/gtk/AcceleratedBackingStoreX11.cpp        2016-09-23 05:31:15 UTC (rev 206293)
+++ trunk/Source/WebKit2/UIProcess/gtk/AcceleratedBackingStoreX11.cpp        2016-09-23 08:02:59 UTC (rev 206294)
</span><span class="lines">@@ -155,7 +155,8 @@
</span><span class="cx">     cairoSurfaceSetDeviceScale(m_surface.get(), deviceScaleFactor, deviceScaleFactor);
</span><span class="cx">     m_damage = XDamageCreate(display, pixmap, XDamageReportNonEmpty);
</span><span class="cx">     XDamageNotifier::singleton().add(m_damage.get(), [this] {
</span><del>-        gtk_widget_queue_draw(m_webPage.viewWidget());
</del><ins>+        if (m_webPage.isViewVisible())
+            gtk_widget_queue_draw(m_webPage.viewWidget());
</ins><span class="cx">     });
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPagegtkAcceleratedSurfaceX11cpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/gtk/AcceleratedSurfaceX11.cpp (206293 => 206294)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/gtk/AcceleratedSurfaceX11.cpp        2016-09-23 05:31:15 UTC (rev 206293)
+++ trunk/Source/WebKit2/WebProcess/WebPage/gtk/AcceleratedSurfaceX11.cpp        2016-09-23 08:02:59 UTC (rev 206294)
</span><span class="lines">@@ -104,6 +104,7 @@
</span><span class="cx">     XSelectInput(m_display, m_window.get(), NoEventMask);
</span><span class="cx">     XCompositeRedirectWindow(m_display, m_window.get(), CompositeRedirectManual);
</span><span class="cx">     m_pixmap = XCompositeNameWindowPixmap(m_display, m_window.get());
</span><ins>+    XSync(m_display, False);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> AcceleratedSurfaceX11::~AcceleratedSurfaceX11()
</span><span class="lines">@@ -129,6 +130,7 @@
</span><span class="cx">     // Release the previous pixmap later to give some time to the UI process to update.
</span><span class="cx">     RunLoop::main().dispatchAfter(std::chrono::seconds(5), [pixmap = WTFMove(m_pixmap)] { });
</span><span class="cx">     m_pixmap = XCompositeNameWindowPixmap(m_display, m_window.get());
</span><ins>+    XSync(m_display, False);
</ins><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>