platform/upstream/pixman.git
11 years agopixman-utils.c, pixman-private.h: Add floating point conversion routines
Søren Sandmann Pedersen [Sat, 18 Aug 2012 17:02:31 +0000 (13:02 -0400)]
pixman-utils.c, pixman-private.h: Add floating point conversion routines

A new struct argb_t containing a floating point pixel is added to
pixman-private.h and conversion routines are added to pixman-utils.c
to convert normalized integers to and from that struct.

New functions:

  - pixman_expand_to_float()
    Expands a buffer of integer pixels to a buffer of argb_t pixels

  - pixman_contract_from_float()
    Converts a buffer of argb_t pixels to a buffer integer pixels

  - pixman_float_to_unorm()
    Converts a floating point number to an unsigned normalized integer

  - pixman_unorm_to_float()
    Converts an unsigned normalized integer to a floating point number

11 years agoAdd combiner test
Søren Sandmann Pedersen [Sun, 9 Sep 2012 21:56:53 +0000 (17:56 -0400)]
Add combiner test

This test runs the new floating point combiners on random input with
divide-by-zero exceptions turned on.

With the floating point combiners the only thing we guarantee is that
divide-by-zero exceptions are not generated, so change
enable_fp_exceptions() to only enable those, and rename accordingly.

11 years agoAdd pixman-combine-float.c
Søren Sandmann Pedersen [Fri, 14 May 2010 04:42:04 +0000 (00:42 -0400)]
Add pixman-combine-float.c

This file contains floating point implementations of combiners for all
pixman operators. These combiners operate on buffers containing single
precision floating point pixels stored in (a, r, g, b) order.

The combiners are added to the pixman_implementation_t struct, but
nothing uses them yet.

This commit incorporates a number of bug fixes contributed by Andrea
Canciani.

Some notes:

- The combiners are making sure to never divide by zero regardless of
  input, so an application could enable divide-by-zero exceptions and
  pixman wouldn't generate any.

- The operators are implemented according to the Render spec. Ie.,

    - If the input pixels are between 0 and 1, then so is the output.

    - The source and destination coefficients for the conjoint and
      disjoint operators are clamped to [0, 1].

- The PDF operators are not described in the render spec, and the
  implementation here doesn't do any clamping except in the final
  conversion from floating point to destination format.

All of the above will need to be rethought if we add support for pixel
formats that can support negative and greater-than-one pixels. It is
in fact already the case in principle that convolution filters can
produce pixels with negative values, but since these go through the
broken "wide" path that narrows everything to 32 bits, these negative
values don't currently survive to the combiners.

11 years agoblitters-test: Prepare for floating point
Søren Sandmann Pedersen [Sat, 2 Jun 2012 04:15:54 +0000 (00:15 -0400)]
blitters-test: Prepare for floating point

Comment out some formats in blitters-test that are going to rely on
floating point in some upcoming patches.

11 years agoglyph-test: Prepare for floating point
Søren Sandmann Pedersen [Wed, 11 Jul 2012 07:27:49 +0000 (03:27 -0400)]
glyph-test: Prepare for floating point

In preparation for an upcoming change of the wide pipe to use floating
point, comment out some formats in glyph-test that are going to be
using floating point and update the CRC32 value to match.

11 years agoMake pixman.h more const-correct
Søren Sandmann Pedersen [Sat, 29 Sep 2012 14:34:17 +0000 (10:34 -0400)]
Make pixman.h more const-correct

Add const to pointer arguments when the function doesn't change the
pointed-to data.

Also in add_glyphs() in pixman-glyph.c make 'white' in add_glyphs()
static and const.

11 years agoiwmmxt: Don't define dummy _mm_empty for >=gcc-4.8
Matt Turner [Sun, 30 Sep 2012 18:59:23 +0000 (11:59 -0700)]
iwmmxt: Don't define dummy _mm_empty for >=gcc-4.8

Definition was not present in <4.8.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=55451

11 years agorotate-test: Call image_endian_swap() in make_image()
Søren Sandmann Pedersen [Sat, 29 Sep 2012 22:15:54 +0000 (18:15 -0400)]
rotate-test: Call image_endian_swap() in make_image()

Otherwise the test fails on big-endian.

Tested-by: Matt Turner <mattst88@gmail.com>
11 years agoAdd scaled nearest repeat fast paths
Siarhei Siamashka [Tue, 26 Jun 2012 02:36:52 +0000 (22:36 -0400)]
Add scaled nearest repeat fast paths

Before this patch it was often faster to scale and repeat
in two passes because each pass used a fast path vs.
the slow path that the single pass approach takes. This
makes it so that the single pass approach has competitive
performance.

11 years agosse2: mark pack_565_2x128_128 as static force_inline
Matt Turner [Fri, 21 Sep 2012 23:34:24 +0000 (16:34 -0700)]
sse2: mark pack_565_2x128_128 as static force_inline

11 years agoFix for infinite-loop test
Søren Sandmann Pedersen [Sat, 15 Sep 2012 07:13:09 +0000 (03:13 -0400)]
Fix for infinite-loop test

The infinite loop detected by "affine-test 212944861" is caused by an
overflow in this expression:

    max_x = pixman_fixed_to_int (vx + (width - 1) * unit_x) + 1;

where (width - 1) * unit_x doesn't fit in a signed int. This causes
max_x to be too small so that this:

    src_width = 0

    while (src_width < REPEAT_NORMAL_MIN_WIDTH && src_width <= max_x)
        src_width += src_image->bits.width;

results in src_width being 0. Later on when src_width is used for
repeat calculations, we get the infinite loop.

By casting unit_x to int64_t, the expression no longer overflows and
affine-test 212944861 and infinite-loop no longer loop forever.

11 years agotest: Add inifinite-loop test
Søren Sandmann Pedersen [Thu, 13 Sep 2012 23:31:29 +0000 (19:31 -0400)]
test: Add inifinite-loop test

This test demonstrates a bug where a certain transformation matrix can
result in an infinite loop. It was extracted as a standalone version
of "affine-test 212944861".

If given the option -nf, the test program will not call fail_after()
and therefore potentially run forever.

11 years agoaffine-test: Print out the transformation matrix when verbose
Søren Sandmann Pedersen [Thu, 13 Sep 2012 23:29:19 +0000 (19:29 -0400)]
affine-test: Print out the transformation matrix when verbose

Printing out the translation and scale is a bit misleading because the
actual transformation matrix can be modified in various other ways.

Instead simply print the whole transformation matrix that is actually
used.

11 years agoMIPS: DSPr2: Added OVER combiner and two new fast paths: - over_8888_8888 - over_8888...
Nemanja Lukic [Fri, 14 Sep 2012 07:31:26 +0000 (09:31 +0200)]
MIPS: DSPr2: Added OVER combiner and two new fast paths: - over_8888_8888 - over_8888_8888_8888

Performance numbers before/after on MIPS-74kc @ 1GHz:

lowlevel-blt-bench results

Referent (before):
          over_8888_8888 =  L1:  19.61  L2:  17.10  M: 11.16 ( 59.20%)  HT: 16.47  VT: 15.81  R: 14.82  RT:  8.90 (  50Kops/s)
     over_8888_8888_8888 =  L1:  13.56  L2:  11.22  M:  7.46 ( 79.18%)  HT:  6.24  VT:  6.20  R:  6.11  RT:  3.95 (  29Kops/s)

