Commit Graph

1635 Commits

Author SHA1 Message Date
Søren Sandmann Pedersen
27a9f0468b Merge remote branch 'ssvb/arm-fixes' 2010-03-23 11:00:04 -04:00
Siarhei Siamashka
3ef203331f ARM: SIMD optimizations moved to a separate .S file
This should be the last step in providing full armv4t compatibility
with CPU features runtime autodetection in pixman.
2010-03-22 21:56:17 +02:00
Siarhei Siamashka
0a0591c2f7 ARM: SIMD optimizations updated to use common assembly calling conventions 2010-03-22 20:17:14 +02:00
Siarhei Siamashka
c1e8d4533a ARM: Helper ARM NEON assembly binding macros moved into a separate header
This is needed for future reuse of the same macros for the other
ARM assembly optimizations (armv4t, armv6)
2010-03-22 18:51:54 +02:00
Siarhei Siamashka
5791026e45 ARM: Workaround for a NEON bug in assembler from binutils 2.18
The problem was reported as bug 25534 against pixman in
freedesktop.org bugzila. Link to a patch for binutils:
http://sourceware.org/ml/binutils/2008-03/msg00260.html

For pixman the impact is a build failure when using
binutils 2.18. Versions 2.19 and higer are fine. Still
some distros may be using older versions of binutils and
this is causing problems.

This patch workarounds the problem by replacing a problematic
"vmov a, b" instruction with equivalent "vorr a, b, b". Actually
they even map to the same instruction opcode in the generated
code, so the resulting binary is identical with and without patch.
2010-03-22 16:15:18 +02:00
Siarhei Siamashka
68d8d83223 ARM: Use '.object_arch' directive in NEON assembly file
This can be used to override the architecture recorded in the EABI object
attribute section. We set a minimum arch to 'armv4'. Binutils documentation
recommends to use this directive with the code performing runtime detection
of CPU features.

Additionally NEON/VFP EABI attributes are suppressed. And the instruction
set to use is explicitly set to '.arm'.

Configure test for NEON support is also updated to include a bunch of
these new directives (if any of these is unsupported by the assembler,
it is better to fail configure test than to fail library build).

All these changes are required to fix SIGILL problem on armv4t, reported in
http://lists.freedesktop.org/archives/pixman/2010-March/000123.html
2010-03-22 12:12:03 +02:00
Jon TURNEY
69f1ec9a78 Avoid a potential division-by-zero exeception in window-test
Avoid a division-by-zero exception if the first number returned by
rand() is a multiple of 500, causing us to create a zero width pixmap,
and then attempt to use get_rand(0) when generating a random stride...

Fixes https://bugs.freedesktop.org/attachment.cgi?id=34162
2010-03-17 20:25:25 -04:00
Søren Sandmann Pedersen
50713d9d0d Post-release version bump to 0.17.13 2010-03-17 15:12:06 -04:00
Søren Sandmann Pedersen
fb68d6c14d Pre-release version bump to 0.17.12 2010-03-17 13:46:44 -04:00
Søren Sandmann Pedersen
265ea1fb4d Specialize the fast_composite_scaled_nearest_* scalers to positive x units
This avoids a test in the inner loop, which improves performance
especially for tiled sources.

On x86-32, I get these results:

Before:
op=1, src_fmt=20028888, dst_fmt=20028888, speed=306.96 MPix/s (73.18 FPS)
op=1, src_fmt=20028888, dst_fmt=10020565, speed=102.67 MPix/s (24.48 FPS)
op=1, src_fmt=10020565, dst_fmt=10020565, speed=324.85 MPix/s (77.45 FPS)

After:
op=1, src_fmt=20028888, dst_fmt=20028888, speed=332.19 MPix/s (79.20 FPS)
op=1, src_fmt=20028888, dst_fmt=10020565, speed=110.41 MPix/s (26.32 FPS)
op=1, src_fmt=10020565, dst_fmt=10020565, speed=363.28 MPix/s (86.61 FPS)
2010-03-17 11:14:20 -04:00
Søren Sandmann Pedersen
9cd1051523 Add a FAST_PATH_X_UNIT_POSITIVE flag
This is the common case for a lot of transformed images. If the unit
were negative, the transformation would be a reflection which is
fairly rare.
2010-03-17 11:03:05 -04:00
Alexander Larsson
a5b51bb03c Use the right format for the OVER_8888_565 fast path 2010-03-17 11:03:05 -04:00
Alexander Larsson
3b92b711d0 Add specialized fast nearest scalers
This is a macroized version of SRC/OVER repeat normal/unneeded nearest
neighbour scaling instantiated for some common 8888 and 565 formats.

