[Pixman] fast-scale branch performance improvements

Soeren Sandmann sandmann at daimi.au.dk
Tue Mar 16 05:26:32 PDT 2010


> On Mon, 2010-03-15 at 03:25 +0200, Siarhei Siamashka wrote:
> > But before it gets committed, some problems with potential fixed point
> > overflows when dealing with large images need to be addressed. I have
> > made a test program which can expose some of these problems:
> > http://cgit.freedesktop.org/~siamashka/pixman/log/?h=largescaling-test
> I pushed a new version of my branch, rebased on:
> http://cgit.freedesktop.org/~sandmann/pixman/log/?h=alex-scaler
> on (as before):
> http://cgit.freedesktop.org/~alexl/pixman/log/?h=alex-scaler

Some comments:

* The warnings that Siarhei mentioned out are because this macro:

        #define CONVERT_0565_TO_8888(s) (CONVERT_0565_TO_0888(s) | 0xff0000000)

  has an extra zero in 0xff0000000. However, fixing this is not enough
  to get scaling-test to pass.

* The macros

        CONVERT_8888_TO_8888 and 0565_TO_0565

  should have parentheses around their expansion.

* box32_to_16_with_offsets():

  Is it safe to rely in narrowing conversions as a way of checking for
  out-of-range numbers? Maybe the check could be written like this

     if ((box32->x1 + dx > INT16_MIN) && ((box32->x1 + dx) < INT16_MAX) &&

  That also makes it clearer that what's going on here is an overflow

  With that, it seems like the box32_to_16 function could be written
  inline in the src_extents_flags() function and be just as clear.

* src_extents_flags():

  - Similarly, it would be clearer to just directly check whether
    extents16 fits in the range INT16_MIN + 1 to INT16_MAX - 1.

  - Could image_covers() be subsumed into src_extents_flags()? They
    are doing very similar things, and the name src_extents_flags
    already suggests that it is computing all the flags based on the
    extents of the source.

* Naming

  - The macro could generate the 'fast_composite_scaled_nearest' part
    of the names with "fast_composite_scaled_nearest ## ... ".

  - Can we just pass in the operator (OVER, SRC) and the repeat mode
    (NORMAL, NONE) and check against those?  The booleans are slightly
    more difficult to understand, even with the comments.

  - If we do that, the operator and repeat parts of the name could
    also be generated.


  - I think I'd prefer compute_src_extent_flags()

* This chunk:

        if (unit_x >= 0)
            while ...
            while ...

  is repeated multiple times.

  Would it be possible to simply call the existing 'repeat' inline,
  possibly extended with a 'unit' parameter?  If it is, then it seems
  like all the repeat modes could be supported fairly easily and the
  existing fast_composite_scale_nearest() could go away.

  If that is not possible, then I think the "if (unit_x >= 0) ..."
  chunk should become an inline function.

* Formatting:

  - While bodies on their own line
  - Braces around multiline statements
  - Braces around bodies when the condition is multiline. Here for

            if (extents16.x1 >= 0  && extents16.y1 >= 0 &&
                extents16.x2 <= image->bits.width &&
                extents16.y2 <= image->bits.height)
                flags |= FAST_PATH_SAMPLES_COVERS_CLIP;

  - Indentation. There are a couple of

          } else /* src */

   where the else should be on it's own line, and the indent of the
   else body should be four spaces.

* I think Siarhei should be mentioned in the
  feb34bd2a0e53ffec5c33c0f52daa1ae27b3fb84 commit. "Based on work by
  Siarhei Siamashka" or something like that.


More information about the Pixman mailing list