Optimized:
          over_8888_8888 =  L1:  46.42  L2:  36.70  M: 16.69 ( 88.57%)  HT: 17.11  VT: 16.55  R: 15.31  RT:  9.48 (  52Kops/s)
     over_8888_8888_8888 =  L1:  26.06  L2:  22.53  M: 11.49 (121.91%)  HT:  9.93  VT:  9.62  R:  9.19  RT:  5.75 (  36Kops/s)

11 years agoMIPS: DSPr2: Added fast-paths for OVER operation: - over_0565_n_0565 - over_0565_8_0565
Nemanja Lukic [Fri, 14 Sep 2012 07:31:25 +0000 (09:31 +0200)]
MIPS: DSPr2: Added fast-paths for OVER operation: - over_0565_n_0565 - over_0565_8_0565

Performance numbers before/after on MIPS-74kc @ 1GHz:

lowlevel-blt-bench results

Referent (before):
        over_0565_n_0565 =  L1:   7.56  L2:   7.24  M:  6.16 ( 16.38%)  HT:  4.01  VT:  3.84  R:  3.79  RT:  1.66 (  18Kops/s)
        over_0565_8_0565 =  L1:   7.43  L2:   7.05  M:  5.98 ( 23.85%)  HT:  5.27  VT:  5.23  R:  5.09  RT:  3.14 (  28Kops/s)

Optimized:
        over_0565_n_0565 =  L1:  15.47  L2:  14.52  M: 12.30 ( 32.65%)  HT: 10.76  VT: 10.57  R: 10.27  RT:  6.63 (  46Kops/s)
        over_0565_8_0565 =  L1:  15.47  L2:  14.61  M: 11.78 ( 46.92%)  HT: 10.00  VT:  9.84  R:  9.40  RT:  5.81 (  43Kops/s)

11 years agoMIPS: DSPr2: Added fast-paths for OVER operation: - over_8888_n_0565 - over_8888_8_0565
Nemanja Lukic [Fri, 14 Sep 2012 07:31:24 +0000 (09:31 +0200)]
MIPS: DSPr2: Added fast-paths for OVER operation: - over_8888_n_0565 - over_8888_8_0565

Performance numbers before/after on MIPS-74kc @ 1GHz:

lowlevel-blt-bench results

Referent (before):
        over_8888_n_0565 =  L1:   8.95  L2:   8.33  M:  6.95 ( 27.74%)  HT:  4.27  VT:  4.07  R:  4.01  RT:  1.74 (  19Kops/s)
        over_8888_8_0565 =  L1:   8.86  L2:   8.11  M:  6.72 ( 35.71%)  HT:  5.68  VT:  5.62  R:  5.47  RT:  3.35 (  30Kops/s)

Optimized:
        over_8888_n_0565 =  L1:  18.76  L2:  17.55  M: 13.11 ( 52.19%)  HT: 11.35  VT: 11.10  R: 10.88  RT:  6.94 (  47Kops/s)
        over_8888_8_0565 =  L1:  18.14  L2:  16.79  M: 12.10 ( 64.25%)  HT: 10.24  VT:  9.98  R:  9.63  RT:  5.89 (  43Kops/s)

11 years agoMIPS: DSPr2: Added fast-paths for OVER operation: - over_8888_n_8888 - over_8888_8_8888
Nemanja Lukic [Fri, 14 Sep 2012 07:31:23 +0000 (09:31 +0200)]
MIPS: DSPr2: Added fast-paths for OVER operation: - over_8888_n_8888 - over_8888_8_8888

Performance numbers before/after on MIPS-74kc @ 1GHz:

lowlevel-blt-bench results

Referent (before):
        over_8888_n_8888 =  L1:   9.92  L2:  11.27  M:  8.50 ( 45.23%)  HT:  4.70  VT:  4.45  R:  4.49  RT:  1.85 (  20Kops/s)
        over_8888_8_8888 =  L1:  12.54  L2:  10.86  M:  8.18 ( 54.36%)  HT:  6.53  VT:  6.45  R:  6.41  RT:  3.83 (  33Kops/s)

Optimized:
        over_8888_n_8888 =  L1:  28.02  L2:  24.92  M: 14.72 ( 78.15%)  HT: 13.03  VT: 12.65  R: 12.00  RT:  7.49 (  49Kops/s)
        over_8888_8_8888 =  L1:  26.92  L2:  23.93  M: 13.65 ( 90.58%)  HT: 11.68  VT: 11.29  R: 10.56  RT:  6.37 (  45Kops/s)

11 years agopixman-combine.c.template: Formatting clean-ups
Søren Sandmann Pedersen [Fri, 21 Sep 2012 20:52:16 +0000 (16:52 -0400)]
pixman-combine.c.template: Formatting clean-ups

Various formatting fixes, and removal of some obsolete comments about
strength reduction of operators.

11 years agoFix bugs in pixman-image.c
Søren Sandmann Pedersen [Fri, 21 Sep 2012 01:43:24 +0000 (21:43 -0400)]
Fix bugs in pixman-image.c

In the checks for whether the transforms are rotation matrices "-1"
and "1" were used instead of the correct -pixman_fixed_1 and
pixman_fixed_1.

Fixes test suite failure for rotate-test.

11 years agoAdd rotate-test.c test program
Søren Sandmann Pedersen [Thu, 20 Sep 2012 22:41:33 +0000 (18:41 -0400)]
Add rotate-test.c test program

This program exercises a bug in pixman-image.c where "-1" and "1" were
used instead of the correct "- pixman_fixed_1" and "pixman_fixed_1".

With the fast implementation enabled:

     % ./rotate-test
     rotate test failed! (checksum=35A01AAB, expected 03A24D51)

Without it:

     % env PIXMAN_DISABLE=fast ./rotate-test
     pixman: Disabled fast implementation
     rotate test passed (checksum=03A24D51)

V2: The first version didn't have lcg_srand (testnum) in test_transform().

11 years agoFix bugs in component alpha combiners for separable PDF operators
Søren Sandmann Pedersen [Wed, 19 Sep 2012 16:04:11 +0000 (12:04 -0400)]
Fix bugs in component alpha combiners for separable PDF operators

In general, the component alpha version of an operator is supposed to
do this:

       - multiply source with mask in all channels
       - multiply mask with source alpha in all channels
       - compute the regular operator in all channels using the
         mask value whenever source alpha is called for

The first two steps are usually accomplished with the function
combine_mask_ca(), but for operators where source alpha is not used,
such as SRC, ADD and OUT, the simpler function
combine_mask_value_ca(), which doesn't compute the new mask values,
can be used.

However, the PDF blend modes generally *do* make use of source alpha,
so they can't use combine_mask_value_ca() as they do now. They have to
use combine_mask_ca().

This patch fixes this in combine_multiply_ca() and the CA combiners
generated by PDF_SEPARABLE_BLEND_MODE.

11 years agoFix bug in fast_composite_scaled_nearest()
Søren Sandmann Pedersen [Wed, 19 Sep 2012 23:46:13 +0000 (19:46 -0400)]
Fix bug in fast_composite_scaled_nearest()