Based on work by Siarhei Siamashka
2010-03-17 11:03:05 -04:00
Alexander Larsson
5750408e48 Add FAST_PATH_SAMPLES_COVER_CLIP and FAST_PATH_16BIT_SAFE
FAST_PATH_SAMPLES_COVER_CLIP:

This is set of the source sample grid, unrepeated but transformed
completely completely covers the clip destination. If this is set
you can use a simple scaled that doesn't have to care about the repeat
mode.

FAST_PATH_16BIT_SAFE:

This signifies two things:
1) The size of the src/mask fits in a 16.16 fixed point, so something like:

    max_vx = src_image->bits.width << 16;

    Is allowed and is guaranteed to not overflow max_vx

2) When stepping the source space we're guaranteed to never overflow
   a 16.16 bit fix point variable, even if we step one extra step
   in the destination space. This means that a loop doing:

   x = vx >> 16;
   vx += unit_x;								   d = src_row[x];

   will never overflow vx causing x to be negative.

   And additionally, if you track vx like above and apply NORMAL repeat
   after the vx addition with something like:

   while (vx >= max_vx) vx -= max_vx;

   This will never overflow the vx even on the final increment that
   takes vx one past the end of where we will read, which makes the
   repeat loop safe.
2010-03-17 11:03:05 -04:00
Alexander Larsson
cba6fbbddc Add FAST_PATH_NO_NONE_REPEAT flag 2010-03-17 11:03:05 -04:00
Alexander Larsson
7ec023ede1 Add CONVERT_8888_TO_8888 and CONVERT_0565_TO_0565 macros
These are useful for macroization
2010-03-17 11:03:05 -04:00
Alexander Larsson
c903d03052 Add CONVERT_0565_TO_8888 macro
This lets us simplify some fast paths since we get a consistent
naming that always has 8888 and gets some value for alpha.
2010-03-17 11:03:05 -04:00
Søren Sandmann Pedersen
de27f45ddd Ensure that only the low 4 bit of 4 bit pixels are stored.
In some cases we end up trying to use the STORE_4 macro with an 8 bit
values, which resulted in other pixels getting overwritten. Fix this
by always masking off the low 4 bits.

This fixes blitters-test on big-endian machines.
2010-03-17 11:02:58 -04:00
Søren Sandmann Pedersen
6532f8488a Fix contact address in configure.ac 2010-03-16 14:58:18 -04:00
Søren Sandmann Pedersen
7c9f121efe Add PIXMAN_DEFINE_THREAD_LOCAL() and PIXMAN_GET_THREAD_LOCAL() macros
These macros hide the various types of thread local support. On Linux
and Unix, they expand to just __thread. On Microsoft Visual C++, they
expand to __declspec(thread).

