<!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>[210954] 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/210954">210954</a></dd>
<dt>Author</dt> <dd>carlosgc@webkit.org</dd>
<dt>Date</dt> <dd>2017-01-19 22:55:46 -0800 (Thu, 19 Jan 2017)</dd>
</dl>

<h3>Log Message</h3>
<pre>[Threaded Compositor] Initialize the threaded compositor with the current size
https://bugs.webkit.org/show_bug.cgi?id=167196

Reviewed by Žan Doberšek.

We are always creating the threaded compositor with an empty size and then a sizeDidChange always happen when
the backing store state changes. This is always happening because the threaded compositor is created before the
first backing store state, but if we wanted to create it later, for example to enter/leave AC mode on demand,
the threaded compositor will not have the viewport size unless the window is resized, or sizeDidChange is called
manually when entering AC mode. Creating the threaded compositor is sync and changing the size too, so it's
better to do both things at the same time using the same sync operation.

* Shared/CoordinatedGraphics/SimpleViewportController.cpp:
(WebKit::SimpleViewportController::SimpleViewportController): Pass an initial size to the constructor.
* Shared/CoordinatedGraphics/SimpleViewportController.h:
* Shared/CoordinatedGraphics/threadedcompositor/ThreadedCompositor.cpp:
(WebKit::ThreadedCompositor::create): Add viewportSize and scaleFactor construction parameters,
(WebKit::ThreadedCompositor::ThreadedCompositor): Ditto. Also mark as needs resize if the given size is not empty.
* Shared/CoordinatedGraphics/threadedcompositor/ThreadedCompositor.h:
* WebProcess/WebPage/CoordinatedGraphics/ThreadedCoordinatedLayerTreeHost.cpp:
(WebKit::ThreadedCoordinatedLayerTreeHost::ThreadedCoordinatedLayerTreeHost): Initialize the threaded compositor
with an initial viewport size and scale factor.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2SharedCoordinatedGraphicsSimpleViewportControllercpp">trunk/Source/WebKit2/Shared/CoordinatedGraphics/SimpleViewportController.cpp</a></li>
<li><a href="#trunkSourceWebKit2SharedCoordinatedGraphicsSimpleViewportControllerh">trunk/Source/WebKit2/Shared/CoordinatedGraphics/SimpleViewportController.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="#trunkSourceWebKit2WebProcessWebPageCoordinatedGraphicsThreadedCoordinatedLayerTreeHostcpp">trunk/Source/WebKit2/WebProcess/WebPage/CoordinatedGraphics/ThreadedCoordinatedLayerTreeHost.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (210953 => 210954)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2017-01-20 06:42:43 UTC (rev 210953)
+++ trunk/Source/WebKit2/ChangeLog        2017-01-20 06:55:46 UTC (rev 210954)
</span><span class="lines">@@ -1,3 +1,28 @@
</span><ins>+2017-01-19  Carlos Garcia Campos  &lt;cgarcia@igalia.com&gt;
+
+        [Threaded Compositor] Initialize the threaded compositor with the current size
+        https://bugs.webkit.org/show_bug.cgi?id=167196
+
+        Reviewed by Žan Doberšek.
+
+        We are always creating the threaded compositor with an empty size and then a sizeDidChange always happen when
+        the backing store state changes. This is always happening because the threaded compositor is created before the
+        first backing store state, but if we wanted to create it later, for example to enter/leave AC mode on demand,
+        the threaded compositor will not have the viewport size unless the window is resized, or sizeDidChange is called
+        manually when entering AC mode. Creating the threaded compositor is sync and changing the size too, so it's
+        better to do both things at the same time using the same sync operation.
+
+        * Shared/CoordinatedGraphics/SimpleViewportController.cpp:
+        (WebKit::SimpleViewportController::SimpleViewportController): Pass an initial size to the constructor.
+        * Shared/CoordinatedGraphics/SimpleViewportController.h:
+        * Shared/CoordinatedGraphics/threadedcompositor/ThreadedCompositor.cpp:
+        (WebKit::ThreadedCompositor::create): Add viewportSize and scaleFactor construction parameters,
+        (WebKit::ThreadedCompositor::ThreadedCompositor): Ditto. Also mark as needs resize if the given size is not empty.
+        * Shared/CoordinatedGraphics/threadedcompositor/ThreadedCompositor.h:
+        * WebProcess/WebPage/CoordinatedGraphics/ThreadedCoordinatedLayerTreeHost.cpp:
+        (WebKit::ThreadedCoordinatedLayerTreeHost::ThreadedCoordinatedLayerTreeHost): Initialize the threaded compositor
+        with an initial viewport size and scale factor.
+
</ins><span class="cx"> 2017-01-19  Chris Dumez  &lt;cdumez@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         iterable&lt;&gt; should be enabled on WK1
</span></span></pre></div>
<a id="trunkSourceWebKit2SharedCoordinatedGraphicsSimpleViewportControllercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/Shared/CoordinatedGraphics/SimpleViewportController.cpp (210953 => 210954)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Shared/CoordinatedGraphics/SimpleViewportController.cpp        2017-01-20 06:42:43 UTC (rev 210953)
+++ trunk/Source/WebKit2/Shared/CoordinatedGraphics/SimpleViewportController.cpp        2017-01-20 06:55:46 UTC (rev 210954)
</span><span class="lines">@@ -28,7 +28,8 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebKit {
</span><span class="cx"> 
</span><del>-SimpleViewportController::SimpleViewportController()
</del><ins>+SimpleViewportController::SimpleViewportController(const IntSize&amp; size)
+    : m_viewportSize(size)
</ins><span class="cx"> {
</span><span class="cx">     resetViewportToDefaultState();
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebKit2SharedCoordinatedGraphicsSimpleViewportControllerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/Shared/CoordinatedGraphics/SimpleViewportController.h (210953 => 210954)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Shared/CoordinatedGraphics/SimpleViewportController.h        2017-01-20 06:42:43 UTC (rev 210953)
+++ trunk/Source/WebKit2/Shared/CoordinatedGraphics/SimpleViewportController.h        2017-01-20 06:55:46 UTC (rev 210954)
</span><span class="lines">@@ -37,7 +37,7 @@
</span><span class="cx"> class SimpleViewportController {
</span><span class="cx">     WTF_MAKE_NONCOPYABLE(SimpleViewportController);
</span><span class="cx"> public:
</span><del>-    SimpleViewportController();
</del><ins>+    SimpleViewportController(const WebCore::IntSize&amp;);
</ins><span class="cx"> 
</span><span class="cx">     void didChangeViewportSize(const WebCore::IntSize&amp;);
</span><span class="cx">     void didChangeContentsSize(const WebCore::IntSize&amp;);
</span></span></pre></div>
<a id="trunkSourceWebKit2SharedCoordinatedGraphicsthreadedcompositorThreadedCompositorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/Shared/CoordinatedGraphics/threadedcompositor/ThreadedCompositor.cpp (210953 => 210954)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Shared/CoordinatedGraphics/threadedcompositor/ThreadedCompositor.cpp        2017-01-20 06:42:43 UTC (rev 210953)
+++ trunk/Source/WebKit2/Shared/CoordinatedGraphics/threadedcompositor/ThreadedCompositor.cpp        2017-01-20 06:55:46 UTC (rev 210954)
</span><span class="lines">@@ -42,16 +42,19 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebKit {
</span><span class="cx"> 
</span><del>-Ref&lt;ThreadedCompositor&gt; ThreadedCompositor::create(Client&amp; client, uint64_t nativeSurfaceHandle, ShouldDoFrameSync doFrameSync, TextureMapper::PaintFlags paintFlags)
</del><ins>+Ref&lt;ThreadedCompositor&gt; ThreadedCompositor::create(Client&amp; client, const IntSize&amp; viewportSize, float scaleFactor, uint64_t nativeSurfaceHandle, ShouldDoFrameSync doFrameSync, TextureMapper::PaintFlags paintFlags)
</ins><span class="cx"> {
</span><del>-    return adoptRef(*new ThreadedCompositor(client, nativeSurfaceHandle, doFrameSync, paintFlags));
</del><ins>+    return adoptRef(*new ThreadedCompositor(client, viewportSize, scaleFactor, nativeSurfaceHandle, doFrameSync, paintFlags));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-ThreadedCompositor::ThreadedCompositor(Client&amp; client, uint64_t nativeSurfaceHandle, ShouldDoFrameSync doFrameSync, TextureMapper::PaintFlags paintFlags)
</del><ins>+ThreadedCompositor::ThreadedCompositor(Client&amp; client, const IntSize&amp; viewportSize, float scaleFactor, uint64_t nativeSurfaceHandle, ShouldDoFrameSync doFrameSync, TextureMapper::PaintFlags paintFlags)
</ins><span class="cx">     : m_client(client)
</span><ins>+    , m_viewportSize(viewportSize)
+    , m_scaleFactor(scaleFactor)
</ins><span class="cx">     , m_nativeSurfaceHandle(nativeSurfaceHandle)
</span><span class="cx">     , m_doFrameSync(doFrameSync)
</span><span class="cx">     , m_paintFlags(paintFlags)
</span><ins>+    , m_needsResize(!viewportSize.isEmpty())
</ins><span class="cx">     , m_compositingRunLoop(std::make_unique&lt;CompositingRunLoop&gt;([this] { renderLayerTree(); }))
</span><span class="cx"> {
</span><span class="cx">     m_compositingRunLoop-&gt;performTaskSync([this, protectedThis = makeRef(*this)] {
</span></span></pre></div>
<a id="trunkSourceWebKit2SharedCoordinatedGraphicsthreadedcompositorThreadedCompositorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/Shared/CoordinatedGraphics/threadedcompositor/ThreadedCompositor.h (210953 => 210954)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Shared/CoordinatedGraphics/threadedcompositor/ThreadedCompositor.h        2017-01-20 06:42:43 UTC (rev 210953)
+++ trunk/Source/WebKit2/Shared/CoordinatedGraphics/threadedcompositor/ThreadedCompositor.h        2017-01-20 06:55:46 UTC (rev 210954)
</span><span class="lines">@@ -58,7 +58,7 @@
</span><span class="cx"> 
</span><span class="cx">     enum class ShouldDoFrameSync { No, Yes };
</span><span class="cx"> 
</span><del>-    static Ref&lt;ThreadedCompositor&gt; create(Client&amp;, uint64_t nativeSurfaceHandle = 0, ShouldDoFrameSync = ShouldDoFrameSync::Yes, WebCore::TextureMapper::PaintFlags = 0);
</del><ins>+    static Ref&lt;ThreadedCompositor&gt; create(Client&amp;, const WebCore::IntSize&amp;, float scaleFactor, uint64_t nativeSurfaceHandle = 0, ShouldDoFrameSync = ShouldDoFrameSync::Yes, WebCore::TextureMapper::PaintFlags = 0);
</ins><span class="cx">     virtual ~ThreadedCompositor();
</span><span class="cx"> 
</span><span class="cx">     void setNativeSurfaceHandleForCompositing(uint64_t);
</span><span class="lines">@@ -74,7 +74,7 @@
</span><span class="cx">     void forceRepaint();
</span><span class="cx"> 
</span><span class="cx"> private:
</span><del>-    ThreadedCompositor(Client&amp;, uint64_t nativeSurfaceHandle, ShouldDoFrameSync, WebCore::TextureMapper::PaintFlags);
</del><ins>+    ThreadedCompositor(Client&amp;, const WebCore::IntSize&amp;, float scaleFactor, uint64_t nativeSurfaceHandle, ShouldDoFrameSync, WebCore::TextureMapper::PaintFlags);
</ins><span class="cx"> 
</span><span class="cx">     // CoordinatedGraphicsSceneClient
</span><span class="cx">     void renderNextFrame() override;
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageCoordinatedGraphicsThreadedCoordinatedLayerTreeHostcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/CoordinatedGraphics/ThreadedCoordinatedLayerTreeHost.cpp (210953 => 210954)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/CoordinatedGraphics/ThreadedCoordinatedLayerTreeHost.cpp        2017-01-20 06:42:43 UTC (rev 210953)
+++ trunk/Source/WebKit2/WebProcess/WebPage/CoordinatedGraphics/ThreadedCoordinatedLayerTreeHost.cpp        2017-01-20 06:55:46 UTC (rev 210954)
</span><span class="lines">@@ -53,7 +53,12 @@
</span><span class="cx">     : CoordinatedLayerTreeHost(webPage)
</span><span class="cx">     , m_compositorClient(*this)
</span><span class="cx">     , m_surface(AcceleratedSurface::create(webPage))
</span><ins>+    , m_viewportController(webPage.size())
</ins><span class="cx"> {
</span><ins>+    IntSize scaledSize(m_webPage.size());
+    scaledSize.scale(m_webPage.deviceScaleFactor());
+    float scaleFactor = m_webPage.deviceScaleFactor() * m_viewportController.pageScaleFactor();
+
</ins><span class="cx">     if (m_surface) {
</span><span class="cx">         TextureMapper::PaintFlags paintFlags = 0;
</span><span class="cx"> 
</span><span class="lines">@@ -63,10 +68,12 @@
</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, m_surface-&gt;window(), ThreadedCompositor::ShouldDoFrameSync::No, paintFlags);
</del><ins>+        m_compositor = ThreadedCompositor::create(m_compositorClient, scaledSize, scaleFactor, m_surface-&gt;window(), ThreadedCompositor::ShouldDoFrameSync::No, paintFlags);
</ins><span class="cx">         m_layerTreeContext.contextID = m_surface-&gt;surfaceID();
</span><span class="cx">     } else
</span><del>-        m_compositor = ThreadedCompositor::create(m_compositorClient);
</del><ins>+        m_compositor = ThreadedCompositor::create(m_compositorClient, scaledSize, scaleFactor);
+
+    didChangeViewport();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void ThreadedCoordinatedLayerTreeHost::invalidate()
</span></span></pre>
</div>
</div>

</body>
</html>