The fast_composite_scaled_nearest() function can be called when the
format is x8b8g8r8. In that case pixels fetched in fetch_nearest()
need to have their alpha channel set to 0xff.

Fixes test suite failure in scaling-test.

Reviewed-by: Matt Turner <mattst88@gmail.com>
11 years agoAdd PIXMAN_x8b8g8r8 and PIXMAN_a8b8g8r8 formats to scaling-test
Søren Sandmann Pedersen [Wed, 19 Sep 2012 23:26:49 +0000 (19:26 -0400)]
Add PIXMAN_x8b8g8r8 and PIXMAN_a8b8g8r8 formats to scaling-test

Update the CRC values based on what the general implementation
reports. This reveals a bug in the fast implementation:

    % env PIXMAN_DISABLE="mmx sse2" ./test/scaling-test
    pixman: Disabled mmx implementation
    pixman: Disabled sse2 implementation
    scaling test failed! (checksum=AA722B06, expected 03A23E0C)

vs.

    % env PIXMAN_DISABLE="mmx sse2 fast" ./test/scaling-test
    pixman: Disabled fast implementation
    pixman: Disabled mmx implementation
    pixman: Disabled sse2 implementation
    scaling test passed (checksum=03A23E0C)

Reviewed-by: Matt Turner <mattst88@gmail.com>
11 years agoimplementation: Rename delegate to fallback
Søren Sandmann Pedersen [Sat, 15 Sep 2012 23:10:56 +0000 (19:10 -0400)]
implementation: Rename delegate to fallback

At this point the chain of implementations has nothing to do with the
delegation design pattern anymore, so rename the delegate pointer to
'fallback'.

11 years ago_pixman_implementation_create(): Initialize implementation with memset()
Søren Sandmann Pedersen [Sat, 15 Sep 2012 17:58:45 +0000 (13:58 -0400)]
_pixman_implementation_create(): Initialize implementation with memset()

All the function pointers are NULL by default now, so we can just zero
the struct. Also write the function a little more compactly.

11 years agoRename _pixman_lookup_composite_function() to _pixman_implementation_lookup_composite()
Søren Sandmann Pedersen [Sat, 15 Sep 2012 17:53:17 +0000 (13:53 -0400)]
Rename _pixman_lookup_composite_function() to _pixman_implementation_lookup_composite()

And move it into pixman-implementation.c which is where it belongs
logically.

11 years agoMove delegation of src/dest iter init into pixman-implementation.c
Søren Sandmann Pedersen [Sat, 15 Sep 2012 17:20:52 +0000 (13:20 -0400)]
Move delegation of src/dest iter init into pixman-implementation.c

Instead of relying on each implementation to delegate when an iterator
can't be initialized, change the type of iterator initializers to
boolean and make pixman-implementation.c do the delegation whenever an
iterator initializer returns FALSE.

11 years agoMove fill delegation into pixman-implementation.c
Søren Sandmann Pedersen [Sat, 15 Sep 2012 17:08:51 +0000 (13:08 -0400)]
Move fill delegation into pixman-implementation.c

As in the blt commit, do the delegation in pixman-implementation.c
whenever the implementation fill returns FALSE instead of relying on
each implementation to do it by itself.

With this change there is no longer any reason for the implementations
to have one fill function that delegates and one that actually blits,
so consolidate those in the NEON, DSPr2, SSE2, and MMX
implementations.

11 years agoMove blt delegation into pixman-implementation.c
Søren Sandmann Pedersen [Sat, 15 Sep 2012 17:03:10 +0000 (13:03 -0400)]
Move blt delegation into pixman-implementation.c

Rather than require each individual implementation to do the
delegation for blt, just do it in pixman-implementation.c whenever the
implementation blt returns FALSE.

With this change, there is no longer any reason for the
implementations to have one blt function that delegates and one that
actually blits, so consolidate those in the NEON, DSPr2, SSE2, and MMX
implementations.

11 years agoimplementation: Write lookup_combiner() in a less convoluted way.
Søren Sandmann Pedersen [Sat, 15 Sep 2012 16:48:42 +0000 (12:48 -0400)]
implementation: Write lookup_combiner() in a less convoluted way.

Instead of initializing an array on the stack, just use a simple
switch to select which set of combiners to look up in.

11 years agobuild: Remove useless DEP_CFLAGS/DEP_LIBS variables
Matt Turner [Sun, 16 Sep 2012 04:25:38 +0000 (00:25 -0400)]
build: Remove useless DEP_CFLAGS/DEP_LIBS variables

11 years agobuild: Improve win32 build system
Andrea Canciani [Thu, 21 Jun 2012 04:07:07 +0000 (06:07 +0200)]
build: Improve win32 build system

Handle cross-directory dependencies using PHONY targets and clean up
some redundancies.

11 years agommx: Fix x86 build on MSVC
Andrea Canciani [Tue, 17 Jul 2012 14:14:20 +0000 (16:14 +0200)]
mmx: Fix x86 build on MSVC

The MSVC compiler is very strict about variable declarations after
statements.

Move all the declarations of each block before any statement in
the same block to fix multiple instances of:

pixman-mmx.c(xxxx) : error C2275: '__m64' : illegal use of this type
as an expression

11 years agotest/utils.c: Use pow(), not powf() in sRGB conversion routines
Søren Sandmann Pedersen [Sun, 26 Aug 2012 22:23:53 +0000 (18:23 -0400)]
test/utils.c: Use pow(), not powf() in sRGB conversion routines

These functions are operating on double precision values, so use pow()
instead of powf().

11 years agopixel_checker: Move sRGB conversion into get_limits()
Søren Sandmann Pedersen [Sun, 26 Aug 2012 22:13:47 +0000 (18:13 -0400)]
pixel_checker: Move sRGB conversion into get_limits()

The sRGB conversion has to be done every time the limits are being
computed. Without this fix, pixel_checker_get_min/max() will produce
the wrong results when called from somewhere other than
pixel_checker_check().

11 years agoRemove obsolete TODO file
Søren Sandmann Pedersen [Sat, 25 Aug 2012 21:14:50 +0000 (17:14 -0400)]
Remove obsolete TODO file

11 years agoRemove pointless declaration of _pixman_image_get_scanline_generic_64()
Søren Sandmann Pedersen [Sun, 19 Aug 2012 17:45:21 +0000 (13:45 -0400)]
Remove pointless declaration of _pixman_image_get_scanline_generic_64()

This declaration used to be necessary when
_pixman_image_get_scanline_generic_64() referred to a structure that
itself referred back to _pixman_image_get_scanline_generic_64().

11 years agodemos: Add srgb_trap_test.c
Søren Sandmann Pedersen [Sat, 9 Jun 2012 13:15:53 +0000 (09:15 -0400)]
demos: Add srgb_trap_test.c

This demo program composites a bunch of trapezoids side by side with
and without gamma aware compositing.

11 years agoMake show_image() cope with more formats
Søren Sandmann Pedersen [Sat, 9 Jun 2012 13:42:56 +0000 (09:42 -0400)]
Make show_image() cope with more formats

This makes show_image() deal with more formats than just a8r8g8b8, in
particular, a8r8g8b8_sRGB can now be handled.

Images that are passed to show_image with a format of a8r8g8b8_sRGB
are displayed without modification under the assumption that the
monitor is approximately sRGB.

