<!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>[189710] releases/WebKitGTK/webkit-2.10</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/189710">189710</a></dd>
<dt>Author</dt> <dd>carlosgc@webkit.org</dd>
<dt>Date</dt> <dd>2015-09-14 04:11:43 -0700 (Mon, 14 Sep 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>Merge <a href="http://trac.webkit.org/projects/webkit/changeset/188987">r188987</a> - Use WorkQueue::concurrentApply in FEConvolveMatrix
https://bugs.webkit.org/show_bug.cgi?id=148490

Reviewed by Tim Horton.

Using WorkQueue::concurrentApply lets us simplify the code a lot, and measurements show
no difference in performance. The striding has been slightly tweaked to make more sense
(we no longer divide up the remainder across some of the iterations, instead we just process
it separately last).

* platform/graphics/filters/FEConvolveMatrix.cpp:
(WebCore::FEConvolveMatrix::platformApplySoftware):
(WebCore::FEConvolveMatrix::setInteriorPixelsWorker): Deleted.
* platform/graphics/filters/FEConvolveMatrix.h:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#releasesWebKitGTKwebkit210LayoutTestsChangeLog">releases/WebKitGTK/webkit-2.10/LayoutTests/ChangeLog</a></li>
<li><a href="#releasesWebKitGTKwebkit210SourceWebCoreChangeLog">releases/WebKitGTK/webkit-2.10/Source/WebCore/ChangeLog</a></li>
<li><a href="#releasesWebKitGTKwebkit210SourceWebCoreplatformgraphicsfiltersFEConvolveMatrixcpp">releases/WebKitGTK/webkit-2.10/Source/WebCore/platform/graphics/filters/FEConvolveMatrix.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit210SourceWebCoreplatformgraphicsfiltersFEConvolveMatrixh">releases/WebKitGTK/webkit-2.10/Source/WebCore/platform/graphics/filters/FEConvolveMatrix.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="releasesWebKitGTKwebkit210LayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.10/LayoutTests/ChangeLog (189709 => 189710)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.10/LayoutTests/ChangeLog        2015-09-14 11:01:30 UTC (rev 189709)
+++ releases/WebKitGTK/webkit-2.10/LayoutTests/ChangeLog        2015-09-14 11:11:43 UTC (rev 189710)
</span><span class="lines">@@ -1,3 +1,13 @@
</span><ins>+2015-08-27  Anders Carlsson  &lt;andersca@apple.com&gt;
+
+        REGRESSION (r188987): imported/mozilla/svg/filters/feConvolveMatrix-1.svg fails
+        https://bugs.webkit.org/show_bug.cgi?id=148497
+        &lt;rdar://problem/22459541&gt;
+
+        Reviewed by Andy Estes.
+
+        * TestExpectations:
+
</ins><span class="cx"> 2015-08-31  Antti Koivisto  &lt;antti@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         REGRESSION (r188820): fast/dom/HTMLObjectElement/object-as-frame.html is flaky
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit210SourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.10/Source/WebCore/ChangeLog (189709 => 189710)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.10/Source/WebCore/ChangeLog        2015-09-14 11:01:30 UTC (rev 189709)
+++ releases/WebKitGTK/webkit-2.10/Source/WebCore/ChangeLog        2015-09-14 11:11:43 UTC (rev 189710)
</span><span class="lines">@@ -1,3 +1,42 @@
</span><ins>+2015-08-27  Anders Carlsson  &lt;andersca@apple.com&gt;
+
+        REGRESSION (r188987): imported/mozilla/svg/filters/feConvolveMatrix-1.svg fails
+        https://bugs.webkit.org/show_bug.cgi?id=148497
+        &lt;rdar://problem/22459541&gt;
+
+        Reviewed by Andy Estes.
+
+        Don't return early if iterations is 0.
+
+        * platform/graphics/filters/FEConvolveMatrix.cpp:
+        (WebCore::FEConvolveMatrix::platformApplySoftware):
+
+2015-08-26  Anders Carlsson  &lt;andersca@apple.com&gt;
+
+        Fix failing tests.
+
+        Add fallback code for the case when iterations is 0.
+
+        * platform/graphics/filters/FEConvolveMatrix.cpp:
+        (WebCore::FEConvolveMatrix::platformApplySoftware):
+
+2015-08-26  Anders Carlsson  &lt;andersca@apple.com&gt;
+
+        Use WorkQueue::concurrentApply in FEConvolveMatrix
+        https://bugs.webkit.org/show_bug.cgi?id=148490
+
+        Reviewed by Tim Horton.
+
+        Using WorkQueue::concurrentApply lets us simplify the code a lot, and measurements show
+        no difference in performance. The striding has been slightly tweaked to make more sense
+        (we no longer divide up the remainder across some of the iterations, instead we just process 
+        it separately last).
+
+        * platform/graphics/filters/FEConvolveMatrix.cpp:
+        (WebCore::FEConvolveMatrix::platformApplySoftware):
+        (WebCore::FEConvolveMatrix::setInteriorPixelsWorker): Deleted.
+        * platform/graphics/filters/FEConvolveMatrix.h:
+
</ins><span class="cx"> 2015-08-26  Jinyoung Hur  &lt;hur.ims@navercorp.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [Cairo] Accelerated canvas should fall back to non-accelerated canvas on creation failure
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit210SourceWebCoreplatformgraphicsfiltersFEConvolveMatrixcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.10/Source/WebCore/platform/graphics/filters/FEConvolveMatrix.cpp (189709 => 189710)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.10/Source/WebCore/platform/graphics/filters/FEConvolveMatrix.cpp        2015-09-14 11:01:30 UTC (rev 189709)
+++ releases/WebKitGTK/webkit-2.10/Source/WebCore/platform/graphics/filters/FEConvolveMatrix.cpp        2015-09-14 11:11:43 UTC (rev 189710)
</span><span class="lines">@@ -29,6 +29,7 @@
</span><span class="cx"> 
</span><span class="cx"> #include &lt;runtime/Uint8ClampedArray.h&gt;
</span><span class="cx"> #include &lt;wtf/ParallelJobs.h&gt;
</span><ins>+#include &lt;wtf/WorkQueue.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><span class="lines">@@ -408,11 +409,6 @@
</span><span class="cx">         fastSetOuterPixels&lt;false&gt;(paintingData, x1, y1, x2, y2);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void FEConvolveMatrix::setInteriorPixelsWorker(InteriorPixelParameters* param)
-{
-    param-&gt;filter-&gt;setInteriorPixels(*param-&gt;paintingData, param-&gt;clipRight, param-&gt;clipBottom, param-&gt;yStart, param-&gt;yEnd);
-}
-
</del><span class="cx"> void FEConvolveMatrix::platformApplySoftware()
</span><span class="cx"> {
</span><span class="cx">     FilterEffect* in = inputEffect(0);
</span><span class="lines">@@ -445,50 +441,35 @@
</span><span class="cx">     int clipRight = paintSize.width() - m_kernelSize.width();
</span><span class="cx">     int clipBottom = paintSize.height() - m_kernelSize.height();
</span><span class="cx"> 
</span><del>-    if (clipRight &gt;= 0 &amp;&amp; clipBottom &gt;= 0) {
</del><ins>+    if (clipRight &lt; 0 || clipBottom &lt; 0) {
+        // Rare situation, not optimizied for speed
+        setOuterPixels(paintingData, 0, 0, paintSize.width(), paintSize.height());
+        return;
+    }
</ins><span class="cx"> 
</span><del>-        int optimalThreadNumber = (absolutePaintRect().width() * absolutePaintRect().height()) / s_minimalRectDimension;
-        if (optimalThreadNumber &gt; 1) {
-            WTF::ParallelJobs&lt;InteriorPixelParameters&gt; parallelJobs(&amp;WebCore::FEConvolveMatrix::setInteriorPixelsWorker, optimalThreadNumber);
-            const int numOfThreads = parallelJobs.numberOfJobs();
</del><ins>+    if (int iterations = (absolutePaintRect().width() * absolutePaintRect().height()) / s_minimalRectDimension) {
+        int stride = clipBottom / iterations;
+        int chunkCount = (clipBottom + stride - 1) / stride;
</ins><span class="cx"> 
</span><del>-            // Split the job into &quot;heightPerThread&quot; jobs but there a few jobs that need to be slightly larger since
-            // heightPerThread * jobs &lt; total size. These extras are handled by the remainder &quot;jobsWithExtra&quot;.
-            const int heightPerThread = clipBottom / numOfThreads;
-            const int jobsWithExtra = clipBottom % numOfThreads;
</del><ins>+        WorkQueue::concurrentApply(chunkCount, [&amp;](size_t index) {
+            int yStart = (stride * index);
+            int yEnd = std::min&lt;int&gt;(stride * (index + 1), clipBottom);
</ins><span class="cx"> 
</span><del>-            int startY = 0;
-            for (int job = 0; job &lt; numOfThreads; ++job) {
-                InteriorPixelParameters&amp; param = parallelJobs.parameter(job);
-                param.filter = this;
-                param.paintingData = &amp;paintingData;
-                param.clipRight = clipRight;
-                param.clipBottom = clipBottom;
-                param.yStart = startY;
-                startY += job &lt; jobsWithExtra ? heightPerThread + 1 : heightPerThread;
-                param.yEnd = startY;
-            }
</del><ins>+            setInteriorPixels(paintingData, clipRight, clipBottom, yStart, yEnd);
+        });
+    } else
+        setInteriorPixels(paintingData, clipRight, clipBottom, 0, clipBottom);
</ins><span class="cx"> 
</span><del>-            parallelJobs.execute();
-        } else {
-            // Fallback to single threaded mode.
-            setInteriorPixels(paintingData, clipRight, clipBottom, 0, clipBottom);
-        }
-
-        clipRight += m_targetOffset.x() + 1;
-        clipBottom += m_targetOffset.y() + 1;
-        if (m_targetOffset.y() &gt; 0)
-            setOuterPixels(paintingData, 0, 0, paintSize.width(), m_targetOffset.y());
-        if (clipBottom &lt; paintSize.height())
-            setOuterPixels(paintingData, 0, clipBottom, paintSize.width(), paintSize.height());
-        if (m_targetOffset.x() &gt; 0)
-            setOuterPixels(paintingData, 0, m_targetOffset.y(), m_targetOffset.x(), clipBottom);
-        if (clipRight &lt; paintSize.width())
-            setOuterPixels(paintingData, clipRight, m_targetOffset.y(), paintSize.width(), clipBottom);
-    } else {
-        // Rare situation, not optimizied for speed
-        setOuterPixels(paintingData, 0, 0, paintSize.width(), paintSize.height());
-    }
</del><ins>+    clipRight += m_targetOffset.x() + 1;
+    clipBottom += m_targetOffset.y() + 1;
+    if (m_targetOffset.y() &gt; 0)
+        setOuterPixels(paintingData, 0, 0, paintSize.width(), m_targetOffset.y());
+    if (clipBottom &lt; paintSize.height())
+        setOuterPixels(paintingData, 0, clipBottom, paintSize.width(), paintSize.height());
+    if (m_targetOffset.x() &gt; 0)
+        setOuterPixels(paintingData, 0, m_targetOffset.y(), m_targetOffset.x(), clipBottom);
+    if (clipRight &lt; paintSize.width())
+        setOuterPixels(paintingData, clipRight, m_targetOffset.y(), paintSize.width(), clipBottom);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void FEConvolveMatrix::dump()
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit210SourceWebCoreplatformgraphicsfiltersFEConvolveMatrixh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.10/Source/WebCore/platform/graphics/filters/FEConvolveMatrix.h (189709 => 189710)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.10/Source/WebCore/platform/graphics/filters/FEConvolveMatrix.h        2015-09-14 11:01:30 UTC (rev 189709)
+++ releases/WebKitGTK/webkit-2.10/Source/WebCore/platform/graphics/filters/FEConvolveMatrix.h        2015-09-14 11:11:43 UTC (rev 189710)
</span><span class="lines">@@ -103,20 +103,6 @@
</span><span class="cx">     // Parallelization parts
</span><span class="cx">     static const int s_minimalRectDimension = (100 * 100); // Empirical data limit for parallel jobs
</span><span class="cx"> 
</span><del>-    template&lt;typename Type&gt;
-    friend class ParallelJobs;
-
-    struct InteriorPixelParameters {
-        FEConvolveMatrix* filter;
-        PaintingData* paintingData;
-        int clipBottom;
-        int clipRight;
-        int yStart;
-        int yEnd;
-    };
-
-    static void setInteriorPixelsWorker(InteriorPixelParameters*);
-
</del><span class="cx">     IntSize m_kernelSize;
</span><span class="cx">     float m_divisor;
</span><span class="cx">     float m_bias;
</span></span></pre>
</div>
</div>

</body>
</html>