Hi,<div><br></div><div>I have modified previous REPEAT_NORMAL patches based on siarhei&#39;s suggestions.</div><div>You can find previous patches from here</div><div><a href="http://lists.freedesktop.org/archives/pixman/2011-May/001249.html"><font class="Apple-style-span" face="verdana, sans-serif">http://lists.freedesktop.org/archives/pixman/2011-May/001249.html</font></a></div>
<div><br></div><div>This patch set is focused on &quot;Bilinear Scaling&quot;. Handling REPEAT_NORMAL inside scanline functions can be more effective than stitching approach. And it has already done for nearest scaling by siarhei siamashka.</div>
<div><span class="Apple-style-span" style="white-space: pre-wrap; "><font class="Apple-style-span" face="verdana, sans-serif"><a href="http://cgit.freedesktop.org/~siamashka/pixman/log/?h=nearest-normal-repeat">http://cgit.freedesktop.org/~siamashka/pixman/log/?h=nearest-normal-repeat</a></font></span></div>
<div><span class="Apple-style-span" style="white-space: pre-wrap; "><br></span></div><div><span class="Apple-style-span" style="white-space: pre-wrap;"><br></span></div><div><span class="Apple-style-span" style="white-space: pre-wrap;">Major changes compared to previous patches are</span></div>
<div><span class="Apple-style-span" style="white-space: pre-wrap;"><br></span></div><div><span class="Apple-style-span" style="white-space: pre-wrap;">1. Flags to configure the macro template rather than boolean values</span></div>
<div><span class="Apple-style-span" style="white-space: pre-wrap;">2. Possible overflows are eliminated</span></div><div><span class="Apple-style-span" style="white-space: pre-wrap;">3. Extended source scanlines are reused when they do not need to be updated</span></div>
<div><span class="Apple-style-span" style="white-space: pre-wrap;"><br></span></div><div><span class="Apple-style-span" style="white-space: pre-wrap;"><br></span></div><div><span class="Apple-style-span" style="white-space: pre-wrap;">I have added following flags.</span></div>
<div><span class="Apple-style-span" style="white-space: pre-wrap;">FLAG_NONE</span></div><div><span class="Apple-style-span" style="white-space: pre-wrap;">FLAG_SCANLINE_SUPPORT_REPEAT_NORMAL</span></div><div><span class="Apple-style-span" style="white-space: pre-wrap;">FLAG_HAVE_SOLID_MASK</span></div>
<div><span class="Apple-style-span" style="white-space: pre-wrap;">FLAG_HAVE_NON_SOLID_MASK</span></div><div><span class="Apple-style-span" style="white-space: pre-wrap;"><br></span></div><div><span class="Apple-style-span" style="white-space: pre-wrap;">FLAG_SCANLINE_SUPPORT_REPEAT_NORMAL means that template parameter &#39;scanline_func&#39; can handle normal repeat inside of it. So if this flag is on, the template bypasses repeat handling. Later we can configure macro template not to use stitching by turning this flag on.</span></div>
<div><span class="Apple-style-span" style="white-space: pre-wrap;"><br></span></div><div><span class="Apple-style-span" style="white-space: pre-wrap;">But I&#39;m a bit confused that scanline function may expect positive vx and unit_x &gt; 0. Handling repeat normal using </span><span class="Apple-style-span" style="white-space: pre-wrap; ">while( vx &gt;= max_vx ) vx -= max_vx requires that assumption. This also means that such scanline functions cannot handle negative unit_x. And vx should be handled at least once outside the scanline functions (to get positive vx).</span></div>
<div><span class="Apple-style-span" style="white-space: pre-wrap; "><br></span></div><div><span class="Apple-style-span" style="white-space: pre-wrap; ">Current FAST_NEAREST_SCANLINE(Used by C fast paths) can handle only positive unit_x and currently we achieve this assumption by setting FAST_PATH_X_UNIT_POSITIVE flag. FAST_NEAREST/BILINEAR_MAINLOOP_INT does not know whether the scanline can handle negative unit_x, so the correctness is achieved by setting proper fast path flags. I&#39;m a bit worried about this. Previously I proposed FLAG_SCANLINE_SUPPORT_NEGATIVE_UNIT_X to explicitly control this and I think it is more readable. Can give me some comments about this?</span></div>
<div><span class="Apple-style-span" style="white-space: pre-wrap; "><br></span></div><div><span class="Apple-style-span" style="white-space: pre-wrap; ">Mask related flags are slightly changed to (NONE, SOLID_MASK, NON_SOLID_MASK). I prefer this kind of convention because it strictly identifies the configuration by a single flag.</span></div>
<div><span class="Apple-style-span" style="white-space: pre-wrap; "><br></span></div><div><span class="Apple-style-span" style="white-space: pre-wrap; ">Below is some performance benchmark result of sse2 and NEON fast paths.</span></div>
<div><span class="Apple-style-span" style="white-space: pre-wrap;">It seems that effect of scanline reusing is not that good than I expected (maybe there&#39;re some mistakes in my patch). I think this is because previously used scanline is supposed to be in L1 cache or REPEAT_NORMAL_MIN_WIDTH is too small. </span><span class="Apple-style-span" style="white-space: pre-wrap; ">When applying this approach to non-scaled functions, performance was even better than reference compositing because memory access was the major bottleneck.</span></div>
<div><span class="Apple-style-span" style="white-space: pre-wrap;"><br></span></div><div><span class="Apple-style-span" style="white-space: pre-wrap;">----- sse2 benchmark -----
//////////////////////////////////////////////////////////////////////////////
// op=SRC, src=a8r8g8b8, mask=None, dst=a8r8g8b8
/////////////////////////////////////////////////////////////////////////////
&lt;&lt;&lt;&lt;&lt; Reference Compositing Performance 2000x2000 to 2000x2000 &gt;&gt;&gt;&gt;&gt;
Non-scaled         : 372.30Mpix/s
Nearest-scaled     : 348.53Mpix/s
Bilinear-scaled    : 122.59Mpix/s
&lt;&lt;&lt;&lt;&lt; src = 1 x 512  dst = 512 x 512 &gt;&gt;&gt;&gt;&gt;
- Bilinear-Scaled (close to 1.x)-
Before : REPEAT_NORMAL  : 28.16Mpix/s</span></div><div><span class="Apple-style-span" style="white-space: pre-wrap;">After : REPEAT_NORMAL : 38.46Mpix/s (without source line extension)</span></div><div><span class="Apple-style-span" style="white-space: pre-wrap;">After : REPEAT_NORMAL : 74.70Mpix/s (use source line extension but not reusing)</span></div>
<div><span class="Apple-style-span" style="white-space: pre-wrap;">After : REPEAT_NORMAL : 75.88Mpix/s</span></div><div><span class="Apple-style-span" style="white-space: pre-wrap;">
&lt;&lt;&lt;&lt;&lt; src = 15 x 15  dst = 512 x 512 &gt;&gt;&gt;&gt;&gt;
- Bilinear-Scaled (close to 1.x)-
Before : REPEAT_NORMAL  : 24.56Mpix/s</span></div><div><span class="Apple-style-span" style="white-space: pre-wrap;">After : REPEAT_NORMAL : 92.69Mpix/s (without source line extension)</span></div><div><span class="Apple-style-span" style="white-space: pre-wrap;"><meta http-equiv="content-type" content="text/html; charset=utf-8">After : REPEAT_NORMAL : 89.70Mpix/s (use source line extension but not reusing)</span></div>
<div><span class="Apple-style-span" style="white-space: pre-wrap;">After : REPEAT_NORMAL : 89.33Mpix/s</span></div><div><span class="Apple-style-span" style="white-space: pre-wrap;">
&lt;&lt;&lt;&lt;&lt; src = 63 x 63  dst = 512 x 512 &gt;&gt;&gt;&gt;&gt;
- Bilinear-Scaled (close to 1.x)-
Before : REPEAT_NORMAL  : 24.78Mpix/s</span></div><div><span class="Apple-style-span" style="white-space: pre-wrap;">After : REPEAT_NORMAL : 114.72Mpix/s (without source line extension)</span></div><div><span class="Apple-style-span" style="white-space: pre-wrap;"><meta http-equiv="content-type" content="text/html; charset=utf-8">After : REPEAT_NORMAL : 114.53Mpix/s (use source line extension but not reusing)</span></div>
<div><span class="Apple-style-span" style="white-space: pre-wrap;">After : REPEAT_NORMAL : 114.25Mpix/s
</span></div><div><span class="Apple-style-span" style="white-space: pre-wrap;"><br></span></div><div><span class="Apple-style-span" style="white-space: pre-wrap;">----- ARM NEON benchmark -----</span></div><div><span class="Apple-style-span" style="white-space: pre-wrap;">//////////////////////////////////////////////////////////////////////////////
// op=SRC, src=a8r8g8b8, mask=None, dst=a8r8g8b8
/////////////////////////////////////////////////////////////////////////////
&lt;&lt;&lt;&lt;&lt; Reference Compositing Performance 2000x2000 to 2000x2000 &gt;&gt;&gt;&gt;&gt;
Non-scaled         : 158.33Mpix/s
Nearest-scaled     : 144.23Mpix/s
Bilinear-scaled    : 99.89Mpix/s
&lt;&lt;&lt;&lt;&lt; src = 1 x 512  dst = 512 x 512 &gt;&gt;&gt;&gt;&gt;
- Bilinear-Scaled (close to 1.x)-
Before : REPEAT_NORMAL  : 5.64Mpix/s</span></div><div><span class="Apple-style-span" style="white-space: pre-wrap;">After : REPEAT_NORMAL : 11.25Mpix/s (without source line extension)</span></div><div><span class="Apple-style-span" style="white-space: pre-wrap;"><meta http-equiv="content-type" content="text/html; charset=utf-8">After : REPEAT_NORMAL : 37.08Mpix/s (use source line extension but not reusing)</span></div>
<div><span class="Apple-style-span" style="white-space: pre-wrap;">After : REPEAT_NORMAL : 36.73Mpix/s

&lt;&lt;&lt;&lt;&lt; src = 15 x 15  dst = 512 x 512 &gt;&gt;&gt;&gt;&gt;
- Bilinear-Scaled (close to 1.x)-
Before : REPEAT_NORMAL  : 3.78Mpix/s</span></div><div><span class="Apple-style-span" style="white-space: pre-wrap;"><meta http-equiv="content-type" content="text/html; charset=utf-8">After : REPEAT_NORMAL : 50.38Mpix/s (without source line extension)</span></div>
<div><span class="Apple-style-span" style="white-space: pre-wrap;"><meta http-equiv="content-type" content="text/html; charset=utf-8">After : REPEAT_NORMAL : 51.36Mpix/s (use source line extension but not reusing)
<meta http-equiv="content-type" content="text/html; charset=utf-8">After : REPEAT_NORMAL : 50.96Mpix/s</span></div><div><span class="Apple-style-span" style="white-space: pre-wrap;">
&lt;&lt;&lt;&lt;&lt; src = 63 x 63  dst = 512 x 512 &gt;&gt;&gt;&gt;&gt;
- Bilinear-Scaled (close to 1.x)-
Before : REPEAT_NORMAL  : 4.13Mpix/s
</span></div><div><span class="Apple-style-span" style="white-space: pre-wrap;"><meta http-equiv="content-type" content="text/html; charset=utf-8">After : REPEAT_NORMAL : 82.80Mpix/s (without source line extension)</span></div>
<div><span class="Apple-style-span" style="white-space: pre-wrap;"><meta http-equiv="content-type" content="text/html; charset=utf-8">After : REPEAT_NORMAL : 83.65Mpix/s (use source line extension but not reusing)</span></div>
<div><span class="Apple-style-span" style="white-space: pre-wrap;"><meta http-equiv="content-type" content="text/html; charset=utf-8">After : REPEAT_NORMAL : 83.61Mpix/s</span></div><div><span class="Apple-style-span" style="white-space: pre-wrap;"><br>
</span></div><div>-- <br>Best Regards,<div>Taekyun Kim</div><br>
</div>