Images with a format of a8r8g8b8 are also displayed without
modification since many other users of show_image() have been
generating essentially sRGB data with this format. Other formats are
also assumed to be gamma compressed; these are converted to a8r8g8b8
before being displayed.

With these changes, srgb-test.c doesn't need to do its own conversion
anymore.

11 years agoDefine TIMER_BEGIN and TIMER_END even when timers are not enabled
Søren Sandmann Pedersen [Tue, 31 Jul 2012 19:01:16 +0000 (15:01 -0400)]
Define TIMER_BEGIN and TIMER_END even when timers are not enabled

This allows code that uses these macros to build when timers are
disabled.

11 years agoPost-release version bump to 0.27.3
Søren Sandmann Pedersen [Wed, 1 Aug 2012 19:56:13 +0000 (15:56 -0400)]
Post-release version bump to 0.27.3

11 years agoPre-release version bump to 0.27.2 pixman-0.27.2
Søren Sandmann Pedersen [Wed, 1 Aug 2012 19:22:57 +0000 (15:22 -0400)]
Pre-release version bump to 0.27.2

11 years agoUse angle brackets form of including config.h
Sebastian Bauer [Tue, 31 Jul 2012 05:30:32 +0000 (07:30 +0200)]
Use angle brackets form of including config.h

11 years agoAdded HAVE_CONFIG_H check before including config.h
Sebastian Bauer [Tue, 31 Jul 2012 05:30:31 +0000 (07:30 +0200)]
Added HAVE_CONFIG_H check before including config.h

11 years agoglyph-test: Avoid setting solid images as alpha maps.
Søren Sandmann Pedersen [Mon, 30 Jul 2012 20:21:39 +0000 (16:21 -0400)]
glyph-test: Avoid setting solid images as alpha maps.

glyph-test would sometimes set a solid image as an alpha map, which is
not allowed. When this happened and the debug spew was enabled,
messages like this one would be generated:

    *** BUG ***
    In pixman_image_set_alpha_map: The expression
            !alpha_map || alpha_map->type == BITS was false
    Set a breakpoint on '_pixman_log_error' to debug

Fix this by not passing the ALLOW_SOLID flag to create_image() when
the resulting is to be used as an alpha map.

11 years agostress-test: Avoid overflows in clip rectangles
Søren Sandmann Pedersen [Mon, 30 Jul 2012 20:10:05 +0000 (16:10 -0400)]
stress-test: Avoid overflows in clip rectangles

The rectangles in the clip region set in set_general_properties()
would sometimes overflow, which would lead to messages like these:

      *** BUG ***
      In pixman_region32_union_rect: Invalid rectangle passed
      Set a breakpoint on '_pixman_log_error' to debug

when the micro version number of pixman is even.

Fix this by detecting the overflow and clamping such that the x2/y2
coordinates are less than INT32_MAX.

11 years agoAdd make-srgb.pl to EXTRA_DIST
Søren Sandmann Pedersen [Mon, 30 Jul 2012 19:54:27 +0000 (15:54 -0400)]
Add make-srgb.pl to EXTRA_DIST

Otherwise make distcheck doesn't pass.

12 years agoAdd tests to validate new sRGB behavior
Antti S. Lankila [Sun, 29 Jul 2012 19:14:34 +0000 (22:14 +0300)]
Add tests to validate new sRGB behavior

Composite checks random combinations of operations that now also have
sRGB sources, masks and destinations, and stress-test validates the
read/write primitives.

12 years agoAdd sRGB blending demo program
Antti S. Lankila [Sun, 29 Jul 2012 18:56:18 +0000 (21:56 +0300)]
Add sRGB blending demo program

Simple sRGB color blender test can be used to determine if the sRGB processing
works as expected. It blends alpha ramps of purple and green together such that
at midpoint of image, 50 % blend of both is realized. At that point, sRGB-aware
processing yields a result close to #bbb rather than #888, which is the linear
light blending result.

The demo also contains the sample computation for sRGB premultiplied alpha.

12 years agoAdd support for sRGB surfaces
Antti S. Lankila [Sun, 29 Jul 2012 18:46:58 +0000 (21:46 +0300)]
Add support for sRGB surfaces

sRGB format is defined as a new format type, PIXMAN_TYPE_ARGB_SRGB. One form of
this type is provided, PIXMAN_a8r8g8b8_sRGB. Use of an sRGB format triggers
wide processing, and the pixel fetch/store functions handle the relevant
conversion between color spaces. Pixman itself is thought to compose in the
linearized sRGB color space.

sRGB conversion is tabularized. For sRGB to linear, we are using only 256
values because the current source format uses 8 bits per component precision.
For linear to sRGB, it turns out that only 4096 brightness levels are required
to generate all of the 256 sRGB color values, and therefore only 12 bits per
component are considered during store. As a special case, a no-op
sRGB->linear->sRGB conversion is constructed to be lossless by adjusting the
sRGB->linear conversion table where necessary.

12 years agoRemove unnecessary dst initialization
Antti S. Lankila [Sat, 28 Jul 2012 11:02:42 +0000 (14:02 +0300)]
Remove unnecessary dst initialization

The initialization work is already performed correctly in image_init().

12 years agoMake pixman-mmx.c compile on x86-32 without optimization
Søren Sandmann Pedersen [Mon, 9 Jul 2012 10:58:59 +0000 (06:58 -0400)]
Make pixman-mmx.c compile on x86-32 without optimization

When not optimizing, write _mm_shuffle_pi16() as a statement
expression with inline assembly. That way we avoid
__builtin_ia32_pshufw(), which is only available when compiling with
-msse, while still allowing the non-optimizing gcc to understand that
the second argument is a compile time constant.

Tested-by: Knut Petersen <knut_petersen@t-online.de>
12 years agoCleanups and simplifications in x86 CPU feature detection
Søren Sandmann Pedersen [Thu, 28 Jun 2012 19:53:14 +0000 (15:53 -0400)]
Cleanups and simplifications in x86 CPU feature detection

A new function pixman_cpuid() is added that runs the cpuid instruction
and returns the results. On GCC this function uses inline assembly; on
MSVC, the function calls the __cpuid intrinsic.

There is also a new function called have_cpuid() which detects whether
cpuid is available. On x86-64 and MSVC, it simply returns TRUE; on
x86-32 bit, it checks whether the 22nd bit of eflags can be
modified. On MSVC this does have the consequence that pixman will no
longer work CPUS without cpuid (ie., older than 486 and some 486
models).

These two functions together makes it possible to write a generic
detect_cpu_features() in plain C. This function is then used in a new
have_feature() function that checks whether a specific set of feature
bits is available.

Aside from the cleanups and simplifications, the main benefit from
this patch is that pixman now can do feature detection on x86-64, so
that newer instruction sets such as SSSE3 and SSE4.1 can be used. (And
apparently the assumption that x86-64 CPUs always have MMX and SSE2 is
no longer correct: Knight's Corner is x86-64, but doesn't have them).

V2: Rename the constants in the getisax() code, as pointed out by Alan
Coopersmith. Also reinstate the result variable and initialize
features to 0.

V3: Fixes for the fact that the upper 32 bits of a 64 bit register are
zeroed whenever the corresponding 32 bit register is written to.