On OS X and other systems that don't have __thread, they expand to a
complicated concoction that uses pthread_once() and
pthread_get/set_specific() to get thread local variables.
2010-03-16 14:58:12 -04:00
Søren Sandmann Pedersen
6b9c548200 Add checks for various types of thread local storage.
OS X does not support __thread, so we have to check for it before
using it.  It does however support pthread_get/setspecific(), so if we
don't have __thread, check if those are available.
2010-03-16 12:01:51 -04:00
Alan Coopersmith
313353f1fb Add Sun cc to thread-local support checks in pixman-compiler.h
Clears '#warning: "unknown compiler"' messages when building

Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
2010-03-15 15:20:23 -07:00
Alan Coopersmith
b67f784a5d Make .s target asm flag selection more portable
The previous code worked in GNU make, but caused a syntax error in Solaris
make ( https://bugs.freedesktop.org/show_bug.cgi?id=27062 ) - this seems to
work in both, and should hopefully not cause syntax errors in any versions
of make not supporting the macro-substitution-in-macro-name feature, just
cause the macro to expand to nothing.

Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
2010-03-15 10:52:20 -07:00
Søren Sandmann Pedersen
7a5dc74785 Fix typo: WORDS_BIG_ENDIAN => WORDS_BIGENDIAN in pixman-edge.c
Pointed out by Andreas Falkenhahn on the cairo mailing list.
2010-03-15 07:40:46 -04:00
Søren Sandmann Pedersen
ff30a5cbb9 test: Add support for indexed formats to blitters-test
These formats work fine, they just need to have a palette set.
2010-03-14 12:25:17 -04:00
Søren Sandmann Pedersen
2b5f7be6c0 pixman.h: Only define stdint types when PIXMAN_DONT_DEFINE_STDINT is undefined
In SPICE, with Microsoft Visual C++, pixman.h is included after
another file that defines these types, which causes warnings and
errors.

This patch allows such code to just define PIXMAN_DONT_DEFINE_STDINT
to use its own version of those types.
2010-03-14 12:24:50 -04:00
Søren Sandmann Pedersen
f4da05c9f9 Merge branch 'operator-table' 2010-03-14 12:12:05 -04:00
Søren Sandmann Pedersen
a12d868df8 Merge branch 'fast-path-cache' 2010-03-14 12:12:00 -04:00
Søren Sandmann Pedersen
f534509d00 Change operator table to be an array of arrays of four bytes.
This makes gcc generate slightly better code for optimize_operator.
2010-03-14 12:11:48 -04:00
Søren Sandmann Pedersen
94d75ebd21 Strength reduce certain conjoint/disjoint to their normal counterparts.
This allows us to not test for them later on.
2010-03-14 12:11:47 -04:00
Søren Sandmann Pedersen
58be9c71d2 Store the operator table more compactly.
The four cases for each operator:

    none-are-opaque, src-is-opaque, dest-is-opaque, both-are-opaque

are packed into one uint32_t per operator. The relevant strength
reduced operator can then be found by packing the source-is-opaque and
dest-is-opaque into two bits and shifting that number of bytes.

Chris Wilson pointed out a bug in the original version of this commit:
dest_is_opaque and source_is_opaque were used as booleans, but their
actual values were the results of a logical AND with the
FAST_PATH_OPAQUE flag, so the shift value was wildly wrong.

The only reason it actually passed the test suite (on x86) was that
the compiler computed the shift amount in the cl register, and the low
byte of FAST_PATH_OPAQUE happens to be 0, so no shifting actually took
place, and the original operator was returned.
2010-03-14 12:11:47 -04:00
Søren Sandmann Pedersen
7fe35f0e6b Make the operator strength reduction constant time.
By extending the operator information table to cover all operators we
can replace the loop with a table look-up. At the same time, base the
operator optimization on the computed flags rather than the ones in
the image struct.

Finally, as an extra optimization, we no longer ignore the case where
there is a mask. Instead we consider the source opaque if both source
and mask are opaque, or if the source is opaque and the mask is
missing.
2010-03-14 12:11:47 -04:00
Loïc Minier
18f0de452d ARM: SIMD: Try without any CFLAGS before forcing -mcpu=
http://bugs.launchpad.net/bugs/535183
2010-03-14 13:15:34 +02:00
Egor Starkov
9335408613 Eliminate trailing comma in enum
https://bugs.freedesktop.org/show_bug.cgi?id=27050

Pixman is not compiling with c++ compiler. During compilation it gives
the following error:

/usr/include/pixman-1/pixman.h:335: error: comma at end of enumerator list

Signed-off-by: Søren Sandmann Pedersen <ssp@redhat.com>
2010-03-12 10:50:18 -05:00
Søren Sandmann Pedersen
54e39e0038 Add a fast path cache
This patch adds a cache in front of the fast path tables to reduce the
overhead of pixman_composite(). It is fixed size with move-to-front to
make sure the most popular fast paths are at the beginning of the cache.

The cache is thread local to avoid locking.
2010-03-06 11:58:02 -05:00
Søren Sandmann Pedersen
84b009ae9f Post-release version bump to 0.17.11 2010-03-05 20:40:41 -05:00
Søren Sandmann Pedersen
14fd287efb Pre-release version bump to 0.17.10 2010-03-05 20:06:08 -05:00
Søren Sandmann Pedersen
bd9934551f Move __force_align_arg_pointer workaround before composite32()
Since otherwise the workaround won't take effect when you call
pixman_image_composite32() directly.
2010-03-04 04:15:44 -05:00
Søren Sandmann Pedersen
14bb054d96 Merge branch 'more-flags' 2010-03-04 02:30:22 -05:00
Søren Sandmann Pedersen
9a8e404d44 test: Remove obsolete comment 2010-03-03 13:37:20 -05:00
Siarhei Siamashka
182e4c2635 ARM: added 'neon_composite_over_reverse_n_8888' fast path
This fast path function improves performance of 'poppler' cairo-perf trace.

Benchmark from ARM Cortex-A8 @720MHz

before:

[ # ]  backend                         test   min(s) median(s) stddev. count
[  0]    image                      poppler   38.986   39.158   0.23%    6/6

after:

[ # ]  backend                         test   min(s) median(s) stddev. count
[  0]    image                      poppler   24.981   25.136   0.28%    6/6
2010-03-03 19:43:00 +02:00
Siarhei Siamashka
072a7d31a8 ARM: added 'neon_composite_src_x888_8888' fast path
This fast path function improves performance of 'gnome-system-monitor'
cairo-perf trace.

Benchmark from ARM Cortex-A8 @720MHz

before:

[ # ]  backend                         test   min(s) median(s) stddev. count
[  0]    image         gnome-system-monitor   68.838   68.899   0.05%    5/6

after:

[ # ]  backend                         test   min(s) median(s) stddev. count
[  0]    image         gnome-system-monitor   53.336   53.384   0.09%    6/6
2010-03-03 19:42:34 +02:00
Siarhei Siamashka
2ed7c13922 ARM: added 'neon_composite_over_n_8888_8888_ca' fast path
This fast path function improves performance of 'firefox-talos-gfx'
cairo-perf trace.

Benchmark from ARM Cortex-A8 @720MHz

before:

[ # ]  backend                         test   min(s) median(s) stddev. count
[  0]    image            firefox-talos-gfx  139.969  141.176   0.35%    6/6

after:

[ # ]  backend                         test   min(s) median(s) stddev. count
[  0]    image            firefox-talos-gfx  111.810  112.196   0.23%    6/6
2010-03-03 19:42:29 +02:00
Søren Sandmann Pedersen
3db76b9004 Restructure the flags computation in compute_image_info().
Restructure the code to use switches instead of ifs. This saves a few
comparisons and make the code slightly easier to follow. Also add some
comments.
2010-02-24 23:23:52 -05:00
Søren Sandmann Pedersen
ac44db3340 Move workaround code to pixman-image.c
It is more natural to put it where all the other flags are computed.
2010-02-24 23:20:28 -05:00
Søren Sandmann Pedersen
35af45d5e3 Turn need_workaround into another flag.
Instead of storing it as a boolean in the image struct, just use
another flag for it.
2010-02-24 23:20:28 -05:00
Søren Sandmann Pedersen
f27f17ce22 Eliminate _pixman_image_is_opaque() in favor of a new FAST_PATH_IS_OPAQUE flag
The new FAST_PATH_IS_OPAQUE flag is computed along with the others in
_pixman_image_validate().
2010-02-24 23:20:27 -05:00
Søren Sandmann Pedersen
2a6ba862ab Eliminate _pixman_image_is_solid()
Instead of calling this function in compute_image_info(), just do the
relevant checks when the extended format is computed.

Move computation of solidness to validate
2010-02-24 23:20:27 -05:00
Søren Sandmann Pedersen
45006e5e64 Move computation of extended format code to validate.
Instead of computing the extended format on every composite, just
compute it once and store it in the image.
2010-02-24 23:20:27 -05:00
Søren Sandmann Pedersen
fb0096a282 Add new FAST_PATH_SIMPLE_REPEAT flag
This flags indicates that the image is untransformed an
repeating. Such images can be composited quickly by simply repeating
the composite operation.
2010-02-24 23:20:27 -05:00