[cairo] Slow down when running newer Cairo on ARM with NEON

Bill Spitzak spitzak at gmail.com
Tue Apr 16 22:37:32 UTC 2019


On Tue, Apr 16, 2019 at 1:53 PM Joshua Watt <jpewhacker at gmail.com> wrote:

> On Tue, 2019-04-16 at 12:01 -0700, Bill Spitzak wrote:
>
> I think you can force the interpolation to bilinear or impulse. However
> you are going to revert to 1980's style scaling with extreme aliasing.
>
>
> Hmm, this seems to be empirically false (at least when using ARM+NEON and
> pixman 0.34). If I revert the cairo change GOOD quality images both look
> fine and render quickly. If I change my application to use FAST quality,
> then I certainly see the 1980's graphics with aliasing and it is even
> faster still, but I'd rather find a way to keep the good quality images
> without the 70% performance hit.
>

Try BILINEAR which should be what GOOD was doing before.


>
> This is some of my work from 4 years ago and unfortunately it never got
> finished due to rejection by the Pixman maintainers (who I think may not be
> working on it any more). This was to implement a two-pass algorithm in
> Pixman that could also do non-affine (perspective) transforms. It should be
> considerably faster for any down-scaling, even if the filter is set to
> bilinear. The current code is not 2-pass (in effect both passes are run for
> every output pixel, rather than saving the result of the first pass, this
> is in fact worse than convolving with a 2-D filter), but at least produces
> modern results.
>
> The problem is that the filters cannot be specified as arrays of weights,
> due to the need to choose arbitrary filter sizes, both to allow non-affine
> transforms and just because most 2-pass algorithms require unexpected
> filter sizes (such as the derivative along the x axis of the input but the
> y axis of the output). IMHO the most practical way to get this is to just
> make "GOOD" and "BEST" select two implementation-chosen filters (BILINEAR
> and IMPULSE would also be allowed) and scrap any ability to specify the
> filter more accurately by the client. This seemed to produce considerable
> pushback in pixman and was rejected and I gave up after succeeding in
> getting the api implemented in Cairo.
>
>
> Perhaps the NEON implementation in pixman is doing something more modern
> and thus is fast and good quality? I will admit that image interpolation
> algorithms aren't my area of expertise and I don't really follow the
> details of what you are saying here, I'm just reporting what I see
> empirically :)
>
>
> On Tue, Apr 16, 2019 at 10:38 AM Joshua Watt <jpewhacker at gmail.com> wrote:
>
> Hello,
>
> I recently upgrade from Cairo 1.12 to 1.14 (yes, I know these are old
> versions), and after doing so noticed a approximately 70% reduction in
> performance when rendering scenes that make heavy use of image scaling.
> I did some digging and tracking the offending commit down to the
> commit: f337342c8 ("V6 image: Use convolution filters for sample
> reconstruction when downscaling")
>
> It appears that this commit is attempting to improve the quality of
> downscaled images by implementing new interpolation algorithms in cairo
> instead of using the pixman algorithms. My theory is that this is much
> slower on ARM processes that have NEON support because pixman has
> special implementations of the interpolations algorithms written to
> take advantage of NEON, while the new cairo implementations do not.
>
> Does anyone have any ideas on what a good path forward would be to
> restore the ARM+NEON performance? I am planning on trying to reproduce
> this with a newer version of cairo to see if it is still a problem, but
> I suspect it will be based on the lack of any significant changes in
> this code to either cairo or pixman.
>
> --
> Joshua Watt <JPEWhacker at gmail.com>
>
> --
>
> Joshua Watt <JPEWhacker at gmail.com>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.cairographics.org/archives/cairo/attachments/20190416/2f1e1c68/attachment-0001.html>


More information about the cairo mailing list