V4: Fixes for the fact that in 32 bit mode, when gcc is not optimizing
there were not enough registers available. The new code uses the "a",
"b", "c", and "d" constraints instead, and has two separate versions
for 32 and 64 bit modes.

12 years agoChanged the style of two function headers
Sebastian Bauer [Sun, 8 Jul 2012 22:48:45 +0000 (18:48 -0400)]
Changed the style of two function headers

Declare functions *_inverse() and *_contains_rectangle() in the same
way as the other functions are declared. This doesn't imply any semantic
changes. It's just a unification of coding styles.

12 years agoMIPS: DSPr2: Added more bilinear fast paths (without mask)
Nemanja Lukic [Mon, 2 Jul 2012 18:54:20 +0000 (20:54 +0200)]
MIPS: DSPr2: Added more bilinear fast paths (without mask)

Performance numbers before/after on MIPS-74kc @ 1GHz:

lowlevel-blt-bench -b

Referent (before):
  src_8888_8888 =  L1:   8.18  L2:   7.79  M:  6.32 ( 33.51%)  HT:  5.78  VT:  5.70  R:  5.61  RT:  3.79 (  29Kops/s)
  src_8888_0565 =  L1:   6.90  L2:   7.14  M:  6.47 ( 25.75%)  HT:  5.54  VT:  5.51  R:  5.46  RT:  3.53 (  28Kops/s)
  src_0565_x888 =  L1:   3.76  L2:   3.71  M:  3.37 ( 13.41%)  HT:  3.26  VT:  3.22  R:  3.20  RT:  2.58 (  23Kops/s)
  src_0565_0565 =  L1:   3.59  L2:   3.56  M:  3.47 (  9.19%)  HT:  3.19  VT:  3.18  R:  3.16  RT:  2.46 (  22Kops/s)
 over_8888_8888 =  L1:   5.99  L2:   5.66  M:  4.95 ( 26.28%)  HT:  4.40  VT:  4.38  R:  4.31  RT:  3.02 (  26Kops/s)
  add_8888_8888 =  L1:   6.84  L2:   6.39  M:  5.48 ( 29.09%)  HT:  4.80  VT:  4.79  R:  4.70  RT:  3.20 (  27Kops/s)

Optimized:
  src_8888_8888 =  L1:  18.27  L2:  16.69  M: 12.87 ( 68.25%)  HT: 11.80  VT: 11.61  R: 10.60  RT:  7.05 (  41Kops/s)
  src_8888_0565 =  L1:  15.18  L2:  14.10  M: 11.75 ( 46.71%)  HT: 10.64  VT: 10.50  R: 10.03  RT:  7.15 (  41Kops/s)
  src_0565_x888 =  L1:  10.45  L2:   9.96  M:  9.23 ( 36.72%)  HT:  8.39  VT:  8.29  R:  8.02  RT:  5.75 (  37Kops/s)
  src_0565_0565 =  L1:   9.37  L2:   8.98  M:  8.50 ( 22.53%)  HT:  7.71  VT:  7.66  R:  7.52  RT:  5.59 (  37Kops/s)
 over_8888_8888 =  L1:  12.21  L2:  11.01  M:  8.56 ( 45.36%)  HT:  7.71  VT:  7.64  R:  7.43  RT:  5.51 (  36Kops/s)
  add_8888_8888 =  L1:  17.72  L2:  15.16  M: 10.78 ( 57.13%)  HT:  9.46  VT:  9.30  R:  9.00  RT:  6.03 (  38Kops/s)

12 years agoMIPS: DSPr2: Added several bilinear fast paths with a8 mask
Nemanja Lukic [Mon, 2 Jul 2012 18:54:19 +0000 (20:54 +0200)]
MIPS: DSPr2: Added several bilinear fast paths with a8 mask

Performance numbers before/after on MIPS-74kc @ 1GHz:

lowlevel-blt-bench -b

Referent (before):

  src_8888_8_8888 =  L1:   6.37  L2:   6.08  M:  5.46 ( 32.57%)  HT:  4.64  VT:  4.61  R:  4.52  RT:  2.85 (  23Kops/s)
  src_8888_8_0565 =  L1:   5.89  L2:   5.66  M:  5.11 ( 23.71%)  HT:  4.36  VT:  4.34  R:  4.26  RT:  2.71 (  22Kops/s)
  src_0565_8_x888 =  L1:   3.32  L2:   3.27  M:  3.17 ( 14.71%)  HT:  2.86  VT:  2.84  R:  2.81  RT:  2.07 (  19Kops/s)
  src_0565_8_0565 =  L1:   3.19  L2:   3.15  M:  3.05 ( 10.11%)  HT:  2.75  VT:  2.74  R:  2.71  RT:  2.00 (  18Kops/s)
 over_8888_8_8888 =  L1:   4.99  L2:   4.71  M:  4.11 ( 27.22%)  HT:  3.59  VT:  3.58  R:  3.50  RT:  2.36 (  21Kops/s)
  add_8888_8_8888 =  L1:   5.60  L2:   5.26  M:  4.52 ( 29.95%)  HT:  3.92  VT:  3.89  R:  3.80  RT:  2.49 (  21Kops/s)

Optimized:

  src_8888_8_8888 =  L1:  13.19  L2:  12.13  M:  9.75 ( 58.22%)  HT:  8.60  VT:  8.44  R:  7.90  RT:  5.06 (  33Kops/s)
  src_8888_8_0565 =  L1:  11.64  L2:  10.81  M:  9.18 ( 42.63%)  HT:  8.04  VT:  7.90  R:  7.57  RT:  5.02 (  32Kops/s)
  src_0565_8_x888 =  L1:   8.34  L2:   7.95  M:  7.29 ( 33.85%)  HT:  6.55  VT:  6.48  R:  6.25  RT:  4.35 (  30Kops/s)
  src_0565_8_0565 =  L1:   7.71  L2:   7.35  M:  6.90 ( 22.90%)  HT:  6.14  VT:  6.10  R:  5.94  RT:  4.07 (  29Kops/s)
 over_8888_8_8888 =  L1:   9.73  L2:   8.99  M:  7.15 ( 47.41%)  HT:  6.40  VT:  6.30  R:  6.11  RT:  4.28 (  30Kops/s)
  add_8888_8_8888 =  L1:  13.01  L2:  11.72  M:  8.70 ( 57.68%)  HT:  7.59  VT:  7.46  R:  7.20  RT:  4.74 (  32Kops/s)

12 years agoSimplify CPU detection on PPC.
Søren Sandmann Pedersen [Thu, 28 Jun 2012 02:11:29 +0000 (22:11 -0400)]
Simplify CPU detection on PPC.

Get rid of the initialized and have_vmx static variables in
pixman-ppc.c There is no point to them since CPU detection only
happens once per process.

On Linux, just read /proc/self/auxv instead of generating the filename
with getpid() and don't bother with the stack buffer. Instead just
read the aux entries one by one.

12 years agoSimplifications to ARM CPU detection
Søren Sandmann Pedersen [Thu, 28 Jun 2012 02:05:18 +0000 (22:05 -0400)]
Simplifications to ARM CPU detection

Organize pixman-arm.c such that each operating system/compiler exports
a detect_cpu_features() function that returns a bitmask with the
various features that we are interested in. A new function
have_feature() then calls this function, caches the result, and return
whether the given feature is available.

The result is that all the pixman_have_arm_<feature> functions become
redundant and can be deleted.

12 years agoSimplify MIPS CPU detection
Søren Sandmann Pedersen [Wed, 27 Jun 2012 18:14:54 +0000 (14:14 -0400)]
Simplify MIPS CPU detection

There is no reason to have pixman_have_<feature> functions when all
they do is call pixman_have_mips_feature().

Instead rename pixman_have_mips_feature() to have_feature() and call
it directly from _pixman_mips_get_implementations(). Also on
non-Linux, just make have_feature() return FALSE.

12 years agoMove the remaining bits of pixman-cpu into pixman-implementation.c
Søren Sandmann Pedersen [Thu, 28 Jun 2012 03:04:24 +0000 (23:04 -0400)]
Move the remaining bits of pixman-cpu into pixman-implementation.c

12 years agoMove MIPS specific CPU detection to its own file, pixman-mips.c
Søren Sandmann Pedersen [Tue, 26 Jun 2012 21:26:34 +0000 (17:26 -0400)]
Move MIPS specific CPU detection to its own file, pixman-mips.c

12 years agoMove PowerPC specific CPU detection to its own file pixman-ppc.c
Søren Sandmann Pedersen [Tue, 26 Jun 2012 21:30:22 +0000 (17:30 -0400)]
Move PowerPC specific CPU detection to its own file pixman-ppc.c

12 years agoMove ARM specific CPU detection to a new file pixman-arm.c
Søren Sandmann Pedersen [Tue, 26 Jun 2012 21:02:24 +0000 (17:02 -0400)]
Move ARM specific CPU detection to a new file pixman-arm.c

Similar to the x86 commit, this moves the ARM specific CPU detection
to its own file which exports a pixman_arm_get_implementations()
function that is supposed to be a noop on non-ARM.

12 years agoMove x86 specific CPU detection to a new file pixman-x86.c
Søren Sandmann Pedersen [Tue, 26 Jun 2012 16:44:32 +0000 (12:44 -0400)]
Move x86 specific CPU detection to a new file pixman-x86.c

Extract the x86 specific parts of pixman-cpu.c and put them in their
own file called pixman-x86.c which exports one function
pixman_x86_get_implementations() that creates the MMX and SSE2
implementations. This file is supposed to be compiled on all
architectures, but pixman_x86_get_implementations() should be a noop
on non-x86.

12 years agopixman-cpu.c: Rename disabled to _pixman_disabled() and export it
Søren Sandmann Pedersen [Tue, 26 Jun 2012 22:07:39 +0000 (18:07 -0400)]
pixman-cpu.c: Rename disabled to _pixman_disabled() and export it

12 years agoQualify the static variables in pixman_f_transform_invert() with the const keyword.
Sebastian Bauer [Tue, 3 Jul 2012 09:55:14 +0000 (05:55 -0400)]
Qualify the static variables in pixman_f_transform_invert() with the const keyword.

Their contents is not overwritten.

12 years agoUse a compile-time constant for the "K" constraint in the MMX detection.
Søren Sandmann Pedersen [Sun, 1 Jul 2012 20:59:53 +0000 (16:59 -0400)]
Use a compile-time constant for the "K" constraint in the MMX detection.

When compiling with -O0, gcc doesn't understand that in

     signed char x = 0;

     ...

     asm ("...",
        : "K" (x));

x is constant. Fix this by using an immediate constant instead of a
variable.

12 years agoIn fast_composite_tiled_repeat() don't clone images with a palette
Søren Sandmann Pedersen [Sun, 1 Jul 2012 10:54:06 +0000 (06:54 -0400)]
In fast_composite_tiled_repeat() don't clone images with a palette

In fast_composite_tiled_repeat() if the source image is less than a
certain constant width, a clone is created which is then
pre-repeated. However, the source image's palette, if it has one, is
not cloned, so for indexed images, the pre-repeating would crash.

Fix this by not doing any pre-repeating for images with a palette set.

12 years agotest: Make stress-test more likely to actually composite something
Søren Sandmann Pedersen [Sun, 1 Jul 2012 10:53:18 +0000 (06:53 -0400)]
test: Make stress-test more likely to actually composite something

stress-test current almost never composites anything because the clip
rectangles and transformations are such that either
_pixman_compute_composite_region32() or analyze_extent() will return
FALSE.

Fix this by:

- making log_rand() return smaller numbers so that the clip rectangles
  are more likely to be within the destination image

- adding rand_x() and rand_y() functions that pick positions within an
  image and using them for positioning alpha maps and source/mask
  positions.

- making it less likely that clip regions are used in general

These changes make the test take longer, so speed it up a little by
making most images smaller and by reducing the maximum convolution
filter from 17x19 to 3x4.

With these changes, stress-test reveals a crash in iteration 0xd39
where fast_composite_tiled_repeat() creates an indexed image without a
palette.

12 years agosse2: add missing ABGR entires for bilinear src_8888_8888
Matt Turner [Sun, 1 Jul 2012 20:35:46 +0000 (16:35 -0400)]
sse2: add missing ABGR entires for bilinear src_8888_8888

12 years agoloongson: optimize _mm_set_pi* functions with shuffle instructions
Matt Turner [Mon, 21 May 2012 09:56:58 +0000 (05:56 -0400)]
loongson: optimize _mm_set_pi* functions with shuffle instructions

12 years agommx: optimize bilinear function when using 7-bit precision
Matt Turner [Wed, 27 Jun 2012 17:00:36 +0000 (13:00 -0400)]
mmx: optimize bilinear function when using 7-bit precision

Loongson:
image             firefox-fishtank 1037.738 1040.218   0.19%    3/3
image             firefox-fishtank 1056.611 1057.581   0.20%    3/3

ARM/iwMMXt:
image             firefox-fishtank 1487.282 1492.640   0.17%    3/3
image             firefox-fishtank 1363.913 1364.366   0.11%    3/3

12 years agommx: add scaled bilinear over_8888_8_8888
Matt Turner [Mon, 21 May 2012 00:51:08 +0000 (20:51 -0400)]
mmx: add scaled bilinear over_8888_8_8888

Loongson:
image             firefox-fishtank 1665.163 1670.370   0.17%    3/3
image             firefox-fishtank 1037.738 1040.218   0.19%    3/3

ARM/iwMMXt:
image             firefox-fishtank 2042.723 2045.308   0.10%    3/3
image             firefox-fishtank 1487.282 1492.640   0.17%    3/3

12 years agommx: add scaled bilinear over_8888_8888
Matt Turner [Wed, 27 Jun 2012 16:57:45 +0000 (12:57 -0400)]
mmx: add scaled bilinear over_8888_8888

Loongson:
image         firefox-planet-gnome  157.012  158.087   0.30%    6/6
image         firefox-planet-gnome  156.617  157.109   0.15%    5/6

ARM/iwMMXt:
image         firefox-planet-gnome  148.086  149.339   0.76%    6/6
image         firefox-planet-gnome  144.939  146.123   0.61%    6/6

12 years agommx: add scaled bilinear src_8888_8888
Matt Turner [Tue, 19 Jun 2012 04:30:51 +0000 (00:30 -0400)]
mmx: add scaled bilinear src_8888_8888

Loongson:
image         firefox-planet-gnome  170.025  170.229   0.09%    3/4
image         firefox-planet-gnome  157.012  158.087   0.30%    6/6

ARM/iwMMXt:
image         firefox-planet-gnome  164.192  164.875   0.34%    3/4
image         firefox-planet-gnome  148.086  149.339   0.76%    6/6

12 years agommx: Use expand_alpha instead of mask/shift
Matt Turner [Thu, 28 Jun 2012 16:17:16 +0000 (12:17 -0400)]
mmx: Use expand_alpha instead of mask/shift

12 years agoChange default bilinear interpolation precision to 7 bits
Siarhei Siamashka [Sun, 1 Jul 2012 20:00:34 +0000 (23:00 +0300)]
Change default bilinear interpolation precision to 7 bits

This improves performance for the current SSE2 code. Further
reduction to 4 bits may be considered later if it proves
to allow additional speedup.

12 years agosse2: _mm_madd_epi16 for faster bilinear scaling with 7-bit precision
Siarhei Siamashka [Mon, 25 Jun 2012 22:47:18 +0000 (01:47 +0300)]
sse2: _mm_madd_epi16 for faster bilinear scaling with 7-bit precision

Reducing interpolation precision allows the use of PMADDWD instruction.
This makes bilinear scaling much faster (on Intel Core i7):

8-bit: image             firefox-fishtank   57.584   58.349   0.74%    3/3
7-bit: image             firefox-fishtank   51.139   51.229   0.30%    3/3

8-bit: src_8888_8888 =  L1: 228.71  L2: 226.52  M:224.82 ( 14.95%)  HT:183.22  VT:154.02  R:171.72  RT:109.36
7-bit: src_8888_8888 =  L1: 320.45  L2: 317.43  M:314.38 ( 20.77%)  HT:215.13  VT:177.35  R:204.46  RT:121.93

12 years agoBilinear interpolation precision is now configurable at compile time
Siarhei Siamashka [Mon, 25 Jun 2012 22:06:10 +0000 (01:06 +0300)]
Bilinear interpolation precision is now configurable at compile time

Macro BILINEAR_INTERPOLATION_BITS in pixman-private.h selects
the number of fractional bits used for bilinear interpolation.

scaling-test and affine-test have checksums for 4-bit, 7-bit
and 8-bit configurations.

12 years agoFix distcheck due to custom iwMMXt rules
Matt Turner [Fri, 29 Jun 2012 18:24:30 +0000 (14:24 -0400)]
Fix distcheck due to custom iwMMXt rules

12 years agosse2: faster bilinear scaling (use _mm_loadl_epi64)
Siarhei Siamashka [Mon, 25 Jun 2012 04:24:27 +0000 (07:24 +0300)]
sse2: faster bilinear scaling (use _mm_loadl_epi64)

Using _mm_loadl_epi64() to load two pixels at once (pairs of top
and bottom pixels) is faster than loading each pixel separately
and combining them with _mm_set_epi32().

=== cairo-perf-trace ===

before: image             firefox-fishtank   66.912   66.931   0.13%    3/3
after:  image             firefox-fishtank   57.584   58.349   0.74%    3/3

=== lowlevel-blt-bench ===

before: src_8888_8888 =  L1: 181.10  L2: 179.14  M:178.08 ( 11.02%)  HT:153.22  VT:133.45  R:142.24  RT: 95.32
after:  src_8888_8888 =  L1: 228.68  L2: 225.75  M:223.98 ( 14.23%)  HT:185.32  VT:155.06  R:162.73  RT:102.52

This improvement was suggested by Matt Turner on irc.

12 years agotest: support nearest/bilinear scaling in lowlevel-blt-bench
Siarhei Siamashka [Mon, 25 Jun 2012 04:11:59 +0000 (07:11 +0300)]
test: support nearest/bilinear scaling in lowlevel-blt-bench

Scale factor is selected to be nearly 1x, so that the MPix/s results
can be directly compared with the results of non-scaled compositing
operations.

12 years agotest: Fix for strict aliasing issue in 'get_random_seed'
Siarhei Siamashka [Sat, 23 Jun 2012 01:08:28 +0000 (04:08 +0300)]
test: Fix for strict aliasing issue in 'get_random_seed'

Gets rid of gcc warning when compiled with -fstrict-aliasing option in CFLAGS

12 years agobuild: Fix compilation on win32
Andrea Canciani [Wed, 20 Jun 2012 15:13:33 +0000 (17:13 +0200)]
build: Fix compilation on win32

When compiling using the win32 build system, config.h is not
available nor needed.

Fixes:

pixman-glyph.c(26) : fatal error C1083: Cannot open include file:
'config.h': No such file or directory

12 years agosse2: add src_x888_0565
Matt Turner [Thu, 3 May 2012 03:13:43 +0000 (23:13 -0400)]
sse2: add src_x888_0565

Port of 2ddd1c498b to SSE2.

Uses the pmadd technique described in
http://software.intel.com/sites/landingpage/legacy/mmx/MMX_App_24-16_Bit_Conversion.pdf

Works around lack of packusdw instruction by first sign extending the
values.

fast: src_8888_0565 =  L1: 681.40  L2: 689.20  M: 644.76 ( 25.51%)  HT:404.42  VT:288.04  R:306.07  RT:150.80 (1619Kops/s)
mmx: src_8888_0565 =  L1:2056.03  L2:1985.44  M:1574.91 ( 61.87%)  HT:533.10  VT:376.35  R:416.10  RT:178.79 (1833Kops/s)
sse2: src_8888_0565 =  L1:3793.42  L2:3653.44  M:1878.83 ( 73.94%)  HT:535.03  VT:407.96  R:421.46  RT:163.31 (1727Kops/s)

and for reference, using packusdw
sse4: src_8888_0565 =  L1:4396.18  L2:4229.25  M:1904.04 ( 75.18%)  HT:559.79  VT:427.96  R:440.06  RT:165.71 (1744Kops/s)

Notice that MMX is faster in the RT case because it can operate on
8-bytes instead of the current 16-bytes for SSE2.

12 years agosse2: enable over_n_0565 for b5g6r5
Matt Turner [Wed, 13 Jun 2012 17:18:49 +0000 (13:18 -0400)]
sse2: enable over_n_0565 for b5g6r5

Same as b950bb12 for MMX.

12 years ago.gitignore: add test/glyph-test
Matt Turner [Wed, 13 Jun 2012 20:37:48 +0000 (16:37 -0400)]
.gitignore: add test/glyph-test

12 years agotest: Add missing break in stress-test.c
Søren Sandmann Pedersen [Wed, 13 Jun 2012 02:04:29 +0000 (22:04 -0400)]
test: Add missing break in stress-test.c

Found by coverity:

https://bugzilla.redhat.com/show_bug.cgi?id=756069

12 years agotest: fix bisecting issue in fuzzer-find-diff.pl
Siarhei Siamashka [Wed, 6 Jun 2012 20:54:20 +0000 (23:54 +0300)]
test: fix bisecting issue in fuzzer-find-diff.pl

Before bisecting to find the exact test which has failed, we
first need to make sure that the first test is fine (the first
test is "good" and the whole range is "bad"). Otherwise
test 2 gets incorrectly flagged as problematic in the case
if we already got a failure on test 1 right from the start.

12 years agotest: OpenMP 2.5 requires signed loop iteration variables
Siarhei Siamashka [Wed, 6 Jun 2012 19:21:32 +0000 (22:21 +0300)]
test: OpenMP 2.5 requires signed loop iteration variables

Unsigned loop variables are only supported since version 3.0
of OpenMP specification. Changing loop variables to use int32_t
type fixes pixman build problems with path64 compiler.

12 years agotest: Make glyph test pass on big endian
Søren Sandmann Pedersen [Mon, 11 Jun 2012 23:13:45 +0000 (19:13 -0400)]
test: Make glyph test pass on big endian

The destination buffer was initialized with random uint32_t values, so
it started out different on big endian vs. little endian. Fix that by
initializing the buffer with random uint8_t values instead.

12 years agobits-image: Turn all the fetchers into iterator getters
Søren Sandmann Pedersen [Sun, 8 Jan 2012 18:21:11 +0000 (13:21 -0500)]
bits-image: Turn all the fetchers into iterator getters

Instead of caching these fetchers in the image structure, and then
have the iterator getter call them from there, simply change them to
be iterator getters themselves.

This avoids an extra indirect function call and lets us get rid of the
get_scanline_32/64 fields in pixman_image_t.

12 years agoFaster unorm_to_unorm for wide processing.
Antti S. Lankila [Sun, 10 Jun 2012 16:22:56 +0000 (19:22 +0300)]
Faster unorm_to_unorm for wide processing.

Optimizing the unorm_to_unorm functions allows a speedup from:

src_8888_2x10 =  L1:  62.08  L2:  60.73  M: 59.61 (  4.30%)  HT: 46.81
VT: 42.17  R: 43.18  RT: 26.01 (325Kops/s)

to:

src_8888_2x10 =  L1:  76.94  L2:  78.43  M: 75.87 (  5.59%)  HT: 56.73
VT: 52.39  R: 53.00  RT: 29.29 (363Kops/s)

on a i7 Q720 -based laptop.

The key of the patch is the observation that unorm_to_unorm's work can
more easily be done with a simple multiplication and shift, when the
function is applied repeatedly and the parameters are not compile-time
constants. For instance, converting from 0xfe to 0xfefe (expanding
from 8 bits to 16 bits) can be done by calculating

c = c * 0x101

However, sometimes the result is not a neat replication of all the
bits. For instance, going from 10 bits to 16 bits can be done by
calculating

c = c * 0x401UL >> 4

where the intermediate result is 20 bit wide repetition of the 10-bit
pattern followed by shifting off the unnecessary lowest bits.

The patch has the algorithm to calculate the factor and the shift, and
converts the code to use it.

12 years agoconfigure.ac: add iwmmxt2 configure flag
Matt Turner [Wed, 30 May 2012 20:44:04 +0000 (16:44 -0400)]
configure.ac: add iwmmxt2 configure flag

The flag allows the user to select whether pixman-mmx.c is compiled with
-march=iwmmxt or -march=iwmmxt2.

gcc has scheduling support for the Marvell CPU in the XO 1.75 when
building with -march=iwmmxt2.

12 years agoautotools: use custom build rule to build iwMMXt code
Matt Turner [Wed, 30 May 2012 20:26:32 +0000 (16:26 -0400)]
autotools: use custom build rule to build iwMMXt code

gcc has no sane way of enabling iwmmxt code generation, like -msse for
SSE, so you have to use -march=iwmmxt{,2}. User CFLAGS are placed after
-march=iwmmxt and override the march value, so we have to use a custom
build rule to order the CFLAGS such that pixman-mmx.c will be built with
the necessary CFLAGS.

12 years agoSpeed up _pixman_image_get_solid() in common cases
Søren Sandmann Pedersen [Tue, 3 May 2011 11:25:50 +0000 (07:25 -0400)]
Speed up _pixman_image_get_solid() in common cases

Make _pixman_image_get_solid() faster by special-casing the common
cases where the image is SOLID or a repeating a8r8g8b8 image.

This optimization together with the previous one results in a small
but reproducable performance improvement on the xfce4-terminal-a1
cairo trace:

[ # ]  backend                         test   min(s) median(s) stddev. count
Before:
[  0]    image            xfce4-terminal-a1    1.221    1.239   1.21%  100/100
After:
[  0]    image            xfce4-terminal-a1    1.170    1.199   1.26%  100/100

Either optimization by itself is difficult to separate from noise.

12 years agoSpeed up _pixman_composite_glyphs_no_mask()
Søren Sandmann Pedersen [Mon, 28 May 2012 06:36:22 +0000 (02:36 -0400)]
Speed up _pixman_composite_glyphs_no_mask()

Bypass much of the overhead of pixman_image_composite32() by only
computing the composite region once instead of once per glyph, and by
only looking up the composite function whenever the glyph format or
flags change.

As part of this, the pixman_compute_composite_region32() was renamed
to _pixman_compute_composite_region32() and exported in
pixman-private.h.

I couldn't find a trace that would reliably demonstrate that this is
actually an improvement by itself (since _pixman_composite_glyphs_no_mask()
is called so rarely), but together with the following optimization for
solid sources, there is a small but reliable improvement to the
xfce4-a1-terminal cairo trace.

12 years agoSpeed up pixman_composite_glyphs()
Søren Sandmann Pedersen [Mon, 28 May 2012 05:22:26 +0000 (01:22 -0400)]
Speed up pixman_composite_glyphs()

When adding glyphs to the mask, bypass most of the overhead of
pixman_image_composite32() by:

- Only looking up the composite function when the glyph changes either
  format or flags.

- Only using a white source when the glyph format is different from
  the mask format.

- Simply intersecting the glyph rectangle with the destination
  rectangle instead of doing the full _pixman_composite_region32().

Performance results:

[ # ]  backend                         test   min(s) median(s) stddev. count
Before:
[  0]    image            firefox-talos-gfx    6.570    6.577   0.13%    8/10
After:
[  0]    image            firefox-talos-gfx    4.272    4.289   0.28%   10/10

V2: Changes to deal with white sources

12 years agotest: Add glyph-test
Søren Sandmann Pedersen [Sun, 27 May 2012 22:23:20 +0000 (18:23 -0400)]
test: Add glyph-test

This test tests the new glyph cache and compositing API. Much of this
test is intending to making sure that clipping and alpha map handling
survive any optimizations that may be added to the glyph compositing.

V2: Evaluating lcg_rand_n() multiple times in an argument list lead
    to undefined behavior.

12 years agoAdd support for alpha maps to compute_crc32_for_image().
Søren Sandmann Pedersen [Mon, 28 May 2012 20:14:12 +0000 (16:14 -0400)]
Add support for alpha maps to compute_crc32_for_image().

When a destination image I has an alpha map A, the following rules apply:

   - If I has an alpha channel itself, the content of that channel is
     undefined

   - If A has RGB channels, the content of those channels is
     undefined.

Hence in order to compute the CRC32 for such an image, we have to mask
off the alpha channel of the image, and the RGB channels of the alpha
map.

V2: Shifting by 32 is undefined in C