From 4af92512ba4b72b3d901b571c2b5004b7e999537 Mon Sep 17 00:00:00 2001 From: Stanislav Brabec <utx@penguin.cz> Date: Wed, 10 Feb 2010 23:24:13 +0000 Subject: libx11: Apply keysymdef_include.patch referring to target staging only for libx11 and not for libx11-native. --- recipes/xorg-lib/libx11_1.3.3.bb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'recipes/xorg-lib') diff --git a/recipes/xorg-lib/libx11_1.3.3.bb b/recipes/xorg-lib/libx11_1.3.3.bb index e70716a96d..f6ea1411ef 100644 --- a/recipes/xorg-lib/libx11_1.3.3.bb +++ b/recipes/xorg-lib/libx11_1.3.3.bb @@ -5,15 +5,16 @@ DEPENDS += "bigreqsproto xproto xextproto xtrans libxau xcmiscproto \ libxdmcp xf86bigfontproto kbproto inputproto xproto-native" PROVIDES = "virtual/libx11" PE = "1" -PR = "r6" +PR = "r7" XORG_PN = "libX11" SRC_URI += "file://x11_disable_makekeys.patch;patch=1 \ file://dolt-fix.patch;patch=1 \ - file://keysymdef_include.patch;patch=1 \ + ${@['file://keysymdef_include.patch;patch=1', ''][(bb.data.inherits_class('native', d))]} \ " +# --with-keysymdef has intentionally no effect in native build without without keysymdef_include.patch EXTRA_OECONF += "--without-xcb --with-keysymdef=${STAGING_INCDIR}/X11/keysymdef.h" do_compile() { -- cgit v1.2.3 From 739481bea0235ed50d67e9e99bf5a54b0e2be6c9 Mon Sep 17 00:00:00 2001 From: Martin Jansa <Martin.Jansa@gmail.com> Date: Wed, 10 Feb 2010 10:45:29 +0100 Subject: xorg: add name=archive to SRC_URI in include files Signed-off-by: Martin Jansa <Martin.Jansa@gmail.com> --- recipes/xorg-lib/xorg-lib-common.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'recipes/xorg-lib') diff --git a/recipes/xorg-lib/xorg-lib-common.inc b/recipes/xorg-lib/xorg-lib-common.inc index 130f8d1755..942a247b40 100644 --- a/recipes/xorg-lib/xorg-lib-common.inc +++ b/recipes/xorg-lib/xorg-lib-common.inc @@ -5,7 +5,7 @@ DEPENDS = "util-macros xorg-headers-native" XORG_PN = "${PN}" -SRC_URI = "${XORG_MIRROR}/individual/lib/${XORG_PN}-${PV}.tar.bz2" +SRC_URI = "${XORG_MIRROR}/individual/lib/${XORG_PN}-${PV}.tar.bz2;name=archive" S = "${WORKDIR}/${XORG_PN}-${PV}" -- cgit v1.2.3 From d939799c871d4279423841c149980fd1d61b5c7a Mon Sep 17 00:00:00 2001 From: Martin Jansa <Martin.Jansa@gmail.com> Date: Thu, 18 Feb 2010 14:25:17 +0100 Subject: pixman: add 0.17.6 with positive D_P only for shr now * There is issue with circular dependency in tests/ directory which pulls whole GTK_LIBS and staging/armv4t-oe-linux-gnueabi/usr/lib/libcairo.la staging/armv4t-oe-linux-gnueabi/usr/lib/libpangocairo-1.0.la are pulling staging/armv4t-oe-linux-gnueabi/usr/lib/libpixman.la which is not available while building it Signed-off-by: Martin Jansa <Martin.Jansa@gmail.com> --- ...Dropped-delegation-support-for-pixman_blt.patch | 356 +++++++++++++++++++++ ...0002-Test-program-for-pixman_blt-function.patch | 178 +++++++++++ ...mplementation-of-pixman_blt-with-overlapp.patch | 114 +++++++ ...of-overlapping-src-dst-for-pixman_blt_mmx.patch | 91 ++++++ ...f-overlapping-src-dst-for-pixman_blt_sse2.patch | 91 ++++++ ...f-overlapping-src-dst-for-pixman_blt_neon.patch | 94 ++++++ recipes/xorg-lib/pixman_0.17.6.bb | 30 ++ 7 files changed, 954 insertions(+) create mode 100644 recipes/xorg-lib/pixman-0.17.6/0001-Dropped-delegation-support-for-pixman_blt.patch create mode 100644 recipes/xorg-lib/pixman-0.17.6/0002-Test-program-for-pixman_blt-function.patch create mode 100644 recipes/xorg-lib/pixman-0.17.6/0003-Generic-C-implementation-of-pixman_blt-with-overlapp.patch create mode 100644 recipes/xorg-lib/pixman-0.17.6/0004-Support-of-overlapping-src-dst-for-pixman_blt_mmx.patch create mode 100644 recipes/xorg-lib/pixman-0.17.6/0005-Support-of-overlapping-src-dst-for-pixman_blt_sse2.patch create mode 100644 recipes/xorg-lib/pixman-0.17.6/0006-Support-of-overlapping-src-dst-for-pixman_blt_neon.patch create mode 100644 recipes/xorg-lib/pixman_0.17.6.bb (limited to 'recipes/xorg-lib') diff --git a/recipes/xorg-lib/pixman-0.17.6/0001-Dropped-delegation-support-for-pixman_blt.patch b/recipes/xorg-lib/pixman-0.17.6/0001-Dropped-delegation-support-for-pixman_blt.patch new file mode 100644 index 0000000000..d52ee354dd --- /dev/null +++ b/recipes/xorg-lib/pixman-0.17.6/0001-Dropped-delegation-support-for-pixman_blt.patch @@ -0,0 +1,356 @@ +From c4ce33821e2340ff95e30fce5758013287172d52 Mon Sep 17 00:00:00 2001 +From: Siarhei Siamashka <siarhei.siamashka@nokia.com> +Date: Wed, 21 Oct 2009 23:48:43 +0000 +Subject: Dropped delegation support for 'pixman_blt' + +Function 'pixman_blt' is too simple and hardly needs any +delegation. This reduces call overhead somewhat. The saving +is minor, but every little bit helps. +--- +diff --git a/pixman/pixman-arm-neon.c b/pixman/pixman-arm-neon.c +index efeabeb..c8c5579 100644 +--- a/pixman/pixman-arm-neon.c ++++ b/pixman/pixman-arm-neon.c +@@ -470,35 +470,6 @@ arm_neon_composite (pixman_implementation_t *imp, + } + + static pixman_bool_t +-arm_neon_blt (pixman_implementation_t *imp, +- uint32_t * src_bits, +- uint32_t * dst_bits, +- int src_stride, +- int dst_stride, +- int src_bpp, +- int dst_bpp, +- int src_x, +- int src_y, +- int dst_x, +- int dst_y, +- int width, +- int height) +-{ +- if (!pixman_blt_neon ( +- src_bits, dst_bits, src_stride, dst_stride, src_bpp, dst_bpp, +- src_x, src_y, dst_x, dst_y, width, height)) +- +- { +- return _pixman_implementation_blt ( +- imp->delegate, +- src_bits, dst_bits, src_stride, dst_stride, src_bpp, dst_bpp, +- src_x, src_y, dst_x, dst_y, width, height); +- } +- +- return TRUE; +-} +- +-static pixman_bool_t + arm_neon_fill (pixman_implementation_t *imp, + uint32_t * bits, + int stride, +@@ -556,7 +527,7 @@ _pixman_implementation_create_arm_neon (void) + imp->combine_32[PIXMAN_OP_ADD] = neon_combine_add_u; + + imp->composite = arm_neon_composite; +- imp->blt = arm_neon_blt; ++ imp->blt = pixman_blt_neon; + imp->fill = arm_neon_fill; + + return imp; +diff --git a/pixman/pixman-arm-simd.c b/pixman/pixman-arm-simd.c +index 4795246..11c5f1b 100644 +--- a/pixman/pixman-arm-simd.c ++++ b/pixman/pixman-arm-simd.c +@@ -480,6 +480,7 @@ _pixman_implementation_create_arm_simd (void) + pixman_implementation_t *imp = _pixman_implementation_create (general); + + imp->composite = arm_simd_composite; ++ imp->blt = general->blt; + + return imp; + } +diff --git a/pixman/pixman-fast-path.c b/pixman/pixman-fast-path.c +index 75a0c1e..8da6b1f 100644 +--- a/pixman/pixman-fast-path.c ++++ b/pixman/pixman-fast-path.c +@@ -1690,6 +1690,7 @@ _pixman_implementation_create_fast_path (void) + pixman_implementation_t *imp = _pixman_implementation_create (general); + + imp->composite = fast_path_composite; ++ imp->blt = general->blt; + imp->fill = fast_path_fill; + + return imp; +diff --git a/pixman/pixman-general.c b/pixman/pixman-general.c +index c96a3f9..c3f96f9 100644 +--- a/pixman/pixman-general.c ++++ b/pixman/pixman-general.c +@@ -286,8 +286,7 @@ general_composite (pixman_implementation_t * imp, + } + + static pixman_bool_t +-general_blt (pixman_implementation_t *imp, +- uint32_t * src_bits, ++general_blt (uint32_t * src_bits, + uint32_t * dst_bits, + int src_stride, + int dst_stride, +diff --git a/pixman/pixman-implementation.c b/pixman/pixman-implementation.c +index 6488332..0520e36 100644 +--- a/pixman/pixman-implementation.c ++++ b/pixman/pixman-implementation.c +@@ -100,27 +100,6 @@ delegate_combine_64_ca (pixman_implementation_t * imp, + } + + static pixman_bool_t +-delegate_blt (pixman_implementation_t * imp, +- uint32_t * src_bits, +- uint32_t * dst_bits, +- int src_stride, +- int dst_stride, +- int src_bpp, +- int dst_bpp, +- int src_x, +- int src_y, +- int dst_x, +- int dst_y, +- int width, +- int height) +-{ +- return _pixman_implementation_blt ( +- imp->delegate, src_bits, dst_bits, src_stride, dst_stride, +- src_bpp, dst_bpp, src_x, src_y, dst_x, dst_y, +- width, height); +-} +- +-static pixman_bool_t + delegate_fill (pixman_implementation_t *imp, + uint32_t * bits, + int stride, +@@ -153,7 +132,7 @@ _pixman_implementation_create (pixman_implementation_t *delegate) + /* Fill out function pointers with ones that just delegate + */ + imp->composite = delegate_composite; +- imp->blt = delegate_blt; ++ imp->blt = NULL; + imp->fill = delegate_fill; + + for (i = 0; i < PIXMAN_N_OPERATORS; ++i) +@@ -233,26 +212,6 @@ _pixman_implementation_composite (pixman_implementation_t * imp, + } + + pixman_bool_t +-_pixman_implementation_blt (pixman_implementation_t * imp, +- uint32_t * src_bits, +- uint32_t * dst_bits, +- int src_stride, +- int dst_stride, +- int src_bpp, +- int dst_bpp, +- int src_x, +- int src_y, +- int dst_x, +- int dst_y, +- int width, +- int height) +-{ +- return (*imp->blt) (imp, src_bits, dst_bits, src_stride, dst_stride, +- src_bpp, dst_bpp, src_x, src_y, dst_x, dst_y, +- width, height); +-} +- +-pixman_bool_t + _pixman_implementation_fill (pixman_implementation_t *imp, + uint32_t * bits, + int stride, +diff --git a/pixman/pixman-mmx.c b/pixman/pixman-mmx.c +index b1591d9..a3080b6 100644 +--- a/pixman/pixman-mmx.c ++++ b/pixman/pixman-mmx.c +@@ -3318,35 +3318,6 @@ mmx_composite (pixman_implementation_t *imp, + } + + static pixman_bool_t +-mmx_blt (pixman_implementation_t *imp, +- uint32_t * src_bits, +- uint32_t * dst_bits, +- int src_stride, +- int dst_stride, +- int src_bpp, +- int dst_bpp, +- int src_x, +- int src_y, +- int dst_x, +- int dst_y, +- int width, +- int height) +-{ +- if (!pixman_blt_mmx ( +- src_bits, dst_bits, src_stride, dst_stride, src_bpp, dst_bpp, +- src_x, src_y, dst_x, dst_y, width, height)) +- +- { +- return _pixman_implementation_blt ( +- imp->delegate, +- src_bits, dst_bits, src_stride, dst_stride, src_bpp, dst_bpp, +- src_x, src_y, dst_x, dst_y, width, height); +- } +- +- return TRUE; +-} +- +-static pixman_bool_t + mmx_fill (pixman_implementation_t *imp, + uint32_t * bits, + int stride, +@@ -3397,7 +3368,7 @@ _pixman_implementation_create_mmx (void) + imp->combine_32_ca[PIXMAN_OP_ADD] = mmx_combine_add_ca; + + imp->composite = mmx_composite; +- imp->blt = mmx_blt; ++ imp->blt = pixman_blt_mmx; + imp->fill = mmx_fill; + + return imp; +diff --git a/pixman/pixman-private.h b/pixman/pixman-private.h +index c99f2a2..209cba4 100644 +--- a/pixman/pixman-private.h ++++ b/pixman/pixman-private.h +@@ -399,8 +399,7 @@ typedef void (*pixman_composite_func_t) (pixman_implementation_t *imp, + int32_t dest_y, + int32_t width, + int32_t height); +-typedef pixman_bool_t (*pixman_blt_func_t) (pixman_implementation_t *imp, +- uint32_t * src_bits, ++typedef pixman_bool_t (*pixman_blt_func_t) (uint32_t * src_bits, + uint32_t * dst_bits, + int src_stride, + int dst_stride, +diff --git a/pixman/pixman-sse2.c b/pixman/pixman-sse2.c +index 1f8aa6e..8c2e114 100644 +--- a/pixman/pixman-sse2.c ++++ b/pixman/pixman-sse2.c +@@ -5893,8 +5893,7 @@ sse2_composite (pixman_implementation_t *imp, + __attribute__((__force_align_arg_pointer__)) + #endif + static pixman_bool_t +-sse2_blt (pixman_implementation_t *imp, +- uint32_t * src_bits, ++sse2_blt (uint32_t * src_bits, + uint32_t * dst_bits, + int src_stride, + int dst_stride, +@@ -5907,18 +5906,9 @@ sse2_blt (pixman_implementation_t *imp, + int width, + int height) + { +- if (!pixman_blt_sse2 ( ++ return pixman_blt_sse2 ( + src_bits, dst_bits, src_stride, dst_stride, src_bpp, dst_bpp, +- src_x, src_y, dst_x, dst_y, width, height)) +- +- { +- return _pixman_implementation_blt ( +- imp->delegate, +- src_bits, dst_bits, src_stride, dst_stride, src_bpp, dst_bpp, +- src_x, src_y, dst_x, dst_y, width, height); +- } +- +- return TRUE; ++ src_x, src_y, dst_x, dst_y, width, height); + } + + #if defined(__GNUC__) && !defined(__x86_64__) && !defined(__amd64__) +diff --git a/pixman/pixman-vmx.c b/pixman/pixman-vmx.c +index 06325a7..e31bcb3 100644 +--- a/pixman/pixman-vmx.c ++++ b/pixman/pixman-vmx.c +@@ -1615,6 +1615,8 @@ _pixman_implementation_create_vmx (void) + + /* Set up function pointers */ + ++ imp->blt = fast->blt; ++ + imp->combine_32[PIXMAN_OP_OVER] = vmx_combine_over_u; + imp->combine_32[PIXMAN_OP_OVER_REVERSE] = vmx_combine_over_reverse_u; + imp->combine_32[PIXMAN_OP_IN] = vmx_combine_in_u; +diff --git a/pixman/pixman.c b/pixman/pixman.c +index 0edd967..07ad767 100644 +--- a/pixman/pixman.c ++++ b/pixman/pixman.c +@@ -57,6 +57,22 @@ static const optimized_operator_info_t optimized_operators[] = + + static pixman_implementation_t *imp; + ++static pixman_bool_t ++pixman_blt_stub (uint32_t *src_bits, ++ uint32_t *dst_bits, ++ int src_stride, ++ int dst_stride, ++ int src_bpp, ++ int dst_bpp, ++ int src_x, ++ int src_y, ++ int dst_x, ++ int dst_y, ++ int width, ++ int height); ++ ++static pixman_blt_func_t pixman_blt_imp = pixman_blt_stub; ++ + /* + * Check if the current operator could be optimized + */ +@@ -216,6 +232,31 @@ pixman_image_composite (pixman_op_t op, + unapply_workaround (dest, dest_bits, dest_dx, dest_dy); + } + ++static pixman_bool_t ++pixman_blt_stub (uint32_t *src_bits, ++ uint32_t *dst_bits, ++ int src_stride, ++ int dst_stride, ++ int src_bpp, ++ int dst_bpp, ++ int src_x, ++ int src_y, ++ int dst_x, ++ int dst_y, ++ int width, ++ int height) ++{ ++ if (!imp) ++ imp = _pixman_choose_implementation (); ++ ++ pixman_blt_imp = imp->blt; ++ return pixman_blt_imp (src_bits, dst_bits, src_stride, dst_stride, ++ src_bpp, dst_bpp, ++ src_x, src_y, ++ dst_x, dst_y, ++ width, height); ++} ++ + PIXMAN_EXPORT pixman_bool_t + pixman_blt (uint32_t *src_bits, + uint32_t *dst_bits, +@@ -230,14 +271,11 @@ pixman_blt (uint32_t *src_bits, + int width, + int height) + { +- if (!imp) +- imp = _pixman_choose_implementation (); +- +- return _pixman_implementation_blt (imp, src_bits, dst_bits, src_stride, dst_stride, +- src_bpp, dst_bpp, +- src_x, src_y, +- dst_x, dst_y, +- width, height); ++ return pixman_blt_imp (src_bits, dst_bits, src_stride, dst_stride, ++ src_bpp, dst_bpp, ++ src_x, src_y, ++ dst_x, dst_y, ++ width, height); + } + + PIXMAN_EXPORT pixman_bool_t +-- +cgit v0.8.3-6-g21f6 diff --git a/recipes/xorg-lib/pixman-0.17.6/0002-Test-program-for-pixman_blt-function.patch b/recipes/xorg-lib/pixman-0.17.6/0002-Test-program-for-pixman_blt-function.patch new file mode 100644 index 0000000000..ba62b88447 --- /dev/null +++ b/recipes/xorg-lib/pixman-0.17.6/0002-Test-program-for-pixman_blt-function.patch @@ -0,0 +1,178 @@ +From 364406e03f9651aacb1bc684de6c00a27f9df66d Mon Sep 17 00:00:00 2001 +From: Siarhei Siamashka <siarhei.siamashka@nokia.com> +Date: Mon, 19 Oct 2009 20:32:55 +0300 +Subject: [PATCH 2/6] Test program for pixman_blt function + +It can do some basic correctness tests and also check whether +overlapping of source and destination images is supported. +--- + test/Makefile.am | 2 + + test/overlapped-blt-test.c | 136 ++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 138 insertions(+), 0 deletions(-) + create mode 100644 test/overlapped-blt-test.c + +diff --git a/test/Makefile.am b/test/Makefile.am +index 89d32e9..40c305f 100644 +--- a/test/Makefile.am ++++ b/test/Makefile.am +@@ -6,6 +6,7 @@ + fetch-test \ + oob-test \ + window-test \ ++ overlapped-blt-test \ + trap-crasher \ + alphamap \ + blitters-test \ +@@ -18,6 +19,7 @@ + trap_crasher_LDADD = $(TEST_LDADD) + oob_test_LDADD = $(TEST_LDADD) + window_test_LDADD = $(TEST_LDADD) ++overlapped_blt_test_LDADD = $(TEST_LDADD) + + blitters_test_LDADD = $(TEST_LDADD) + blitters_test_SOURCES = blitters-test.c utils.c utils.h +diff --git a/test/overlapped-blt-test.c b/test/overlapped-blt-test.c +new file mode 100644 +index 0000000..95fbc54 +--- /dev/null ++++ b/test/overlapped-blt-test.c +@@ -0,0 +1,136 @@ ++/* ++ * A small test program which can check whether pixman_blt function ++ * can support overlapping of source and destination images. ++ * Efficient blit with overlapping is useful for scrolling. ++ */ ++ ++#include <stdint.h> ++#include <stdio.h> ++#include <stdlib.h> ++#include <string.h> ++#include "pixman.h" ++ ++/* reference implementation (slow) */ ++static void ++trivial_copy8_2d ( ++ uint8_t *dst, int dst_stride, ++ uint8_t *src, int src_stride, ++ int dx, int dy, int sx, int sy, ++ int w, int h) ++{ ++ int x, y; ++ uint8_t *tmp = malloc (src_stride * (sy + h)); ++ memcpy (tmp, src, src_stride * (sy + h)); ++ for (y = 0; y < h; y++) ++ { ++ for (x = 0; x < w; x++) ++ { ++ *(dst + (dy + y) * dst_stride + dx + x) = ++ *(tmp + (sy + y) * src_stride + sx + x); ++ } ++ } ++ free (tmp); ++} ++ ++static void ++trivial_copy_2d ( ++ uint8_t *dst, int dst_stride, ++ uint8_t *src, int src_stride, ++ int dx, int dy, int sx, int sy, ++ int w, int h, int bpp) ++{ ++ trivial_copy8_2d (dst, dst_stride, src, src_stride, ++ dx * (bpp / 8), dy, sx * (bpp / 8), sy, w * (bpp / 8), h); ++} ++ ++/* now the test itself */ ++ ++#define ST_UNSUPPORTED 1 ++#define ST_NORMAL_BUG 2 ++#define ST_OVERLAPPED_BUG 4 ++ ++#define MAX_SIZE_X 64 ++#define MAX_SIZE_Y 64 ++ ++static void print_result(int bpp, int flags) ++{ ++ printf("bpp=%d, supported=%d, normal_ok=%d, overlapped_ok=%d\n", ++ bpp, ++ !(flags & ST_UNSUPPORTED), ++ !(flags & ST_NORMAL_BUG), ++ !(flags & ST_OVERLAPPED_BUG)); ++} ++ ++int main() ++{ ++ int c = 100000, r; ++ int bpp_st[33] = {0}; ++ srand(0); ++ while (c-- > 0) ++ { ++ uint8_t *src1, *src2, *src3; ++ int i; ++ int sizex = rand() % MAX_SIZE_X + 1; ++ int sizey = rand() % MAX_SIZE_Y + 1; ++ int sx = rand() % sizex; ++ int sy = rand() % sizey; ++ int dx = rand() % sizex; ++ int dy = rand() % sizey; ++ int w = rand() % sizex; ++ int h = rand() % sizex; ++ int bpp = 8 * (1 << (rand() % 3)); ++ int stride_delta = rand() % 8; ++ int bufsize; ++ if ((sizex + stride_delta) % 4) ++ stride_delta += 4 - ((sizex + stride_delta) % 4); ++ bufsize = (sizex + stride_delta) * sizey * bpp / 8; ++ src1 = malloc (bufsize); ++ src2 = malloc (bufsize); ++ src3 = malloc (bufsize); ++ for (i = 0; i < bufsize; i++) ++ src1[i] = rand(); ++ memcpy (src2, src1, bufsize); ++ memcpy (src3, src1, bufsize); ++ if (sx + w > sizex) ++ w = sizex - sx; ++ if (dx + w > sizex) ++ w = sizex - dx; ++ if (sy + h > sizey) ++ h = sizey - sy; ++ if (dy + h > sizey) ++ h = sizey - dy; ++ /* get reference result */ ++ trivial_copy_2d (src1, (sizex + stride_delta) * bpp / 8, ++ src1, (sizex + stride_delta) * bpp / 8, ++ dx, dy, sx, sy, w, h, bpp); ++ /* check nonoverlapped pixman result */ ++ r = pixman_blt ((uint32_t *)src3, (uint32_t *)src2, ++ (sizex + stride_delta) * bpp / 8 / 4, ++ (sizex + stride_delta) * bpp / 8 / 4, ++ bpp, bpp, sx, sy, dx, dy, w, h); ++ if (!r) ++ bpp_st[bpp] |= ST_UNSUPPORTED; ++ if (memcmp (src1, src2, bufsize) != 0) ++ bpp_st[bpp] |= ST_NORMAL_BUG; ++ /* check overlapped pixman result */ ++ r = pixman_blt ((uint32_t *)src3, (uint32_t *)src3, ++ (sizex + stride_delta) * bpp / 8 / 4, ++ (sizex + stride_delta) * bpp / 8 / 4, ++ bpp, bpp, sx, sy, dx, dy, w, h); ++ if (!r) ++ bpp_st[bpp] |= ST_UNSUPPORTED; ++ if (memcmp (src1, src3, bufsize) != 0) ++ bpp_st[bpp] |= ST_OVERLAPPED_BUG; ++ /* free buffers */ ++ free (src1); ++ free (src2); ++ free (src3); ++ } ++ ++ /* report results */ ++ print_result (8, bpp_st[8]); ++ print_result (16, bpp_st[16]); ++ print_result (32, bpp_st[32]); ++ ++ return 0; ++} +-- +1.6.2.4 + diff --git a/recipes/xorg-lib/pixman-0.17.6/0003-Generic-C-implementation-of-pixman_blt-with-overlapp.patch b/recipes/xorg-lib/pixman-0.17.6/0003-Generic-C-implementation-of-pixman_blt-with-overlapp.patch new file mode 100644 index 0000000000..25ce7ee3b8 --- /dev/null +++ b/recipes/xorg-lib/pixman-0.17.6/0003-Generic-C-implementation-of-pixman_blt-with-overlapp.patch @@ -0,0 +1,114 @@ +From c29c9fa826b7112156fd6150b5f1564227935c05 Mon Sep 17 00:00:00 2001 +From: Siarhei Siamashka <siarhei.siamashka@nokia.com> +Date: Thu, 22 Oct 2009 05:27:33 +0300 +Subject: [PATCH 3/6] Generic C implementation of pixman_blt with overlapping support + +Uses memcpy/memmove functions to copy pixels, can handle the +case when both source and destination areas are in the same +image (this is useful for scrolling). + +It is assumed that copying direction is only important when +using the same image for both source and destination (and +src_stride == dst_stride). Copying direction is undefined +for the images with different source and destination stride +which happen to be in the overlapped areas (but this is an +unrealistic case anyway). +--- + pixman/pixman-general.c | 21 ++++++++++++++++++--- + pixman/pixman-private.h | 43 +++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 61 insertions(+), 3 deletions(-) + +diff --git a/pixman/pixman-general.c b/pixman/pixman-general.c +index c96a3f9..d71a299 100644 +--- a/pixman/pixman-general.c ++++ b/pixman/pixman-general.c +@@ -300,9 +300,24 @@ general_blt (pixman_implementation_t *imp, + int width, + int height) + { +- /* We can't blit unless we have sse2 or mmx */ +- +- return FALSE; ++ uint8_t *dst_bytes = (uint8_t *)dst_bits; ++ uint8_t *src_bytes = (uint8_t *)src_bits; ++ int bpp; ++ ++ if (src_bpp != dst_bpp || src_bpp & 7) ++ return FALSE; ++ ++ bpp = src_bpp >> 3; ++ width *= bpp; ++ src_stride *= 4; ++ dst_stride *= 4; ++ pixman_blt_helper (src_bytes + src_y * src_stride + src_x * bpp, ++ dst_bytes + dst_y * dst_stride + dst_x * bpp, ++ src_stride, ++ dst_stride, ++ width, ++ height); ++ return TRUE; + } + + static pixman_bool_t +diff --git a/pixman/pixman-private.h b/pixman/pixman-private.h +index 5000f91..8c5d4fd 100644 +--- a/pixman/pixman-private.h ++++ b/pixman/pixman-private.h +@@ -10,6 +10,7 @@ + + #include "pixman.h" + #include <time.h> ++#include <string.h> + #include <assert.h> + + #include "pixman-compiler.h" +@@ -794,4 +795,46 @@ void pixman_timer_register (pixman_timer_t *timer); + + #endif /* PIXMAN_TIMERS */ + ++/* a helper function, can blit 8-bit images with src/dst overlapping support */ ++static inline void ++pixman_blt_helper (uint8_t *src_bytes, ++ uint8_t *dst_bytes, ++ int src_stride, ++ int dst_stride, ++ int width, ++ int height) ++{ ++ /* ++ * The second part of this check is not strictly needed, but it prevents ++ * unnecessary upside-down processing of areas which belong to different ++ * images. Upside-down processing can be slower with fixed-distance-ahead ++ * prefetch and perceived as having more tearing. ++ */ ++ if (src_bytes < dst_bytes + width && ++ src_bytes + src_stride * height > dst_bytes) ++ { ++ src_bytes += src_stride * height - src_stride; ++ dst_bytes += dst_stride * height - dst_stride; ++ dst_stride = -dst_stride; ++ src_stride = -src_stride; ++ /* Horizontal scrolling to the left needs memmove */ ++ if (src_bytes + width > dst_bytes) ++ { ++ while (--height >= 0) ++ { ++ memmove (dst_bytes, src_bytes, width); ++ dst_bytes += dst_stride; ++ src_bytes += src_stride; ++ } ++ return; ++ } ++ } ++ while (--height >= 0) ++ { ++ memcpy (dst_bytes, src_bytes, width); ++ dst_bytes += dst_stride; ++ src_bytes += src_stride; ++ } ++} ++ + #endif /* PIXMAN_PRIVATE_H */ +-- +1.6.2.4 + diff --git a/recipes/xorg-lib/pixman-0.17.6/0004-Support-of-overlapping-src-dst-for-pixman_blt_mmx.patch b/recipes/xorg-lib/pixman-0.17.6/0004-Support-of-overlapping-src-dst-for-pixman_blt_mmx.patch new file mode 100644 index 0000000000..74c7b45bc4 --- /dev/null +++ b/recipes/xorg-lib/pixman-0.17.6/0004-Support-of-overlapping-src-dst-for-pixman_blt_mmx.patch @@ -0,0 +1,91 @@ +From 7ca32542c957ff308a6ca7e3715e6552a65ae395 Mon Sep 17 00:00:00 2001 +From: Siarhei Siamashka <siarhei.siamashka@nokia.com> +Date: Thu, 22 Oct 2009 05:45:47 +0300 +Subject: [PATCH 4/6] Support of overlapping src/dst for pixman_blt_mmx + +--- + pixman/pixman-mmx.c | 55 +++++++++++++++++++++++++++++--------------------- + 1 files changed, 32 insertions(+), 23 deletions(-) + +diff --git a/pixman/pixman-mmx.c b/pixman/pixman-mmx.c +index 819e3a0..dcccadb 100644 +--- a/pixman/pixman-mmx.c ++++ b/pixman/pixman-mmx.c +@@ -3002,34 +3002,43 @@ pixman_blt_mmx (uint32_t *src_bits, + { + uint8_t * src_bytes; + uint8_t * dst_bytes; +- int byte_width; ++ int bpp; + +- if (src_bpp != dst_bpp) ++ if (src_bpp != dst_bpp || src_bpp & 7) + return FALSE; + +- if (src_bpp == 16) +- { +- src_stride = src_stride * (int) sizeof (uint32_t) / 2; +- dst_stride = dst_stride * (int) sizeof (uint32_t) / 2; +- src_bytes = (uint8_t *)(((uint16_t *)src_bits) + src_stride * (src_y) + (src_x)); +- dst_bytes = (uint8_t *)(((uint16_t *)dst_bits) + dst_stride * (dst_y) + (dst_x)); +- byte_width = 2 * width; +- src_stride *= 2; +- dst_stride *= 2; +- } +- else if (src_bpp == 32) ++ bpp = src_bpp >> 3; ++ width *= bpp; ++ src_stride *= 4; ++ dst_stride *= 4; ++ src_bytes = (uint8_t *)src_bits + src_y * src_stride + src_x * bpp; ++ dst_bytes = (uint8_t *)dst_bits + dst_y * dst_stride + dst_x * bpp; ++ ++ if (src_bpp != 16 && src_bpp != 32) + { +- src_stride = src_stride * (int) sizeof (uint32_t) / 4; +- dst_stride = dst_stride * (int) sizeof (uint32_t) / 4; +- src_bytes = (uint8_t *)(((uint32_t *)src_bits) + src_stride * (src_y) + (src_x)); +- dst_bytes = (uint8_t *)(((uint32_t *)dst_bits) + dst_stride * (dst_y) + (dst_x)); +- byte_width = 4 * width; +- src_stride *= 4; +- dst_stride *= 4; ++ pixman_blt_helper (src_bytes, dst_bytes, src_stride, dst_stride, ++ width, height); ++ return TRUE; + } +- else ++ ++ if (src_bytes < dst_bytes && src_bytes + src_stride * height > dst_bytes) + { +- return FALSE; ++ src_bytes += src_stride * height - src_stride; ++ dst_bytes += dst_stride * height - dst_stride; ++ dst_stride = -dst_stride; ++ src_stride = -src_stride; ++ ++ if (src_bytes + width > dst_bytes) ++ { ++ /* TODO: reverse scanline copy using MMX */ ++ while (--height >= 0) ++ { ++ memmove (dst_bytes, src_bytes, width); ++ dst_bytes += dst_stride; ++ src_bytes += src_stride; ++ } ++ return TRUE; ++ } + } + + while (height--) +@@ -3039,7 +3048,7 @@ pixman_blt_mmx (uint32_t *src_bits, + uint8_t *d = dst_bytes; + src_bytes += src_stride; + dst_bytes += dst_stride; +- w = byte_width; ++ w = width; + + while (w >= 2 && ((unsigned long)d & 3)) + { +-- +1.6.2.4 + diff --git a/recipes/xorg-lib/pixman-0.17.6/0005-Support-of-overlapping-src-dst-for-pixman_blt_sse2.patch b/recipes/xorg-lib/pixman-0.17.6/0005-Support-of-overlapping-src-dst-for-pixman_blt_sse2.patch new file mode 100644 index 0000000000..3704fbf1cf --- /dev/null +++ b/recipes/xorg-lib/pixman-0.17.6/0005-Support-of-overlapping-src-dst-for-pixman_blt_sse2.patch @@ -0,0 +1,91 @@ +From edc80b41c6480b7c80ec5f7c835c92b2debb3774 Mon Sep 17 00:00:00 2001 +From: Siarhei Siamashka <siarhei.siamashka@nokia.com> +Date: Thu, 22 Oct 2009 05:45:54 +0300 +Subject: [PATCH 5/6] Support of overlapping src/dst for pixman_blt_sse2 + +--- + pixman/pixman-sse2.c | 55 +++++++++++++++++++++++++++++-------------------- + 1 files changed, 32 insertions(+), 23 deletions(-) + +diff --git a/pixman/pixman-sse2.c b/pixman/pixman-sse2.c +index 78b0ad1..b84636b 100644 +--- a/pixman/pixman-sse2.c ++++ b/pixman/pixman-sse2.c +@@ -5300,34 +5300,43 @@ pixman_blt_sse2 (uint32_t *src_bits, + { + uint8_t * src_bytes; + uint8_t * dst_bytes; +- int byte_width; ++ int bpp; + +- if (src_bpp != dst_bpp) ++ if (src_bpp != dst_bpp || src_bpp & 7) + return FALSE; + +- if (src_bpp == 16) +- { +- src_stride = src_stride * (int) sizeof (uint32_t) / 2; +- dst_stride = dst_stride * (int) sizeof (uint32_t) / 2; +- src_bytes =(uint8_t *)(((uint16_t *)src_bits) + src_stride * (src_y) + (src_x)); +- dst_bytes = (uint8_t *)(((uint16_t *)dst_bits) + dst_stride * (dst_y) + (dst_x)); +- byte_width = 2 * width; +- src_stride *= 2; +- dst_stride *= 2; +- } +- else if (src_bpp == 32) ++ bpp = src_bpp >> 3; ++ width *= bpp; ++ src_stride *= 4; ++ dst_stride *= 4; ++ src_bytes = (uint8_t *)src_bits + src_y * src_stride + src_x * bpp; ++ dst_bytes = (uint8_t *)dst_bits + dst_y * dst_stride + dst_x * bpp; ++ ++ if (src_bpp != 16 && src_bpp != 32) + { +- src_stride = src_stride * (int) sizeof (uint32_t) / 4; +- dst_stride = dst_stride * (int) sizeof (uint32_t) / 4; +- src_bytes = (uint8_t *)(((uint32_t *)src_bits) + src_stride * (src_y) + (src_x)); +- dst_bytes = (uint8_t *)(((uint32_t *)dst_bits) + dst_stride * (dst_y) + (dst_x)); +- byte_width = 4 * width; +- src_stride *= 4; +- dst_stride *= 4; ++ pixman_blt_helper (src_bytes, dst_bytes, src_stride, dst_stride, ++ width, height); ++ return TRUE; + } +- else ++ ++ if (src_bytes < dst_bytes && src_bytes + src_stride * height > dst_bytes) + { +- return FALSE; ++ src_bytes += src_stride * height - src_stride; ++ dst_bytes += dst_stride * height - dst_stride; ++ dst_stride = -dst_stride; ++ src_stride = -src_stride; ++ ++ if (src_bytes + width > dst_bytes) ++ { ++ /* TODO: reverse scanline copy using SSE2 */ ++ while (--height >= 0) ++ { ++ memmove (dst_bytes, src_bytes, width); ++ dst_bytes += dst_stride; ++ src_bytes += src_stride; ++ } ++ return TRUE; ++ } + } + + cache_prefetch ((__m128i*)src_bytes); +@@ -5340,7 +5349,7 @@ pixman_blt_sse2 (uint32_t *src_bits, + uint8_t *d = dst_bytes; + src_bytes += src_stride; + dst_bytes += dst_stride; +- w = byte_width; ++ w = width; + + cache_prefetch_next ((__m128i*)s); + cache_prefetch_next ((__m128i*)d); +-- +1.6.2.4 + diff --git a/recipes/xorg-lib/pixman-0.17.6/0006-Support-of-overlapping-src-dst-for-pixman_blt_neon.patch b/recipes/xorg-lib/pixman-0.17.6/0006-Support-of-overlapping-src-dst-for-pixman_blt_neon.patch new file mode 100644 index 0000000000..7c22483a2e --- /dev/null +++ b/recipes/xorg-lib/pixman-0.17.6/0006-Support-of-overlapping-src-dst-for-pixman_blt_neon.patch @@ -0,0 +1,94 @@ +From 86870ff530b5e435034bd80207e5758466d96cff Mon Sep 17 00:00:00 2001 +From: Siarhei Siamashka <siarhei.siamashka@nokia.com> +Date: Wed, 18 Nov 2009 06:08:48 +0200 +Subject: [PATCH 6/6] Support of overlapping src/dst for pixman_blt_neon + +--- + pixman/pixman-arm-neon.c | 63 ++++++++++++++++++++++++++++++++++++++------- + 1 files changed, 53 insertions(+), 10 deletions(-) + +diff --git a/pixman/pixman-arm-neon.c b/pixman/pixman-arm-neon.c +index 495fda4..c632ff5 100644 +--- a/pixman/pixman-arm-neon.c ++++ b/pixman/pixman-arm-neon.c +@@ -357,26 +357,66 @@ + int width, + int height) + { +- if (src_bpp != dst_bpp) ++ uint8_t * src_bytes; ++ uint8_t * dst_bytes; ++ int bpp; ++ ++ if (src_bpp != dst_bpp || src_bpp & 7) + return FALSE; + ++ bpp = src_bpp >> 3; ++ width *= bpp; ++ src_stride *= 4; ++ dst_stride *= 4; ++ src_bytes = (uint8_t *)src_bits + src_y * src_stride + src_x * bpp; ++ dst_bytes = (uint8_t *)dst_bits + dst_y * dst_stride + dst_x * bpp; ++ ++ if (src_bpp != 16 && src_bpp != 32) ++ { ++ pixman_blt_helper (src_bytes, dst_bytes, src_stride, dst_stride, ++ width, height); ++ return TRUE; ++ } ++ ++ if (src_bytes < dst_bytes && src_bytes + src_stride * height > dst_bytes) ++ { ++ src_bytes += src_stride * height - src_stride; ++ dst_bytes += dst_stride * height - dst_stride; ++ dst_stride = -dst_stride; ++ src_stride = -src_stride; ++ ++ if (src_bytes + width > dst_bytes) ++ { ++ /* TODO: reverse scanline copy using NEON */ ++ while (--height >= 0) ++ { ++ memmove (dst_bytes, src_bytes, width); ++ dst_bytes += dst_stride; ++ src_bytes += src_stride; ++ } ++ return TRUE; ++ } ++ } ++ + switch (src_bpp) + { + case 16: + pixman_composite_src_0565_0565_asm_neon ( +- width, height, +- (uint16_t *)(((char *) dst_bits) + +- dst_y * dst_stride * 4 + dst_x * 2), dst_stride * 2, +- (uint16_t *)(((char *) src_bits) + +- src_y * src_stride * 4 + src_x * 2), src_stride * 2); ++ width >> 1, ++ height, ++ (uint16_t *) dst_bytes, ++ dst_stride >> 1, ++ (uint16_t *) src_bytes, ++ src_stride >> 1); + return TRUE; + case 32: + pixman_composite_src_8888_8888_asm_neon ( +- width, height, +- (uint32_t *)(((char *) dst_bits) + +- dst_y * dst_stride * 4 + dst_x * 4), dst_stride, +- (uint32_t *)(((char *) src_bits) + +- src_y * src_stride * 4 + src_x * 4), src_stride); ++ width >> 2, ++ height, ++ (uint32_t *) dst_bytes, ++ dst_stride >> 2, ++ (uint32_t *) src_bytes, ++ src_stride >> 2); + return TRUE; + default: + return FALSE; +-- +1.6.2.4 + diff --git a/recipes/xorg-lib/pixman_0.17.6.bb b/recipes/xorg-lib/pixman_0.17.6.bb new file mode 100644 index 0000000000..ff3c0692b0 --- /dev/null +++ b/recipes/xorg-lib/pixman_0.17.6.bb @@ -0,0 +1,30 @@ +SECTION = "libs" +PRIORITY = "optional" +DESCRIPTION = "Low-level pixel manipulation library." +LICENSE = "X11" + +DEFAULT_PREFERENCE = "-1" +DEFAULT_PREFERENCE_shr = "1" + +BBCLASSEXTEND="native" + +SRC_URI = "http://cairographics.org/releases/pixman-${PV}.tar.gz;name=archive \ + file://0001-Dropped-delegation-support-for-pixman_blt.patch;patch=1 \ + file://0002-Test-program-for-pixman_blt-function.patch;patch=1 \ + file://0003-Generic-C-implementation-of-pixman_blt-with-overlapp.patch;patch=1 \ + file://0004-Support-of-overlapping-src-dst-for-pixman_blt_mmx.patch;patch=1 \ + file://0005-Support-of-overlapping-src-dst-for-pixman_blt_sse2.patch;patch=1 \ + file://0006-Support-of-overlapping-src-dst-for-pixman_blt_neon.patch;patch=1 \ + " +SRC_URI[archive.md5sum] = "32cbdf7a1ac1c275ee56230e26701456" +SRC_URI[archive.sha256sum] = "14ea5a185d8ea6ce3203ff008279e3f3433b6a5bad5853b42a82978527e618cb" + +inherit autotools_stage + +NEON = " --disable-arm-neon " +NEON_armv7a = "" + +EXTRA_OECONF = "${NEON}" + +AUTOTOOLS_STAGE_PKGCONFIG = "1" + -- cgit v1.2.3 From 9a0b80fa466e76e8d0a0fe0065186a3076b029ba Mon Sep 17 00:00:00 2001 From: Martin Jansa <Martin.Jansa@gmail.com> Date: Sat, 20 Feb 2010 18:29:04 +0100 Subject: pixman: disable gtk, to break circular dependency gtk+->cairo->pixman->gtk+ and also libtool issue Signed-off-by: Martin Jansa <Martin.Jansa@gmail.com> --- recipes/xorg-lib/pixman_0.17.6.bb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'recipes/xorg-lib') diff --git a/recipes/xorg-lib/pixman_0.17.6.bb b/recipes/xorg-lib/pixman_0.17.6.bb index ff3c0692b0..01febb81dd 100644 --- a/recipes/xorg-lib/pixman_0.17.6.bb +++ b/recipes/xorg-lib/pixman_0.17.6.bb @@ -6,6 +6,8 @@ LICENSE = "X11" DEFAULT_PREFERENCE = "-1" DEFAULT_PREFERENCE_shr = "1" +PR = "r1" + BBCLASSEXTEND="native" SRC_URI = "http://cairographics.org/releases/pixman-${PV}.tar.gz;name=archive \ @@ -24,7 +26,7 @@ inherit autotools_stage NEON = " --disable-arm-neon " NEON_armv7a = "" -EXTRA_OECONF = "${NEON}" +EXTRA_OECONF = "${NEON} --disable-gtk" AUTOTOOLS_STAGE_PKGCONFIG = "1" -- cgit v1.2.3 From c0ae6dec3f2a8fae5df99f668b99674991c26e9d Mon Sep 17 00:00:00 2001 From: Koen Kooi <koen@openembedded.org> Date: Thu, 25 Feb 2010 10:17:18 +0100 Subject: pixman 0.17.8: add and make default for angstrom --- ...mplementation-of-pixman_blt-with-overlapp.patch | 114 +++++++++++++++ ...of-overlapping-src-dst-for-pixman_blt_mmx.patch | 91 ++++++++++++ ...f-overlapping-src-dst-for-pixman_blt_sse2.patch | 91 ++++++++++++ ...f-overlapping-src-dst-for-pixman_blt_neon.patch | 94 ++++++++++++ recipes/xorg-lib/pixman-0.17.8/1-composite.patch | 161 +++++++++++++++++++++ recipes/xorg-lib/pixman-0.17.8/2-composite.patch | 100 +++++++++++++ recipes/xorg-lib/pixman-0.17.8/3-composite.patch | 105 ++++++++++++++ recipes/xorg-lib/pixman_0.17.8.bb | 33 +++++ recipes/xorg-lib/pixman_git.bb | 1 - 9 files changed, 789 insertions(+), 1 deletion(-) create mode 100644 recipes/xorg-lib/pixman-0.17.8/0003-Generic-C-implementation-of-pixman_blt-with-overlapp.patch create mode 100644 recipes/xorg-lib/pixman-0.17.8/0004-Support-of-overlapping-src-dst-for-pixman_blt_mmx.patch create mode 100644 recipes/xorg-lib/pixman-0.17.8/0005-Support-of-overlapping-src-dst-for-pixman_blt_sse2.patch create mode 100644 recipes/xorg-lib/pixman-0.17.8/0006-Support-of-overlapping-src-dst-for-pixman_blt_neon.patch create mode 100644 recipes/xorg-lib/pixman-0.17.8/1-composite.patch create mode 100644 recipes/xorg-lib/pixman-0.17.8/2-composite.patch create mode 100644 recipes/xorg-lib/pixman-0.17.8/3-composite.patch create mode 100644 recipes/xorg-lib/pixman_0.17.8.bb (limited to 'recipes/xorg-lib') diff --git a/recipes/xorg-lib/pixman-0.17.8/0003-Generic-C-implementation-of-pixman_blt-with-overlapp.patch b/recipes/xorg-lib/pixman-0.17.8/0003-Generic-C-implementation-of-pixman_blt-with-overlapp.patch new file mode 100644 index 0000000000..25ce7ee3b8 --- /dev/null +++ b/recipes/xorg-lib/pixman-0.17.8/0003-Generic-C-implementation-of-pixman_blt-with-overlapp.patch @@ -0,0 +1,114 @@ +From c29c9fa826b7112156fd6150b5f1564227935c05 Mon Sep 17 00:00:00 2001 +From: Siarhei Siamashka <siarhei.siamashka@nokia.com> +Date: Thu, 22 Oct 2009 05:27:33 +0300 +Subject: [PATCH 3/6] Generic C implementation of pixman_blt with overlapping support + +Uses memcpy/memmove functions to copy pixels, can handle the +case when both source and destination areas are in the same +image (this is useful for scrolling). + +It is assumed that copying direction is only important when +using the same image for both source and destination (and +src_stride == dst_stride). Copying direction is undefined +for the images with different source and destination stride +which happen to be in the overlapped areas (but this is an +unrealistic case anyway). +--- + pixman/pixman-general.c | 21 ++++++++++++++++++--- + pixman/pixman-private.h | 43 +++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 61 insertions(+), 3 deletions(-) + +diff --git a/pixman/pixman-general.c b/pixman/pixman-general.c +index c96a3f9..d71a299 100644 +--- a/pixman/pixman-general.c ++++ b/pixman/pixman-general.c +@@ -300,9 +300,24 @@ general_blt (pixman_implementation_t *imp, + int width, + int height) + { +- /* We can't blit unless we have sse2 or mmx */ +- +- return FALSE; ++ uint8_t *dst_bytes = (uint8_t *)dst_bits; ++ uint8_t *src_bytes = (uint8_t *)src_bits; ++ int bpp; ++ ++ if (src_bpp != dst_bpp || src_bpp & 7) ++ return FALSE; ++ ++ bpp = src_bpp >> 3; ++ width *= bpp; ++ src_stride *= 4; ++ dst_stride *= 4; ++ pixman_blt_helper (src_bytes + src_y * src_stride + src_x * bpp, ++ dst_bytes + dst_y * dst_stride + dst_x * bpp, ++ src_stride, ++ dst_stride, ++ width, ++ height); ++ return TRUE; + } + + static pixman_bool_t +diff --git a/pixman/pixman-private.h b/pixman/pixman-private.h +index 5000f91..8c5d4fd 100644 +--- a/pixman/pixman-private.h ++++ b/pixman/pixman-private.h +@@ -10,6 +10,7 @@ + + #include "pixman.h" + #include <time.h> ++#include <string.h> + #include <assert.h> + + #include "pixman-compiler.h" +@@ -794,4 +795,46 @@ void pixman_timer_register (pixman_timer_t *timer); + + #endif /* PIXMAN_TIMERS */ + ++/* a helper function, can blit 8-bit images with src/dst overlapping support */ ++static inline void ++pixman_blt_helper (uint8_t *src_bytes, ++ uint8_t *dst_bytes, ++ int src_stride, ++ int dst_stride, ++ int width, ++ int height) ++{ ++ /* ++ * The second part of this check is not strictly needed, but it prevents ++ * unnecessary upside-down processing of areas which belong to different ++ * images. Upside-down processing can be slower with fixed-distance-ahead ++ * prefetch and perceived as having more tearing. ++ */ ++ if (src_bytes < dst_bytes + width && ++ src_bytes + src_stride * height > dst_bytes) ++ { ++ src_bytes += src_stride * height - src_stride; ++ dst_bytes += dst_stride * height - dst_stride; ++ dst_stride = -dst_stride; ++ src_stride = -src_stride; ++ /* Horizontal scrolling to the left needs memmove */ ++ if (src_bytes + width > dst_bytes) ++ { ++ while (--height >= 0) ++ { ++ memmove (dst_bytes, src_bytes, width); ++ dst_bytes += dst_stride; ++ src_bytes += src_stride; ++ } ++ return; ++ } ++ } ++ while (--height >= 0) ++ { ++ memcpy (dst_bytes, src_bytes, width); ++ dst_bytes += dst_stride; ++ src_bytes += src_stride; ++ } ++} ++ + #endif /* PIXMAN_PRIVATE_H */ +-- +1.6.2.4 + diff --git a/recipes/xorg-lib/pixman-0.17.8/0004-Support-of-overlapping-src-dst-for-pixman_blt_mmx.patch b/recipes/xorg-lib/pixman-0.17.8/0004-Support-of-overlapping-src-dst-for-pixman_blt_mmx.patch new file mode 100644 index 0000000000..74c7b45bc4 --- /dev/null +++ b/recipes/xorg-lib/pixman-0.17.8/0004-Support-of-overlapping-src-dst-for-pixman_blt_mmx.patch @@ -0,0 +1,91 @@ +From 7ca32542c957ff308a6ca7e3715e6552a65ae395 Mon Sep 17 00:00:00 2001 +From: Siarhei Siamashka <siarhei.siamashka@nokia.com> +Date: Thu, 22 Oct 2009 05:45:47 +0300 +Subject: [PATCH 4/6] Support of overlapping src/dst for pixman_blt_mmx + +--- + pixman/pixman-mmx.c | 55 +++++++++++++++++++++++++++++--------------------- + 1 files changed, 32 insertions(+), 23 deletions(-) + +diff --git a/pixman/pixman-mmx.c b/pixman/pixman-mmx.c +index 819e3a0..dcccadb 100644 +--- a/pixman/pixman-mmx.c ++++ b/pixman/pixman-mmx.c +@@ -3002,34 +3002,43 @@ pixman_blt_mmx (uint32_t *src_bits, + { + uint8_t * src_bytes; + uint8_t * dst_bytes; +- int byte_width; ++ int bpp; + +- if (src_bpp != dst_bpp) ++ if (src_bpp != dst_bpp || src_bpp & 7) + return FALSE; + +- if (src_bpp == 16) +- { +- src_stride = src_stride * (int) sizeof (uint32_t) / 2; +- dst_stride = dst_stride * (int) sizeof (uint32_t) / 2; +- src_bytes = (uint8_t *)(((uint16_t *)src_bits) + src_stride * (src_y) + (src_x)); +- dst_bytes = (uint8_t *)(((uint16_t *)dst_bits) + dst_stride * (dst_y) + (dst_x)); +- byte_width = 2 * width; +- src_stride *= 2; +- dst_stride *= 2; +- } +- else if (src_bpp == 32) ++ bpp = src_bpp >> 3; ++ width *= bpp; ++ src_stride *= 4; ++ dst_stride *= 4; ++ src_bytes = (uint8_t *)src_bits + src_y * src_stride + src_x * bpp; ++ dst_bytes = (uint8_t *)dst_bits + dst_y * dst_stride + dst_x * bpp; ++ ++ if (src_bpp != 16 && src_bpp != 32) + { +- src_stride = src_stride * (int) sizeof (uint32_t) / 4; +- dst_stride = dst_stride * (int) sizeof (uint32_t) / 4; +- src_bytes = (uint8_t *)(((uint32_t *)src_bits) + src_stride * (src_y) + (src_x)); +- dst_bytes = (uint8_t *)(((uint32_t *)dst_bits) + dst_stride * (dst_y) + (dst_x)); +- byte_width = 4 * width; +- src_stride *= 4; +- dst_stride *= 4; ++ pixman_blt_helper (src_bytes, dst_bytes, src_stride, dst_stride, ++ width, height); ++ return TRUE; + } +- else ++ ++ if (src_bytes < dst_bytes && src_bytes + src_stride * height > dst_bytes) + { +- return FALSE; ++ src_bytes += src_stride * height - src_stride; ++ dst_bytes += dst_stride * height - dst_stride; ++ dst_stride = -dst_stride; ++ src_stride = -src_stride; ++ ++ if (src_bytes + width > dst_bytes) ++ { ++ /* TODO: reverse scanline copy using MMX */ ++ while (--height >= 0) ++ { ++ memmove (dst_bytes, src_bytes, width); ++ dst_bytes += dst_stride; ++ src_bytes += src_stride; ++ } ++ return TRUE; ++ } + } + + while (height--) +@@ -3039,7 +3048,7 @@ pixman_blt_mmx (uint32_t *src_bits, + uint8_t *d = dst_bytes; + src_bytes += src_stride; + dst_bytes += dst_stride; +- w = byte_width; ++ w = width; + + while (w >= 2 && ((unsigned long)d & 3)) + { +-- +1.6.2.4 + diff --git a/recipes/xorg-lib/pixman-0.17.8/0005-Support-of-overlapping-src-dst-for-pixman_blt_sse2.patch b/recipes/xorg-lib/pixman-0.17.8/0005-Support-of-overlapping-src-dst-for-pixman_blt_sse2.patch new file mode 100644 index 0000000000..3704fbf1cf --- /dev/null +++ b/recipes/xorg-lib/pixman-0.17.8/0005-Support-of-overlapping-src-dst-for-pixman_blt_sse2.patch @@ -0,0 +1,91 @@ +From edc80b41c6480b7c80ec5f7c835c92b2debb3774 Mon Sep 17 00:00:00 2001 +From: Siarhei Siamashka <siarhei.siamashka@nokia.com> +Date: Thu, 22 Oct 2009 05:45:54 +0300 +Subject: [PATCH 5/6] Support of overlapping src/dst for pixman_blt_sse2 + +--- + pixman/pixman-sse2.c | 55 +++++++++++++++++++++++++++++-------------------- + 1 files changed, 32 insertions(+), 23 deletions(-) + +diff --git a/pixman/pixman-sse2.c b/pixman/pixman-sse2.c +index 78b0ad1..b84636b 100644 +--- a/pixman/pixman-sse2.c ++++ b/pixman/pixman-sse2.c +@@ -5300,34 +5300,43 @@ pixman_blt_sse2 (uint32_t *src_bits, + { + uint8_t * src_bytes; + uint8_t * dst_bytes; +- int byte_width; ++ int bpp; + +- if (src_bpp != dst_bpp) ++ if (src_bpp != dst_bpp || src_bpp & 7) + return FALSE; + +- if (src_bpp == 16) +- { +- src_stride = src_stride * (int) sizeof (uint32_t) / 2; +- dst_stride = dst_stride * (int) sizeof (uint32_t) / 2; +- src_bytes =(uint8_t *)(((uint16_t *)src_bits) + src_stride * (src_y) + (src_x)); +- dst_bytes = (uint8_t *)(((uint16_t *)dst_bits) + dst_stride * (dst_y) + (dst_x)); +- byte_width = 2 * width; +- src_stride *= 2; +- dst_stride *= 2; +- } +- else if (src_bpp == 32) ++ bpp = src_bpp >> 3; ++ width *= bpp; ++ src_stride *= 4; ++ dst_stride *= 4; ++ src_bytes = (uint8_t *)src_bits + src_y * src_stride + src_x * bpp; ++ dst_bytes = (uint8_t *)dst_bits + dst_y * dst_stride + dst_x * bpp; ++ ++ if (src_bpp != 16 && src_bpp != 32) + { +- src_stride = src_stride * (int) sizeof (uint32_t) / 4; +- dst_stride = dst_stride * (int) sizeof (uint32_t) / 4; +- src_bytes = (uint8_t *)(((uint32_t *)src_bits) + src_stride * (src_y) + (src_x)); +- dst_bytes = (uint8_t *)(((uint32_t *)dst_bits) + dst_stride * (dst_y) + (dst_x)); +- byte_width = 4 * width; +- src_stride *= 4; +- dst_stride *= 4; ++ pixman_blt_helper (src_bytes, dst_bytes, src_stride, dst_stride, ++ width, height); ++ return TRUE; + } +- else ++ ++ if (src_bytes < dst_bytes && src_bytes + src_stride * height > dst_bytes) + { +- return FALSE; ++ src_bytes += src_stride * height - src_stride; ++ dst_bytes += dst_stride * height - dst_stride; ++ dst_stride = -dst_stride; ++ src_stride = -src_stride; ++ ++ if (src_bytes + width > dst_bytes) ++ { ++ /* TODO: reverse scanline copy using SSE2 */ ++ while (--height >= 0) ++ { ++ memmove (dst_bytes, src_bytes, width); ++ dst_bytes += dst_stride; ++ src_bytes += src_stride; ++ } ++ return TRUE; ++ } + } + + cache_prefetch ((__m128i*)src_bytes); +@@ -5340,7 +5349,7 @@ pixman_blt_sse2 (uint32_t *src_bits, + uint8_t *d = dst_bytes; + src_bytes += src_stride; + dst_bytes += dst_stride; +- w = byte_width; ++ w = width; + + cache_prefetch_next ((__m128i*)s); + cache_prefetch_next ((__m128i*)d); +-- +1.6.2.4 + diff --git a/recipes/xorg-lib/pixman-0.17.8/0006-Support-of-overlapping-src-dst-for-pixman_blt_neon.patch b/recipes/xorg-lib/pixman-0.17.8/0006-Support-of-overlapping-src-dst-for-pixman_blt_neon.patch new file mode 100644 index 0000000000..7c22483a2e --- /dev/null +++ b/recipes/xorg-lib/pixman-0.17.8/0006-Support-of-overlapping-src-dst-for-pixman_blt_neon.patch @@ -0,0 +1,94 @@ +From 86870ff530b5e435034bd80207e5758466d96cff Mon Sep 17 00:00:00 2001 +From: Siarhei Siamashka <siarhei.siamashka@nokia.com> +Date: Wed, 18 Nov 2009 06:08:48 +0200 +Subject: [PATCH 6/6] Support of overlapping src/dst for pixman_blt_neon + +--- + pixman/pixman-arm-neon.c | 63 ++++++++++++++++++++++++++++++++++++++------- + 1 files changed, 53 insertions(+), 10 deletions(-) + +diff --git a/pixman/pixman-arm-neon.c b/pixman/pixman-arm-neon.c +index 495fda4..c632ff5 100644 +--- a/pixman/pixman-arm-neon.c ++++ b/pixman/pixman-arm-neon.c +@@ -357,26 +357,66 @@ + int width, + int height) + { +- if (src_bpp != dst_bpp) ++ uint8_t * src_bytes; ++ uint8_t * dst_bytes; ++ int bpp; ++ ++ if (src_bpp != dst_bpp || src_bpp & 7) + return FALSE; + ++ bpp = src_bpp >> 3; ++ width *= bpp; ++ src_stride *= 4; ++ dst_stride *= 4; ++ src_bytes = (uint8_t *)src_bits + src_y * src_stride + src_x * bpp; ++ dst_bytes = (uint8_t *)dst_bits + dst_y * dst_stride + dst_x * bpp; ++ ++ if (src_bpp != 16 && src_bpp != 32) ++ { ++ pixman_blt_helper (src_bytes, dst_bytes, src_stride, dst_stride, ++ width, height); ++ return TRUE; ++ } ++ ++ if (src_bytes < dst_bytes && src_bytes + src_stride * height > dst_bytes) ++ { ++ src_bytes += src_stride * height - src_stride; ++ dst_bytes += dst_stride * height - dst_stride; ++ dst_stride = -dst_stride; ++ src_stride = -src_stride; ++ ++ if (src_bytes + width > dst_bytes) ++ { ++ /* TODO: reverse scanline copy using NEON */ ++ while (--height >= 0) ++ { ++ memmove (dst_bytes, src_bytes, width); ++ dst_bytes += dst_stride; ++ src_bytes += src_stride; ++ } ++ return TRUE; ++ } ++ } ++ + switch (src_bpp) + { + case 16: + pixman_composite_src_0565_0565_asm_neon ( +- width, height, +- (uint16_t *)(((char *) dst_bits) + +- dst_y * dst_stride * 4 + dst_x * 2), dst_stride * 2, +- (uint16_t *)(((char *) src_bits) + +- src_y * src_stride * 4 + src_x * 2), src_stride * 2); ++ width >> 1, ++ height, ++ (uint16_t *) dst_bytes, ++ dst_stride >> 1, ++ (uint16_t *) src_bytes, ++ src_stride >> 1); + return TRUE; + case 32: + pixman_composite_src_8888_8888_asm_neon ( +- width, height, +- (uint32_t *)(((char *) dst_bits) + +- dst_y * dst_stride * 4 + dst_x * 4), dst_stride, +- (uint32_t *)(((char *) src_bits) + +- src_y * src_stride * 4 + src_x * 4), src_stride); ++ width >> 2, ++ height, ++ (uint32_t *) dst_bytes, ++ dst_stride >> 2, ++ (uint32_t *) src_bytes, ++ src_stride >> 2); + return TRUE; + default: + return FALSE; +-- +1.6.2.4 + diff --git a/recipes/xorg-lib/pixman-0.17.8/1-composite.patch b/recipes/xorg-lib/pixman-0.17.8/1-composite.patch new file mode 100644 index 0000000000..761a2b937a --- /dev/null +++ b/recipes/xorg-lib/pixman-0.17.8/1-composite.patch @@ -0,0 +1,161 @@ +From 138d38f68bb2f955ca209f7412002a983a32a2fd Mon Sep 17 00:00:00 2001 +From: Siarhei Siamashka <siarhei.siamashka@nokia.com> +Date: Tue, 23 Feb 2010 23:44:00 +0000 +Subject: 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 +--- +diff --git a/pixman/pixman-arm-neon-asm.S b/pixman/pixman-arm-neon-asm.S +index 2986884..2db4da8 100644 +--- a/pixman/pixman-arm-neon-asm.S ++++ b/pixman/pixman-arm-neon-asm.S +@@ -1026,6 +1026,113 @@ generate_composite_function \ + + /******************************************************************************/ + ++.macro pixman_composite_over_n_8888_8888_ca_process_pixblock_head ++ /* ++ * 'combine_mask_ca' replacement ++ * ++ * input: solid src (n) in {d8, d9, d10, d11} ++ * dest in {d4, d5, d6, d7 } ++ * mask in {d24, d25, d26, d27} ++ * output: updated src in {d0, d1, d2, d3 } ++ * updated mask in {d24, d25, d26, d27} ++ */ ++ vmull.u8 q0, d24, d8 ++ vmull.u8 q1, d25, d9 ++ vmull.u8 q6, d26, d10 ++ vmull.u8 q7, d27, d11 ++ vmull.u8 q9, d11, d24 ++ vmull.u8 q12, d11, d25 ++ vmull.u8 q13, d11, d26 ++ vrshr.u16 q10, q0, #8 ++ vrshr.u16 q11, q1, #8 ++ vrshr.u16 q8, q6, #8 ++ vraddhn.u16 d0, q0, q10 ++ vraddhn.u16 d1, q1, q11 ++ vraddhn.u16 d2, q6, q8 ++ vrshr.u16 q10, q7, #8 ++ vrshr.u16 q11, q9, #8 ++ vrshr.u16 q8, q12, #8 ++ vraddhn.u16 d3, q7, q10 ++ vrshr.u16 q10, q13, #8 ++ vraddhn.u16 d25, q12, q8 ++ vrshr.u16 q8, q7, #8 ++ vraddhn.u16 d24, q9, q11 ++ vraddhn.u16 d26, q13, q10 ++ vraddhn.u16 d27, q7, q8 ++ /* ++ * 'combine_over_ca' replacement ++ * ++ * output: updated dest in {d28, d29, d30, d31} ++ */ ++ vmvn.8 d24, d24 ++ vmvn.8 d25, d25 ++ vmull.u8 q8, d24, d4 ++ vmull.u8 q9, d25, d5 ++ vmvn.8 d26, d26 ++ vmvn.8 d27, d27 ++ vmull.u8 q10, d26, d6 ++ vmull.u8 q11, d27, d7 ++.endm ++ ++.macro pixman_composite_over_n_8888_8888_ca_process_pixblock_tail ++ /* ... continue 'combine_over_ca' replacement */ ++ vrshr.u16 q14, q8, #8 ++ vrshr.u16 q15, q9, #8 ++ vrshr.u16 q6, q10, #8 ++ vrshr.u16 q7, q11, #8 ++ vraddhn.u16 d28, q14, q8 ++ vraddhn.u16 d29, q15, q9 ++ vraddhn.u16 d30, q6, q10 ++ vraddhn.u16 d31, q7, q11 ++ vqadd.u8 q14, q0, q14 ++ vqadd.u8 q15, q1, q15 ++.endm ++ ++.macro pixman_composite_over_n_8888_8888_ca_process_pixblock_tail_head ++ vrshr.u16 q14, q8, #8 ++ vrshr.u16 q15, q9, #8 ++ vld4.8 {d4, d5, d6, d7}, [DST_R, :128]! ++ vrshr.u16 q6, q10, #8 ++ vrshr.u16 q7, q11, #8 ++ vraddhn.u16 d28, q14, q8 ++ vraddhn.u16 d29, q15, q9 ++ vraddhn.u16 d30, q6, q10 ++ vraddhn.u16 d31, q7, q11 ++ vld4.8 {d24, d25, d26, d27}, [MASK]! ++ vqadd.u8 q14, q0, q14 ++ vqadd.u8 q15, q1, q15 ++ cache_preload 8, 8 ++ pixman_composite_over_n_8888_8888_ca_process_pixblock_head ++ vst4.8 {d28, d29, d30, d31}, [DST_W, :128]! ++.endm ++ ++.macro pixman_composite_over_n_8888_8888_ca_init ++ add DUMMY, sp, #ARGS_STACK_OFFSET ++ vpush {d8-d15} ++ vld1.32 {d11[0]}, [DUMMY] ++ vdup.8 d8, d11[0] ++ vdup.8 d9, d11[1] ++ vdup.8 d10, d11[2] ++ vdup.8 d11, d11[3] ++.endm ++ ++.macro pixman_composite_over_n_8888_8888_ca_cleanup ++ vpop {d8-d15} ++.endm ++ ++generate_composite_function \ ++ pixman_composite_over_n_8888_8888_ca_asm_neon, 0, 32, 32, \ ++ FLAG_DST_READWRITE | FLAG_DEINTERLEAVE_32BPP, \ ++ 8, /* number of pixels, processed in a single block */ \ ++ 5, /* prefetch distance */ \ ++ pixman_composite_over_n_8888_8888_ca_init, \ ++ pixman_composite_over_n_8888_8888_ca_cleanup, \ ++ pixman_composite_over_n_8888_8888_ca_process_pixblock_head, \ ++ pixman_composite_over_n_8888_8888_ca_process_pixblock_tail, \ ++ pixman_composite_over_n_8888_8888_ca_process_pixblock_tail_head ++ ++/******************************************************************************/ ++ + .macro pixman_composite_add_n_8_8_process_pixblock_head + /* expecting source data in {d8, d9, d10, d11} */ + /* d8 - blue, d9 - green, d10 - red, d11 - alpha */ +diff --git a/pixman/pixman-arm-neon.c b/pixman/pixman-arm-neon.c +index 557301e..00b5c35 100644 +--- a/pixman/pixman-arm-neon.c ++++ b/pixman/pixman-arm-neon.c +@@ -269,6 +269,7 @@ BIND_SRC_NULL_DST(over_8888_8888, uint32_t, 1, uint32_t, 1) + + BIND_N_MASK_DST(over_n_8_0565, uint8_t, 1, uint16_t, 1) + BIND_N_MASK_DST(over_n_8_8888, uint8_t, 1, uint32_t, 1) ++BIND_N_MASK_DST(over_n_8888_8888_ca, uint32_t, 1, uint32_t, 1) + BIND_N_MASK_DST(add_n_8_8, uint8_t, 1, uint8_t, 1) + + BIND_SRC_N_DST(over_8888_n_8888, uint32_t, 1, uint32_t, 1) +@@ -412,6 +413,8 @@ static const pixman_fast_path_t arm_neon_fast_paths[] = + PIXMAN_STD_FAST_PATH (OVER, solid, null, r5g6b5, neon_composite_over_n_0565), + PIXMAN_STD_FAST_PATH (OVER, solid, null, a8r8g8b8, neon_composite_over_n_8888), + PIXMAN_STD_FAST_PATH (OVER, solid, null, x8r8g8b8, neon_composite_over_n_8888), ++ PIXMAN_STD_FAST_PATH_CA (OVER, solid, a8r8g8b8, a8r8g8b8, neon_composite_over_n_8888_8888_ca), ++ PIXMAN_STD_FAST_PATH_CA (OVER, solid, a8r8g8b8, x8r8g8b8, neon_composite_over_n_8888_8888_ca), + PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, solid, a8r8g8b8, neon_composite_over_8888_n_8888), + PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, solid, x8r8g8b8, neon_composite_over_8888_n_8888), + PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, a8, a8r8g8b8, neon_composite_over_8888_8_8888), +-- +cgit v0.8.3-6-g21f6 diff --git a/recipes/xorg-lib/pixman-0.17.8/2-composite.patch b/recipes/xorg-lib/pixman-0.17.8/2-composite.patch new file mode 100644 index 0000000000..96c87e2ac6 --- /dev/null +++ b/recipes/xorg-lib/pixman-0.17.8/2-composite.patch @@ -0,0 +1,100 @@ +From fa7f7b05fbb08b23678cf0d8928f1511e5a20ecc Mon Sep 17 00:00:00 2001 +From: Siarhei Siamashka <siarhei.siamashka@nokia.com> +Date: Wed, 24 Feb 2010 00:26:57 +0000 +Subject: 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 +--- +diff --git a/pixman/pixman-arm-neon-asm.S b/pixman/pixman-arm-neon-asm.S +index 2db4da8..42ac1cb 100644 +--- a/pixman/pixman-arm-neon-asm.S ++++ b/pixman/pixman-arm-neon-asm.S +@@ -947,6 +947,44 @@ generate_composite_function \ + + /******************************************************************************/ + ++.macro pixman_composite_src_x888_8888_process_pixblock_head ++ vorr q0, q0, q2 ++ vorr q1, q1, q2 ++.endm ++ ++.macro pixman_composite_src_x888_8888_process_pixblock_tail ++.endm ++ ++.macro pixman_composite_src_x888_8888_process_pixblock_tail_head ++ vst1.32 {d0, d1, d2, d3}, [DST_W, :128]! ++ vld1.32 {d0, d1, d2, d3}, [SRC]! ++ vorr q0, q0, q2 ++ vorr q1, q1, q2 ++ cache_preload 8, 8 ++.endm ++ ++.macro pixman_composite_src_x888_8888_init ++ vmov.u8 q2, #0xFF ++ vshl.u32 q2, q2, #24 ++.endm ++ ++generate_composite_function \ ++ pixman_composite_src_x888_8888_asm_neon, 32, 0, 32, \ ++ FLAG_DST_WRITEONLY, \ ++ 8, /* number of pixels, processed in a single block */ \ ++ 10, /* prefetch distance */ \ ++ pixman_composite_src_x888_8888_init, \ ++ default_cleanup, \ ++ pixman_composite_src_x888_8888_process_pixblock_head, \ ++ pixman_composite_src_x888_8888_process_pixblock_tail, \ ++ pixman_composite_src_x888_8888_process_pixblock_tail_head, \ ++ 0, /* dst_w_basereg */ \ ++ 0, /* dst_r_basereg */ \ ++ 0, /* src_basereg */ \ ++ 0 /* mask_basereg */ ++ ++/******************************************************************************/ ++ + .macro pixman_composite_over_n_8_8888_process_pixblock_head + /* expecting deinterleaved source data in {d8, d9, d10, d11} */ + /* d8 - blue, d9 - green, d10 - red, d11 - alpha */ +diff --git a/pixman/pixman-arm-neon.c b/pixman/pixman-arm-neon.c +index 00b5c35..12d92a2 100644 +--- a/pixman/pixman-arm-neon.c ++++ b/pixman/pixman-arm-neon.c +@@ -251,6 +251,7 @@ neon_composite_##name (pixman_implementation_t *imp, \ + + + BIND_SRC_NULL_DST(src_8888_8888, uint32_t, 1, uint32_t, 1) ++BIND_SRC_NULL_DST(src_x888_8888, uint32_t, 1, uint32_t, 1) + BIND_SRC_NULL_DST(src_0565_0565, uint16_t, 1, uint16_t, 1) + BIND_SRC_NULL_DST(src_0888_0888, uint8_t, 3, uint8_t, 3) + BIND_SRC_NULL_DST(src_8888_0565, uint32_t, 1, uint16_t, 1) +@@ -400,6 +401,8 @@ static const pixman_fast_path_t arm_neon_fast_paths[] = + PIXMAN_STD_FAST_PATH (SRC, x8r8g8b8, null, x8r8g8b8, neon_composite_src_8888_8888), + PIXMAN_STD_FAST_PATH (SRC, a8b8g8r8, null, x8b8g8r8, neon_composite_src_8888_8888), + PIXMAN_STD_FAST_PATH (SRC, x8b8g8r8, null, x8b8g8r8, neon_composite_src_8888_8888), ++ PIXMAN_STD_FAST_PATH (SRC, a8r8g8b8, null, a8r8g8b8, neon_composite_src_8888_8888), ++ PIXMAN_STD_FAST_PATH (SRC, x8r8g8b8, null, a8r8g8b8, neon_composite_src_x888_8888), + PIXMAN_STD_FAST_PATH (SRC, r8g8b8, null, r8g8b8, neon_composite_src_0888_0888), + PIXMAN_STD_FAST_PATH (SRC, b8g8r8, null, x8r8g8b8, neon_composite_src_0888_8888_rev), + PIXMAN_STD_FAST_PATH (SRC, b8g8r8, null, r5g6b5, neon_composite_src_0888_0565_rev), +@@ -428,6 +431,7 @@ static const pixman_fast_path_t arm_neon_fast_paths[] = + PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, null, x8r8g8b8, neon_composite_over_8888_8888), + PIXMAN_STD_FAST_PATH (OVER, a8b8g8r8, null, a8b8g8r8, neon_composite_over_8888_8888), + PIXMAN_STD_FAST_PATH (OVER, a8b8g8r8, null, x8b8g8r8, neon_composite_over_8888_8888), ++ PIXMAN_STD_FAST_PATH (OVER, x8r8g8b8, null, a8r8g8b8, neon_composite_src_x888_8888), + PIXMAN_STD_FAST_PATH (ADD, solid, a8, a8, neon_composite_add_n_8_8), + PIXMAN_STD_FAST_PATH (ADD, a8, a8, a8, neon_composite_add_8_8_8), + PIXMAN_STD_FAST_PATH (ADD, a8r8g8b8, a8r8g8b8, a8r8g8b8, neon_composite_add_8888_8888_8888), +-- +cgit v0.8.3-6-g21f6 diff --git a/recipes/xorg-lib/pixman-0.17.8/3-composite.patch b/recipes/xorg-lib/pixman-0.17.8/3-composite.patch new file mode 100644 index 0000000000..81f3ff162b --- /dev/null +++ b/recipes/xorg-lib/pixman-0.17.8/3-composite.patch @@ -0,0 +1,105 @@ +From 80b75405277bacc0df0ef7d91f1a2eabefb97901 Mon Sep 17 00:00:00 2001 +From: Siarhei Siamashka <siarhei.siamashka@nokia.com> +Date: Wed, 24 Feb 2010 02:14:45 +0000 +Subject: 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 + +[ # ] 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 +--- +diff --git a/pixman/pixman-arm-neon-asm.S b/pixman/pixman-arm-neon-asm.S +index 42ac1cb..272da27 100644 +--- a/pixman/pixman-arm-neon-asm.S ++++ b/pixman/pixman-arm-neon-asm.S +@@ -680,6 +680,61 @@ generate_composite_function \ + + /******************************************************************************/ + ++.macro pixman_composite_over_reverse_n_8888_process_pixblock_tail_head ++ vrshr.u16 q14, q8, #8 ++ PF add PF_X, PF_X, #8 ++ PF tst PF_CTL, #0xF ++ vrshr.u16 q15, q9, #8 ++ vrshr.u16 q12, q10, #8 ++ vrshr.u16 q13, q11, #8 ++ PF addne PF_X, PF_X, #8 ++ PF subne PF_CTL, PF_CTL, #1 ++ vraddhn.u16 d28, q14, q8 ++ vraddhn.u16 d29, q15, q9 ++ PF cmp PF_X, ORIG_W ++ vraddhn.u16 d30, q12, q10 ++ vraddhn.u16 d31, q13, q11 ++ vqadd.u8 q14, q0, q14 ++ vqadd.u8 q15, q1, q15 ++ vld4.8 {d0, d1, d2, d3}, [DST_R, :128]! ++ vmvn.8 d22, d3 ++ PF pld, [PF_DST, PF_X, lsl #dst_bpp_shift] ++ vst4.8 {d28, d29, d30, d31}, [DST_W, :128]! ++ PF subge PF_X, PF_X, ORIG_W ++ vmull.u8 q8, d22, d4 ++ PF subges PF_CTL, PF_CTL, #0x10 ++ vmull.u8 q9, d22, d5 ++ vmull.u8 q10, d22, d6 ++ PF ldrgeb DUMMY, [PF_DST, DST_STRIDE, lsl #dst_bpp_shift]! ++ vmull.u8 q11, d22, d7 ++.endm ++ ++.macro pixman_composite_over_reverse_n_8888_init ++ add DUMMY, sp, #ARGS_STACK_OFFSET ++ vld1.32 {d7[0]}, [DUMMY] ++ vdup.8 d4, d7[0] ++ vdup.8 d5, d7[1] ++ vdup.8 d6, d7[2] ++ vdup.8 d7, d7[3] ++.endm ++ ++generate_composite_function \ ++ pixman_composite_over_reverse_n_8888_asm_neon, 0, 0, 32, \ ++ FLAG_DST_READWRITE | FLAG_DEINTERLEAVE_32BPP, \ ++ 8, /* number of pixels, processed in a single block */ \ ++ 5, /* prefetch distance */ \ ++ pixman_composite_over_reverse_n_8888_init, \ ++ default_cleanup, \ ++ pixman_composite_over_8888_8888_process_pixblock_head, \ ++ pixman_composite_over_8888_8888_process_pixblock_tail, \ ++ pixman_composite_over_reverse_n_8888_process_pixblock_tail_head, \ ++ 28, /* dst_w_basereg */ \ ++ 0, /* dst_r_basereg */ \ ++ 4, /* src_basereg */ \ ++ 24 /* mask_basereg */ ++ ++/******************************************************************************/ ++ + .macro pixman_composite_over_n_8_0565_process_pixblock_head + /* in */ + vmull.u8 q0, d24, d8 +diff --git a/pixman/pixman-arm-neon.c b/pixman/pixman-arm-neon.c +index 12d92a2..417ce5a 100644 +--- a/pixman/pixman-arm-neon.c ++++ b/pixman/pixman-arm-neon.c +@@ -264,6 +264,7 @@ BIND_SRC_NULL_DST(add_8888_8888, uint32_t, 1, uint32_t, 1) + + BIND_N_NULL_DST(over_n_0565, uint16_t, 1) + BIND_N_NULL_DST(over_n_8888, uint32_t, 1) ++BIND_N_NULL_DST(over_reverse_n_8888, uint32_t, 1) + + BIND_SRC_NULL_DST(over_8888_0565, uint32_t, 1, uint16_t, 1) + BIND_SRC_NULL_DST(over_8888_8888, uint32_t, 1, uint32_t, 1) +@@ -438,6 +439,7 @@ static const pixman_fast_path_t arm_neon_fast_paths[] = + PIXMAN_STD_FAST_PATH (ADD, a8, null, a8, neon_composite_add_8000_8000), + PIXMAN_STD_FAST_PATH (ADD, a8r8g8b8, null, a8r8g8b8, neon_composite_add_8888_8888), + PIXMAN_STD_FAST_PATH (ADD, a8b8g8r8, null, a8b8g8r8, neon_composite_add_8888_8888), ++ PIXMAN_STD_FAST_PATH (OVER_REVERSE, solid, null, a8r8g8b8, neon_composite_over_reverse_n_8888), + + { PIXMAN_OP_NONE }, + }; +-- +cgit v0.8.3-6-g21f6 diff --git a/recipes/xorg-lib/pixman_0.17.8.bb b/recipes/xorg-lib/pixman_0.17.8.bb new file mode 100644 index 0000000000..db07089ffa --- /dev/null +++ b/recipes/xorg-lib/pixman_0.17.8.bb @@ -0,0 +1,33 @@ +SECTION = "libs" +PRIORITY = "optional" +DESCRIPTION = "Low-level pixel manipulation library." +LICENSE = "X11" + +DEFAULT_PREFERENCE = "-1" +DEFAULT_PREFERENCE_angstrom = "2" + +BBCLASSEXTEND="native" + +SRC_URI = "http://cairographics.org/releases/pixman-${PV}.tar.gz;name=archive \ + file://0003-Generic-C-implementation-of-pixman_blt-with-overlapp.patch;patch=1 \ + file://0004-Support-of-overlapping-src-dst-for-pixman_blt_mmx.patch;patch=1 \ + file://0005-Support-of-overlapping-src-dst-for-pixman_blt_sse2.patch;patch=1 \ + file://0006-Support-of-overlapping-src-dst-for-pixman_blt_neon.patch;patch=1 \ + file://1-composite.patch;patch=1 \ + file://2-composite.patch;patch=1 \ + file://3-composite.patch;patch=1 \ + " + +SRC_URI[archive.md5sum] = "a7deb2ff6b286b676d67aa6ae91317ae" +SRC_URI[archive.sha256sum] = "ea24e9003455a0881bd43bf7e4169f2b34c90c8521405103e3490553876a81b4" + + +inherit autotools_stage + +NEON = " --disable-arm-neon " +NEON_armv7a = "" + +EXTRA_OECONF = "${NEON} --disable-gtk" + +AUTOTOOLS_STAGE_PKGCONFIG = "1" + diff --git a/recipes/xorg-lib/pixman_git.bb b/recipes/xorg-lib/pixman_git.bb index 06547d3ddb..199c2fb4ca 100644 --- a/recipes/xorg-lib/pixman_git.bb +++ b/recipes/xorg-lib/pixman_git.bb @@ -12,7 +12,6 @@ BBCLASSEXTEND="native" SRCREV = "c97b1e803fc214e9880eaeff98410c8fa37f9ddc" DEFAULT_PREFERENCE = "-1" -DEFAULT_PREFERENCE_angstrom = "1" DEFAULT_PREFERENCE_shr = "1" SRC_URI = "git://anongit.freedesktop.org/pixman;protocol=git \ -- cgit v1.2.3 From 7bf36e82698d52f8524ccde1ce2d85fc654bd68c Mon Sep 17 00:00:00 2001 From: Martin Jansa <Martin.Jansa@gmail.com> Date: Thu, 25 Feb 2010 10:45:38 +0100 Subject: pixman: increase preference of 0.17.8 for SHR Signed-off-by: Martin Jansa <Martin.Jansa@gmail.com> --- recipes/xorg-lib/pixman_0.17.8.bb | 1 + 1 file changed, 1 insertion(+) (limited to 'recipes/xorg-lib') diff --git a/recipes/xorg-lib/pixman_0.17.8.bb b/recipes/xorg-lib/pixman_0.17.8.bb index db07089ffa..7ddb142057 100644 --- a/recipes/xorg-lib/pixman_0.17.8.bb +++ b/recipes/xorg-lib/pixman_0.17.8.bb @@ -5,6 +5,7 @@ LICENSE = "X11" DEFAULT_PREFERENCE = "-1" DEFAULT_PREFERENCE_angstrom = "2" +DEFAULT_PREFERENCE_shr = "2" BBCLASSEXTEND="native" -- cgit v1.2.3 From b141cd6cf58156e8d4b410ab93702b3c53393e02 Mon Sep 17 00:00:00 2001 From: Martin Jansa <Martin.Jansa@gmail.com> Date: Thu, 25 Feb 2010 10:46:00 +0100 Subject: pixman: move 0.17.6 to obsolete * This version wasn't as well tested as 0.17.8 probably is, 0.17.6 * wasn't probably used except SHR, which also moved to 0.17.8 now Signed-off-by: Martin Jansa <Martin.Jansa@gmail.com> --- ...Dropped-delegation-support-for-pixman_blt.patch | 356 --------------------- ...0002-Test-program-for-pixman_blt-function.patch | 178 ----------- ...mplementation-of-pixman_blt-with-overlapp.patch | 114 ------- ...of-overlapping-src-dst-for-pixman_blt_mmx.patch | 91 ------ ...f-overlapping-src-dst-for-pixman_blt_sse2.patch | 91 ------ ...f-overlapping-src-dst-for-pixman_blt_neon.patch | 94 ------ recipes/xorg-lib/pixman_0.17.6.bb | 32 -- 7 files changed, 956 deletions(-) delete mode 100644 recipes/xorg-lib/pixman-0.17.6/0001-Dropped-delegation-support-for-pixman_blt.patch delete mode 100644 recipes/xorg-lib/pixman-0.17.6/0002-Test-program-for-pixman_blt-function.patch delete mode 100644 recipes/xorg-lib/pixman-0.17.6/0003-Generic-C-implementation-of-pixman_blt-with-overlapp.patch delete mode 100644 recipes/xorg-lib/pixman-0.17.6/0004-Support-of-overlapping-src-dst-for-pixman_blt_mmx.patch delete mode 100644 recipes/xorg-lib/pixman-0.17.6/0005-Support-of-overlapping-src-dst-for-pixman_blt_sse2.patch delete mode 100644 recipes/xorg-lib/pixman-0.17.6/0006-Support-of-overlapping-src-dst-for-pixman_blt_neon.patch delete mode 100644 recipes/xorg-lib/pixman_0.17.6.bb (limited to 'recipes/xorg-lib') diff --git a/recipes/xorg-lib/pixman-0.17.6/0001-Dropped-delegation-support-for-pixman_blt.patch b/recipes/xorg-lib/pixman-0.17.6/0001-Dropped-delegation-support-for-pixman_blt.patch deleted file mode 100644 index d52ee354dd..0000000000 --- a/recipes/xorg-lib/pixman-0.17.6/0001-Dropped-delegation-support-for-pixman_blt.patch +++ /dev/null @@ -1,356 +0,0 @@ -From c4ce33821e2340ff95e30fce5758013287172d52 Mon Sep 17 00:00:00 2001 -From: Siarhei Siamashka <siarhei.siamashka@nokia.com> -Date: Wed, 21 Oct 2009 23:48:43 +0000 -Subject: Dropped delegation support for 'pixman_blt' - -Function 'pixman_blt' is too simple and hardly needs any -delegation. This reduces call overhead somewhat. The saving -is minor, but every little bit helps. ---- -diff --git a/pixman/pixman-arm-neon.c b/pixman/pixman-arm-neon.c -index efeabeb..c8c5579 100644 ---- a/pixman/pixman-arm-neon.c -+++ b/pixman/pixman-arm-neon.c -@@ -470,35 +470,6 @@ arm_neon_composite (pixman_implementation_t *imp, - } - - static pixman_bool_t --arm_neon_blt (pixman_implementation_t *imp, -- uint32_t * src_bits, -- uint32_t * dst_bits, -- int src_stride, -- int dst_stride, -- int src_bpp, -- int dst_bpp, -- int src_x, -- int src_y, -- int dst_x, -- int dst_y, -- int width, -- int height) --{ -- if (!pixman_blt_neon ( -- src_bits, dst_bits, src_stride, dst_stride, src_bpp, dst_bpp, -- src_x, src_y, dst_x, dst_y, width, height)) -- -- { -- return _pixman_implementation_blt ( -- imp->delegate, -- src_bits, dst_bits, src_stride, dst_stride, src_bpp, dst_bpp, -- src_x, src_y, dst_x, dst_y, width, height); -- } -- -- return TRUE; --} -- --static pixman_bool_t - arm_neon_fill (pixman_implementation_t *imp, - uint32_t * bits, - int stride, -@@ -556,7 +527,7 @@ _pixman_implementation_create_arm_neon (void) - imp->combine_32[PIXMAN_OP_ADD] = neon_combine_add_u; - - imp->composite = arm_neon_composite; -- imp->blt = arm_neon_blt; -+ imp->blt = pixman_blt_neon; - imp->fill = arm_neon_fill; - - return imp; -diff --git a/pixman/pixman-arm-simd.c b/pixman/pixman-arm-simd.c -index 4795246..11c5f1b 100644 ---- a/pixman/pixman-arm-simd.c -+++ b/pixman/pixman-arm-simd.c -@@ -480,6 +480,7 @@ _pixman_implementation_create_arm_simd (void) - pixman_implementation_t *imp = _pixman_implementation_create (general); - - imp->composite = arm_simd_composite; -+ imp->blt = general->blt; - - return imp; - } -diff --git a/pixman/pixman-fast-path.c b/pixman/pixman-fast-path.c -index 75a0c1e..8da6b1f 100644 ---- a/pixman/pixman-fast-path.c -+++ b/pixman/pixman-fast-path.c -@@ -1690,6 +1690,7 @@ _pixman_implementation_create_fast_path (void) - pixman_implementation_t *imp = _pixman_implementation_create (general); - - imp->composite = fast_path_composite; -+ imp->blt = general->blt; - imp->fill = fast_path_fill; - - return imp; -diff --git a/pixman/pixman-general.c b/pixman/pixman-general.c -index c96a3f9..c3f96f9 100644 ---- a/pixman/pixman-general.c -+++ b/pixman/pixman-general.c -@@ -286,8 +286,7 @@ general_composite (pixman_implementation_t * imp, - } - - static pixman_bool_t --general_blt (pixman_implementation_t *imp, -- uint32_t * src_bits, -+general_blt (uint32_t * src_bits, - uint32_t * dst_bits, - int src_stride, - int dst_stride, -diff --git a/pixman/pixman-implementation.c b/pixman/pixman-implementation.c -index 6488332..0520e36 100644 ---- a/pixman/pixman-implementation.c -+++ b/pixman/pixman-implementation.c -@@ -100,27 +100,6 @@ delegate_combine_64_ca (pixman_implementation_t * imp, - } - - static pixman_bool_t --delegate_blt (pixman_implementation_t * imp, -- uint32_t * src_bits, -- uint32_t * dst_bits, -- int src_stride, -- int dst_stride, -- int src_bpp, -- int dst_bpp, -- int src_x, -- int src_y, -- int dst_x, -- int dst_y, -- int width, -- int height) --{ -- return _pixman_implementation_blt ( -- imp->delegate, src_bits, dst_bits, src_stride, dst_stride, -- src_bpp, dst_bpp, src_x, src_y, dst_x, dst_y, -- width, height); --} -- --static pixman_bool_t - delegate_fill (pixman_implementation_t *imp, - uint32_t * bits, - int stride, -@@ -153,7 +132,7 @@ _pixman_implementation_create (pixman_implementation_t *delegate) - /* Fill out function pointers with ones that just delegate - */ - imp->composite = delegate_composite; -- imp->blt = delegate_blt; -+ imp->blt = NULL; - imp->fill = delegate_fill; - - for (i = 0; i < PIXMAN_N_OPERATORS; ++i) -@@ -233,26 +212,6 @@ _pixman_implementation_composite (pixman_implementation_t * imp, - } - - pixman_bool_t --_pixman_implementation_blt (pixman_implementation_t * imp, -- uint32_t * src_bits, -- uint32_t * dst_bits, -- int src_stride, -- int dst_stride, -- int src_bpp, -- int dst_bpp, -- int src_x, -- int src_y, -- int dst_x, -- int dst_y, -- int width, -- int height) --{ -- return (*imp->blt) (imp, src_bits, dst_bits, src_stride, dst_stride, -- src_bpp, dst_bpp, src_x, src_y, dst_x, dst_y, -- width, height); --} -- --pixman_bool_t - _pixman_implementation_fill (pixman_implementation_t *imp, - uint32_t * bits, - int stride, -diff --git a/pixman/pixman-mmx.c b/pixman/pixman-mmx.c -index b1591d9..a3080b6 100644 ---- a/pixman/pixman-mmx.c -+++ b/pixman/pixman-mmx.c -@@ -3318,35 +3318,6 @@ mmx_composite (pixman_implementation_t *imp, - } - - static pixman_bool_t --mmx_blt (pixman_implementation_t *imp, -- uint32_t * src_bits, -- uint32_t * dst_bits, -- int src_stride, -- int dst_stride, -- int src_bpp, -- int dst_bpp, -- int src_x, -- int src_y, -- int dst_x, -- int dst_y, -- int width, -- int height) --{ -- if (!pixman_blt_mmx ( -- src_bits, dst_bits, src_stride, dst_stride, src_bpp, dst_bpp, -- src_x, src_y, dst_x, dst_y, width, height)) -- -- { -- return _pixman_implementation_blt ( -- imp->delegate, -- src_bits, dst_bits, src_stride, dst_stride, src_bpp, dst_bpp, -- src_x, src_y, dst_x, dst_y, width, height); -- } -- -- return TRUE; --} -- --static pixman_bool_t - mmx_fill (pixman_implementation_t *imp, - uint32_t * bits, - int stride, -@@ -3397,7 +3368,7 @@ _pixman_implementation_create_mmx (void) - imp->combine_32_ca[PIXMAN_OP_ADD] = mmx_combine_add_ca; - - imp->composite = mmx_composite; -- imp->blt = mmx_blt; -+ imp->blt = pixman_blt_mmx; - imp->fill = mmx_fill; - - return imp; -diff --git a/pixman/pixman-private.h b/pixman/pixman-private.h -index c99f2a2..209cba4 100644 ---- a/pixman/pixman-private.h -+++ b/pixman/pixman-private.h -@@ -399,8 +399,7 @@ typedef void (*pixman_composite_func_t) (pixman_implementation_t *imp, - int32_t dest_y, - int32_t width, - int32_t height); --typedef pixman_bool_t (*pixman_blt_func_t) (pixman_implementation_t *imp, -- uint32_t * src_bits, -+typedef pixman_bool_t (*pixman_blt_func_t) (uint32_t * src_bits, - uint32_t * dst_bits, - int src_stride, - int dst_stride, -diff --git a/pixman/pixman-sse2.c b/pixman/pixman-sse2.c -index 1f8aa6e..8c2e114 100644 ---- a/pixman/pixman-sse2.c -+++ b/pixman/pixman-sse2.c -@@ -5893,8 +5893,7 @@ sse2_composite (pixman_implementation_t *imp, - __attribute__((__force_align_arg_pointer__)) - #endif - static pixman_bool_t --sse2_blt (pixman_implementation_t *imp, -- uint32_t * src_bits, -+sse2_blt (uint32_t * src_bits, - uint32_t * dst_bits, - int src_stride, - int dst_stride, -@@ -5907,18 +5906,9 @@ sse2_blt (pixman_implementation_t *imp, - int width, - int height) - { -- if (!pixman_blt_sse2 ( -+ return pixman_blt_sse2 ( - src_bits, dst_bits, src_stride, dst_stride, src_bpp, dst_bpp, -- src_x, src_y, dst_x, dst_y, width, height)) -- -- { -- return _pixman_implementation_blt ( -- imp->delegate, -- src_bits, dst_bits, src_stride, dst_stride, src_bpp, dst_bpp, -- src_x, src_y, dst_x, dst_y, width, height); -- } -- -- return TRUE; -+ src_x, src_y, dst_x, dst_y, width, height); - } - - #if defined(__GNUC__) && !defined(__x86_64__) && !defined(__amd64__) -diff --git a/pixman/pixman-vmx.c b/pixman/pixman-vmx.c -index 06325a7..e31bcb3 100644 ---- a/pixman/pixman-vmx.c -+++ b/pixman/pixman-vmx.c -@@ -1615,6 +1615,8 @@ _pixman_implementation_create_vmx (void) - - /* Set up function pointers */ - -+ imp->blt = fast->blt; -+ - imp->combine_32[PIXMAN_OP_OVER] = vmx_combine_over_u; - imp->combine_32[PIXMAN_OP_OVER_REVERSE] = vmx_combine_over_reverse_u; - imp->combine_32[PIXMAN_OP_IN] = vmx_combine_in_u; -diff --git a/pixman/pixman.c b/pixman/pixman.c -index 0edd967..07ad767 100644 ---- a/pixman/pixman.c -+++ b/pixman/pixman.c -@@ -57,6 +57,22 @@ static const optimized_operator_info_t optimized_operators[] = - - static pixman_implementation_t *imp; - -+static pixman_bool_t -+pixman_blt_stub (uint32_t *src_bits, -+ uint32_t *dst_bits, -+ int src_stride, -+ int dst_stride, -+ int src_bpp, -+ int dst_bpp, -+ int src_x, -+ int src_y, -+ int dst_x, -+ int dst_y, -+ int width, -+ int height); -+ -+static pixman_blt_func_t pixman_blt_imp = pixman_blt_stub; -+ - /* - * Check if the current operator could be optimized - */ -@@ -216,6 +232,31 @@ pixman_image_composite (pixman_op_t op, - unapply_workaround (dest, dest_bits, dest_dx, dest_dy); - } - -+static pixman_bool_t -+pixman_blt_stub (uint32_t *src_bits, -+ uint32_t *dst_bits, -+ int src_stride, -+ int dst_stride, -+ int src_bpp, -+ int dst_bpp, -+ int src_x, -+ int src_y, -+ int dst_x, -+ int dst_y, -+ int width, -+ int height) -+{ -+ if (!imp) -+ imp = _pixman_choose_implementation (); -+ -+ pixman_blt_imp = imp->blt; -+ return pixman_blt_imp (src_bits, dst_bits, src_stride, dst_stride, -+ src_bpp, dst_bpp, -+ src_x, src_y, -+ dst_x, dst_y, -+ width, height); -+} -+ - PIXMAN_EXPORT pixman_bool_t - pixman_blt (uint32_t *src_bits, - uint32_t *dst_bits, -@@ -230,14 +271,11 @@ pixman_blt (uint32_t *src_bits, - int width, - int height) - { -- if (!imp) -- imp = _pixman_choose_implementation (); -- -- return _pixman_implementation_blt (imp, src_bits, dst_bits, src_stride, dst_stride, -- src_bpp, dst_bpp, -- src_x, src_y, -- dst_x, dst_y, -- width, height); -+ return pixman_blt_imp (src_bits, dst_bits, src_stride, dst_stride, -+ src_bpp, dst_bpp, -+ src_x, src_y, -+ dst_x, dst_y, -+ width, height); - } - - PIXMAN_EXPORT pixman_bool_t --- -cgit v0.8.3-6-g21f6 diff --git a/recipes/xorg-lib/pixman-0.17.6/0002-Test-program-for-pixman_blt-function.patch b/recipes/xorg-lib/pixman-0.17.6/0002-Test-program-for-pixman_blt-function.patch deleted file mode 100644 index ba62b88447..0000000000 --- a/recipes/xorg-lib/pixman-0.17.6/0002-Test-program-for-pixman_blt-function.patch +++ /dev/null @@ -1,178 +0,0 @@ -From 364406e03f9651aacb1bc684de6c00a27f9df66d Mon Sep 17 00:00:00 2001 -From: Siarhei Siamashka <siarhei.siamashka@nokia.com> -Date: Mon, 19 Oct 2009 20:32:55 +0300 -Subject: [PATCH 2/6] Test program for pixman_blt function - -It can do some basic correctness tests and also check whether -overlapping of source and destination images is supported. ---- - test/Makefile.am | 2 + - test/overlapped-blt-test.c | 136 ++++++++++++++++++++++++++++++++++++++++++++ - 2 files changed, 138 insertions(+), 0 deletions(-) - create mode 100644 test/overlapped-blt-test.c - -diff --git a/test/Makefile.am b/test/Makefile.am -index 89d32e9..40c305f 100644 ---- a/test/Makefile.am -+++ b/test/Makefile.am -@@ -6,6 +6,7 @@ - fetch-test \ - oob-test \ - window-test \ -+ overlapped-blt-test \ - trap-crasher \ - alphamap \ - blitters-test \ -@@ -18,6 +19,7 @@ - trap_crasher_LDADD = $(TEST_LDADD) - oob_test_LDADD = $(TEST_LDADD) - window_test_LDADD = $(TEST_LDADD) -+overlapped_blt_test_LDADD = $(TEST_LDADD) - - blitters_test_LDADD = $(TEST_LDADD) - blitters_test_SOURCES = blitters-test.c utils.c utils.h -diff --git a/test/overlapped-blt-test.c b/test/overlapped-blt-test.c -new file mode 100644 -index 0000000..95fbc54 ---- /dev/null -+++ b/test/overlapped-blt-test.c -@@ -0,0 +1,136 @@ -+/* -+ * A small test program which can check whether pixman_blt function -+ * can support overlapping of source and destination images. -+ * Efficient blit with overlapping is useful for scrolling. -+ */ -+ -+#include <stdint.h> -+#include <stdio.h> -+#include <stdlib.h> -+#include <string.h> -+#include "pixman.h" -+ -+/* reference implementation (slow) */ -+static void -+trivial_copy8_2d ( -+ uint8_t *dst, int dst_stride, -+ uint8_t *src, int src_stride, -+ int dx, int dy, int sx, int sy, -+ int w, int h) -+{ -+ int x, y; -+ uint8_t *tmp = malloc (src_stride * (sy + h)); -+ memcpy (tmp, src, src_stride * (sy + h)); -+ for (y = 0; y < h; y++) -+ { -+ for (x = 0; x < w; x++) -+ { -+ *(dst + (dy + y) * dst_stride + dx + x) = -+ *(tmp + (sy + y) * src_stride + sx + x); -+ } -+ } -+ free (tmp); -+} -+ -+static void -+trivial_copy_2d ( -+ uint8_t *dst, int dst_stride, -+ uint8_t *src, int src_stride, -+ int dx, int dy, int sx, int sy, -+ int w, int h, int bpp) -+{ -+ trivial_copy8_2d (dst, dst_stride, src, src_stride, -+ dx * (bpp / 8), dy, sx * (bpp / 8), sy, w * (bpp / 8), h); -+} -+ -+/* now the test itself */ -+ -+#define ST_UNSUPPORTED 1 -+#define ST_NORMAL_BUG 2 -+#define ST_OVERLAPPED_BUG 4 -+ -+#define MAX_SIZE_X 64 -+#define MAX_SIZE_Y 64 -+ -+static void print_result(int bpp, int flags) -+{ -+ printf("bpp=%d, supported=%d, normal_ok=%d, overlapped_ok=%d\n", -+ bpp, -+ !(flags & ST_UNSUPPORTED), -+ !(flags & ST_NORMAL_BUG), -+ !(flags & ST_OVERLAPPED_BUG)); -+} -+ -+int main() -+{ -+ int c = 100000, r; -+ int bpp_st[33] = {0}; -+ srand(0); -+ while (c-- > 0) -+ { -+ uint8_t *src1, *src2, *src3; -+ int i; -+ int sizex = rand() % MAX_SIZE_X + 1; -+ int sizey = rand() % MAX_SIZE_Y + 1; -+ int sx = rand() % sizex; -+ int sy = rand() % sizey; -+ int dx = rand() % sizex; -+ int dy = rand() % sizey; -+ int w = rand() % sizex; -+ int h = rand() % sizex; -+ int bpp = 8 * (1 << (rand() % 3)); -+ int stride_delta = rand() % 8; -+ int bufsize; -+ if ((sizex + stride_delta) % 4) -+ stride_delta += 4 - ((sizex + stride_delta) % 4); -+ bufsize = (sizex + stride_delta) * sizey * bpp / 8; -+ src1 = malloc (bufsize); -+ src2 = malloc (bufsize); -+ src3 = malloc (bufsize); -+ for (i = 0; i < bufsize; i++) -+ src1[i] = rand(); -+ memcpy (src2, src1, bufsize); -+ memcpy (src3, src1, bufsize); -+ if (sx + w > sizex) -+ w = sizex - sx; -+ if (dx + w > sizex) -+ w = sizex - dx; -+ if (sy + h > sizey) -+ h = sizey - sy; -+ if (dy + h > sizey) -+ h = sizey - dy; -+ /* get reference result */ -+ trivial_copy_2d (src1, (sizex + stride_delta) * bpp / 8, -+ src1, (sizex + stride_delta) * bpp / 8, -+ dx, dy, sx, sy, w, h, bpp); -+ /* check nonoverlapped pixman result */ -+ r = pixman_blt ((uint32_t *)src3, (uint32_t *)src2, -+ (sizex + stride_delta) * bpp / 8 / 4, -+ (sizex + stride_delta) * bpp / 8 / 4, -+ bpp, bpp, sx, sy, dx, dy, w, h); -+ if (!r) -+ bpp_st[bpp] |= ST_UNSUPPORTED; -+ if (memcmp (src1, src2, bufsize) != 0) -+ bpp_st[bpp] |= ST_NORMAL_BUG; -+ /* check overlapped pixman result */ -+ r = pixman_blt ((uint32_t *)src3, (uint32_t *)src3, -+ (sizex + stride_delta) * bpp / 8 / 4, -+ (sizex + stride_delta) * bpp / 8 / 4, -+ bpp, bpp, sx, sy, dx, dy, w, h); -+ if (!r) -+ bpp_st[bpp] |= ST_UNSUPPORTED; -+ if (memcmp (src1, src3, bufsize) != 0) -+ bpp_st[bpp] |= ST_OVERLAPPED_BUG; -+ /* free buffers */ -+ free (src1); -+ free (src2); -+ free (src3); -+ } -+ -+ /* report results */ -+ print_result (8, bpp_st[8]); -+ print_result (16, bpp_st[16]); -+ print_result (32, bpp_st[32]); -+ -+ return 0; -+} --- -1.6.2.4 - diff --git a/recipes/xorg-lib/pixman-0.17.6/0003-Generic-C-implementation-of-pixman_blt-with-overlapp.patch b/recipes/xorg-lib/pixman-0.17.6/0003-Generic-C-implementation-of-pixman_blt-with-overlapp.patch deleted file mode 100644 index 25ce7ee3b8..0000000000 --- a/recipes/xorg-lib/pixman-0.17.6/0003-Generic-C-implementation-of-pixman_blt-with-overlapp.patch +++ /dev/null @@ -1,114 +0,0 @@ -From c29c9fa826b7112156fd6150b5f1564227935c05 Mon Sep 17 00:00:00 2001 -From: Siarhei Siamashka <siarhei.siamashka@nokia.com> -Date: Thu, 22 Oct 2009 05:27:33 +0300 -Subject: [PATCH 3/6] Generic C implementation of pixman_blt with overlapping support - -Uses memcpy/memmove functions to copy pixels, can handle the -case when both source and destination areas are in the same -image (this is useful for scrolling). - -It is assumed that copying direction is only important when -using the same image for both source and destination (and -src_stride == dst_stride). Copying direction is undefined -for the images with different source and destination stride -which happen to be in the overlapped areas (but this is an -unrealistic case anyway). ---- - pixman/pixman-general.c | 21 ++++++++++++++++++--- - pixman/pixman-private.h | 43 +++++++++++++++++++++++++++++++++++++++++++ - 2 files changed, 61 insertions(+), 3 deletions(-) - -diff --git a/pixman/pixman-general.c b/pixman/pixman-general.c -index c96a3f9..d71a299 100644 ---- a/pixman/pixman-general.c -+++ b/pixman/pixman-general.c -@@ -300,9 +300,24 @@ general_blt (pixman_implementation_t *imp, - int width, - int height) - { -- /* We can't blit unless we have sse2 or mmx */ -- -- return FALSE; -+ uint8_t *dst_bytes = (uint8_t *)dst_bits; -+ uint8_t *src_bytes = (uint8_t *)src_bits; -+ int bpp; -+ -+ if (src_bpp != dst_bpp || src_bpp & 7) -+ return FALSE; -+ -+ bpp = src_bpp >> 3; -+ width *= bpp; -+ src_stride *= 4; -+ dst_stride *= 4; -+ pixman_blt_helper (src_bytes + src_y * src_stride + src_x * bpp, -+ dst_bytes + dst_y * dst_stride + dst_x * bpp, -+ src_stride, -+ dst_stride, -+ width, -+ height); -+ return TRUE; - } - - static pixman_bool_t -diff --git a/pixman/pixman-private.h b/pixman/pixman-private.h -index 5000f91..8c5d4fd 100644 ---- a/pixman/pixman-private.h -+++ b/pixman/pixman-private.h -@@ -10,6 +10,7 @@ - - #include "pixman.h" - #include <time.h> -+#include <string.h> - #include <assert.h> - - #include "pixman-compiler.h" -@@ -794,4 +795,46 @@ void pixman_timer_register (pixman_timer_t *timer); - - #endif /* PIXMAN_TIMERS */ - -+/* a helper function, can blit 8-bit images with src/dst overlapping support */ -+static inline void -+pixman_blt_helper (uint8_t *src_bytes, -+ uint8_t *dst_bytes, -+ int src_stride, -+ int dst_stride, -+ int width, -+ int height) -+{ -+ /* -+ * The second part of this check is not strictly needed, but it prevents -+ * unnecessary upside-down processing of areas which belong to different -+ * images. Upside-down processing can be slower with fixed-distance-ahead -+ * prefetch and perceived as having more tearing. -+ */ -+ if (src_bytes < dst_bytes + width && -+ src_bytes + src_stride * height > dst_bytes) -+ { -+ src_bytes += src_stride * height - src_stride; -+ dst_bytes += dst_stride * height - dst_stride; -+ dst_stride = -dst_stride; -+ src_stride = -src_stride; -+ /* Horizontal scrolling to the left needs memmove */ -+ if (src_bytes + width > dst_bytes) -+ { -+ while (--height >= 0) -+ { -+ memmove (dst_bytes, src_bytes, width); -+ dst_bytes += dst_stride; -+ src_bytes += src_stride; -+ } -+ return; -+ } -+ } -+ while (--height >= 0) -+ { -+ memcpy (dst_bytes, src_bytes, width); -+ dst_bytes += dst_stride; -+ src_bytes += src_stride; -+ } -+} -+ - #endif /* PIXMAN_PRIVATE_H */ --- -1.6.2.4 - diff --git a/recipes/xorg-lib/pixman-0.17.6/0004-Support-of-overlapping-src-dst-for-pixman_blt_mmx.patch b/recipes/xorg-lib/pixman-0.17.6/0004-Support-of-overlapping-src-dst-for-pixman_blt_mmx.patch deleted file mode 100644 index 74c7b45bc4..0000000000 --- a/recipes/xorg-lib/pixman-0.17.6/0004-Support-of-overlapping-src-dst-for-pixman_blt_mmx.patch +++ /dev/null @@ -1,91 +0,0 @@ -From 7ca32542c957ff308a6ca7e3715e6552a65ae395 Mon Sep 17 00:00:00 2001 -From: Siarhei Siamashka <siarhei.siamashka@nokia.com> -Date: Thu, 22 Oct 2009 05:45:47 +0300 -Subject: [PATCH 4/6] Support of overlapping src/dst for pixman_blt_mmx - ---- - pixman/pixman-mmx.c | 55 +++++++++++++++++++++++++++++--------------------- - 1 files changed, 32 insertions(+), 23 deletions(-) - -diff --git a/pixman/pixman-mmx.c b/pixman/pixman-mmx.c -index 819e3a0..dcccadb 100644 ---- a/pixman/pixman-mmx.c -+++ b/pixman/pixman-mmx.c -@@ -3002,34 +3002,43 @@ pixman_blt_mmx (uint32_t *src_bits, - { - uint8_t * src_bytes; - uint8_t * dst_bytes; -- int byte_width; -+ int bpp; - -- if (src_bpp != dst_bpp) -+ if (src_bpp != dst_bpp || src_bpp & 7) - return FALSE; - -- if (src_bpp == 16) -- { -- src_stride = src_stride * (int) sizeof (uint32_t) / 2; -- dst_stride = dst_stride * (int) sizeof (uint32_t) / 2; -- src_bytes = (uint8_t *)(((uint16_t *)src_bits) + src_stride * (src_y) + (src_x)); -- dst_bytes = (uint8_t *)(((uint16_t *)dst_bits) + dst_stride * (dst_y) + (dst_x)); -- byte_width = 2 * width; -- src_stride *= 2; -- dst_stride *= 2; -- } -- else if (src_bpp == 32) -+ bpp = src_bpp >> 3; -+ width *= bpp; -+ src_stride *= 4; -+ dst_stride *= 4; -+ src_bytes = (uint8_t *)src_bits + src_y * src_stride + src_x * bpp; -+ dst_bytes = (uint8_t *)dst_bits + dst_y * dst_stride + dst_x * bpp; -+ -+ if (src_bpp != 16 && src_bpp != 32) - { -- src_stride = src_stride * (int) sizeof (uint32_t) / 4; -- dst_stride = dst_stride * (int) sizeof (uint32_t) / 4; -- src_bytes = (uint8_t *)(((uint32_t *)src_bits) + src_stride * (src_y) + (src_x)); -- dst_bytes = (uint8_t *)(((uint32_t *)dst_bits) + dst_stride * (dst_y) + (dst_x)); -- byte_width = 4 * width; -- src_stride *= 4; -- dst_stride *= 4; -+ pixman_blt_helper (src_bytes, dst_bytes, src_stride, dst_stride, -+ width, height); -+ return TRUE; - } -- else -+ -+ if (src_bytes < dst_bytes && src_bytes + src_stride * height > dst_bytes) - { -- return FALSE; -+ src_bytes += src_stride * height - src_stride; -+ dst_bytes += dst_stride * height - dst_stride; -+ dst_stride = -dst_stride; -+ src_stride = -src_stride; -+ -+ if (src_bytes + width > dst_bytes) -+ { -+ /* TODO: reverse scanline copy using MMX */ -+ while (--height >= 0) -+ { -+ memmove (dst_bytes, src_bytes, width); -+ dst_bytes += dst_stride; -+ src_bytes += src_stride; -+ } -+ return TRUE; -+ } - } - - while (height--) -@@ -3039,7 +3048,7 @@ pixman_blt_mmx (uint32_t *src_bits, - uint8_t *d = dst_bytes; - src_bytes += src_stride; - dst_bytes += dst_stride; -- w = byte_width; -+ w = width; - - while (w >= 2 && ((unsigned long)d & 3)) - { --- -1.6.2.4 - diff --git a/recipes/xorg-lib/pixman-0.17.6/0005-Support-of-overlapping-src-dst-for-pixman_blt_sse2.patch b/recipes/xorg-lib/pixman-0.17.6/0005-Support-of-overlapping-src-dst-for-pixman_blt_sse2.patch deleted file mode 100644 index 3704fbf1cf..0000000000 --- a/recipes/xorg-lib/pixman-0.17.6/0005-Support-of-overlapping-src-dst-for-pixman_blt_sse2.patch +++ /dev/null @@ -1,91 +0,0 @@ -From edc80b41c6480b7c80ec5f7c835c92b2debb3774 Mon Sep 17 00:00:00 2001 -From: Siarhei Siamashka <siarhei.siamashka@nokia.com> -Date: Thu, 22 Oct 2009 05:45:54 +0300 -Subject: [PATCH 5/6] Support of overlapping src/dst for pixman_blt_sse2 - ---- - pixman/pixman-sse2.c | 55 +++++++++++++++++++++++++++++-------------------- - 1 files changed, 32 insertions(+), 23 deletions(-) - -diff --git a/pixman/pixman-sse2.c b/pixman/pixman-sse2.c -index 78b0ad1..b84636b 100644 ---- a/pixman/pixman-sse2.c -+++ b/pixman/pixman-sse2.c -@@ -5300,34 +5300,43 @@ pixman_blt_sse2 (uint32_t *src_bits, - { - uint8_t * src_bytes; - uint8_t * dst_bytes; -- int byte_width; -+ int bpp; - -- if (src_bpp != dst_bpp) -+ if (src_bpp != dst_bpp || src_bpp & 7) - return FALSE; - -- if (src_bpp == 16) -- { -- src_stride = src_stride * (int) sizeof (uint32_t) / 2; -- dst_stride = dst_stride * (int) sizeof (uint32_t) / 2; -- src_bytes =(uint8_t *)(((uint16_t *)src_bits) + src_stride * (src_y) + (src_x)); -- dst_bytes = (uint8_t *)(((uint16_t *)dst_bits) + dst_stride * (dst_y) + (dst_x)); -- byte_width = 2 * width; -- src_stride *= 2; -- dst_stride *= 2; -- } -- else if (src_bpp == 32) -+ bpp = src_bpp >> 3; -+ width *= bpp; -+ src_stride *= 4; -+ dst_stride *= 4; -+ src_bytes = (uint8_t *)src_bits + src_y * src_stride + src_x * bpp; -+ dst_bytes = (uint8_t *)dst_bits + dst_y * dst_stride + dst_x * bpp; -+ -+ if (src_bpp != 16 && src_bpp != 32) - { -- src_stride = src_stride * (int) sizeof (uint32_t) / 4; -- dst_stride = dst_stride * (int) sizeof (uint32_t) / 4; -- src_bytes = (uint8_t *)(((uint32_t *)src_bits) + src_stride * (src_y) + (src_x)); -- dst_bytes = (uint8_t *)(((uint32_t *)dst_bits) + dst_stride * (dst_y) + (dst_x)); -- byte_width = 4 * width; -- src_stride *= 4; -- dst_stride *= 4; -+ pixman_blt_helper (src_bytes, dst_bytes, src_stride, dst_stride, -+ width, height); -+ return TRUE; - } -- else -+ -+ if (src_bytes < dst_bytes && src_bytes + src_stride * height > dst_bytes) - { -- return FALSE; -+ src_bytes += src_stride * height - src_stride; -+ dst_bytes += dst_stride * height - dst_stride; -+ dst_stride = -dst_stride; -+ src_stride = -src_stride; -+ -+ if (src_bytes + width > dst_bytes) -+ { -+ /* TODO: reverse scanline copy using SSE2 */ -+ while (--height >= 0) -+ { -+ memmove (dst_bytes, src_bytes, width); -+ dst_bytes += dst_stride; -+ src_bytes += src_stride; -+ } -+ return TRUE; -+ } - } - - cache_prefetch ((__m128i*)src_bytes); -@@ -5340,7 +5349,7 @@ pixman_blt_sse2 (uint32_t *src_bits, - uint8_t *d = dst_bytes; - src_bytes += src_stride; - dst_bytes += dst_stride; -- w = byte_width; -+ w = width; - - cache_prefetch_next ((__m128i*)s); - cache_prefetch_next ((__m128i*)d); --- -1.6.2.4 - diff --git a/recipes/xorg-lib/pixman-0.17.6/0006-Support-of-overlapping-src-dst-for-pixman_blt_neon.patch b/recipes/xorg-lib/pixman-0.17.6/0006-Support-of-overlapping-src-dst-for-pixman_blt_neon.patch deleted file mode 100644 index 7c22483a2e..0000000000 --- a/recipes/xorg-lib/pixman-0.17.6/0006-Support-of-overlapping-src-dst-for-pixman_blt_neon.patch +++ /dev/null @@ -1,94 +0,0 @@ -From 86870ff530b5e435034bd80207e5758466d96cff Mon Sep 17 00:00:00 2001 -From: Siarhei Siamashka <siarhei.siamashka@nokia.com> -Date: Wed, 18 Nov 2009 06:08:48 +0200 -Subject: [PATCH 6/6] Support of overlapping src/dst for pixman_blt_neon - ---- - pixman/pixman-arm-neon.c | 63 ++++++++++++++++++++++++++++++++++++++------- - 1 files changed, 53 insertions(+), 10 deletions(-) - -diff --git a/pixman/pixman-arm-neon.c b/pixman/pixman-arm-neon.c -index 495fda4..c632ff5 100644 ---- a/pixman/pixman-arm-neon.c -+++ b/pixman/pixman-arm-neon.c -@@ -357,26 +357,66 @@ - int width, - int height) - { -- if (src_bpp != dst_bpp) -+ uint8_t * src_bytes; -+ uint8_t * dst_bytes; -+ int bpp; -+ -+ if (src_bpp != dst_bpp || src_bpp & 7) - return FALSE; - -+ bpp = src_bpp >> 3; -+ width *= bpp; -+ src_stride *= 4; -+ dst_stride *= 4; -+ src_bytes = (uint8_t *)src_bits + src_y * src_stride + src_x * bpp; -+ dst_bytes = (uint8_t *)dst_bits + dst_y * dst_stride + dst_x * bpp; -+ -+ if (src_bpp != 16 && src_bpp != 32) -+ { -+ pixman_blt_helper (src_bytes, dst_bytes, src_stride, dst_stride, -+ width, height); -+ return TRUE; -+ } -+ -+ if (src_bytes < dst_bytes && src_bytes + src_stride * height > dst_bytes) -+ { -+ src_bytes += src_stride * height - src_stride; -+ dst_bytes += dst_stride * height - dst_stride; -+ dst_stride = -dst_stride; -+ src_stride = -src_stride; -+ -+ if (src_bytes + width > dst_bytes) -+ { -+ /* TODO: reverse scanline copy using NEON */ -+ while (--height >= 0) -+ { -+ memmove (dst_bytes, src_bytes, width); -+ dst_bytes += dst_stride; -+ src_bytes += src_stride; -+ } -+ return TRUE; -+ } -+ } -+ - switch (src_bpp) - { - case 16: - pixman_composite_src_0565_0565_asm_neon ( -- width, height, -- (uint16_t *)(((char *) dst_bits) + -- dst_y * dst_stride * 4 + dst_x * 2), dst_stride * 2, -- (uint16_t *)(((char *) src_bits) + -- src_y * src_stride * 4 + src_x * 2), src_stride * 2); -+ width >> 1, -+ height, -+ (uint16_t *) dst_bytes, -+ dst_stride >> 1, -+ (uint16_t *) src_bytes, -+ src_stride >> 1); - return TRUE; - case 32: - pixman_composite_src_8888_8888_asm_neon ( -- width, height, -- (uint32_t *)(((char *) dst_bits) + -- dst_y * dst_stride * 4 + dst_x * 4), dst_stride, -- (uint32_t *)(((char *) src_bits) + -- src_y * src_stride * 4 + src_x * 4), src_stride); -+ width >> 2, -+ height, -+ (uint32_t *) dst_bytes, -+ dst_stride >> 2, -+ (uint32_t *) src_bytes, -+ src_stride >> 2); - return TRUE; - default: - return FALSE; --- -1.6.2.4 - diff --git a/recipes/xorg-lib/pixman_0.17.6.bb b/recipes/xorg-lib/pixman_0.17.6.bb deleted file mode 100644 index 01febb81dd..0000000000 --- a/recipes/xorg-lib/pixman_0.17.6.bb +++ /dev/null @@ -1,32 +0,0 @@ -SECTION = "libs" -PRIORITY = "optional" -DESCRIPTION = "Low-level pixel manipulation library." -LICENSE = "X11" - -DEFAULT_PREFERENCE = "-1" -DEFAULT_PREFERENCE_shr = "1" - -PR = "r1" - -BBCLASSEXTEND="native" - -SRC_URI = "http://cairographics.org/releases/pixman-${PV}.tar.gz;name=archive \ - file://0001-Dropped-delegation-support-for-pixman_blt.patch;patch=1 \ - file://0002-Test-program-for-pixman_blt-function.patch;patch=1 \ - file://0003-Generic-C-implementation-of-pixman_blt-with-overlapp.patch;patch=1 \ - file://0004-Support-of-overlapping-src-dst-for-pixman_blt_mmx.patch;patch=1 \ - file://0005-Support-of-overlapping-src-dst-for-pixman_blt_sse2.patch;patch=1 \ - file://0006-Support-of-overlapping-src-dst-for-pixman_blt_neon.patch;patch=1 \ - " -SRC_URI[archive.md5sum] = "32cbdf7a1ac1c275ee56230e26701456" -SRC_URI[archive.sha256sum] = "14ea5a185d8ea6ce3203ff008279e3f3433b6a5bad5853b42a82978527e618cb" - -inherit autotools_stage - -NEON = " --disable-arm-neon " -NEON_armv7a = "" - -EXTRA_OECONF = "${NEON} --disable-gtk" - -AUTOTOOLS_STAGE_PKGCONFIG = "1" - -- cgit v1.2.3 From b6e82ec5da43b07d96e6fe2ba251e6783004a344 Mon Sep 17 00:00:00 2001 From: Koen Kooi <koen@openembedded.org> Date: Fri, 26 Feb 2010 20:10:10 +0100 Subject: pixman 0.17.8: update neon patches to also include BGRA --- recipes/xorg-lib/pixman-0.17.8/1-composite.patch | 46 ++++++++++++------------ recipes/xorg-lib/pixman-0.17.8/2-composite.patch | 12 ++++--- recipes/xorg-lib/pixman-0.17.8/3-composite.patch | 11 +++--- recipes/xorg-lib/pixman_0.17.8.bb | 7 ++-- 4 files changed, 40 insertions(+), 36 deletions(-) (limited to 'recipes/xorg-lib') diff --git a/recipes/xorg-lib/pixman-0.17.8/1-composite.patch b/recipes/xorg-lib/pixman-0.17.8/1-composite.patch index 761a2b937a..31bfa39cc4 100644 --- a/recipes/xorg-lib/pixman-0.17.8/1-composite.patch +++ b/recipes/xorg-lib/pixman-0.17.8/1-composite.patch @@ -1,4 +1,4 @@ -From 138d38f68bb2f955ca209f7412002a983a32a2fd Mon Sep 17 00:00:00 2001 +From 78652135f48c6a304fc2e75bc0e440b8b2034a4d Mon Sep 17 00:00:00 2001 From: Siarhei Siamashka <siarhei.siamashka@nokia.com> Date: Tue, 23 Feb 2010 23:44:00 +0000 Subject: ARM: added 'neon_composite_over_n_8888_8888_ca' fast path @@ -19,10 +19,10 @@ after: [ 0] image firefox-talos-gfx 111.810 112.196 0.23% 6/6 --- diff --git a/pixman/pixman-arm-neon-asm.S b/pixman/pixman-arm-neon-asm.S -index 2986884..2db4da8 100644 +index 2986884..e90d662 100644 --- a/pixman/pixman-arm-neon-asm.S +++ b/pixman/pixman-arm-neon-asm.S -@@ -1026,6 +1026,113 @@ generate_composite_function \ +@@ -1026,6 +1026,111 @@ generate_composite_function \ /******************************************************************************/ @@ -34,31 +34,29 @@ index 2986884..2db4da8 100644 + * dest in {d4, d5, d6, d7 } + * mask in {d24, d25, d26, d27} + * output: updated src in {d0, d1, d2, d3 } -+ * updated mask in {d24, d25, d26, d27} ++ * updated mask in {d24, d25, d26, d3 } + */ + vmull.u8 q0, d24, d8 + vmull.u8 q1, d25, d9 + vmull.u8 q6, d26, d10 + vmull.u8 q7, d27, d11 -+ vmull.u8 q9, d11, d24 -+ vmull.u8 q12, d11, d25 ++ vmull.u8 q9, d11, d25 ++ vmull.u8 q12, d11, d24 + vmull.u8 q13, d11, d26 -+ vrshr.u16 q10, q0, #8 -+ vrshr.u16 q11, q1, #8 -+ vrshr.u16 q8, q6, #8 -+ vraddhn.u16 d0, q0, q10 -+ vraddhn.u16 d1, q1, q11 -+ vraddhn.u16 d2, q6, q8 ++ vrshr.u16 q8, q0, #8 ++ vrshr.u16 q10, q1, #8 ++ vrshr.u16 q11, q6, #8 ++ vraddhn.u16 d0, q0, q8 ++ vraddhn.u16 d1, q1, q10 ++ vraddhn.u16 d2, q6, q11 ++ vrshr.u16 q11, q12, #8 ++ vrshr.u16 q8, q9, #8 ++ vrshr.u16 q6, q13, #8 + vrshr.u16 q10, q7, #8 -+ vrshr.u16 q11, q9, #8 -+ vrshr.u16 q8, q12, #8 ++ vraddhn.u16 d24, q12, q11 ++ vraddhn.u16 d25, q9, q8 ++ vraddhn.u16 d26, q13, q6 + vraddhn.u16 d3, q7, q10 -+ vrshr.u16 q10, q13, #8 -+ vraddhn.u16 d25, q12, q8 -+ vrshr.u16 q8, q7, #8 -+ vraddhn.u16 d24, q9, q11 -+ vraddhn.u16 d26, q13, q10 -+ vraddhn.u16 d27, q7, q8 + /* + * 'combine_over_ca' replacement + * @@ -69,7 +67,7 @@ index 2986884..2db4da8 100644 + vmull.u8 q8, d24, d4 + vmull.u8 q9, d25, d5 + vmvn.8 d26, d26 -+ vmvn.8 d27, d27 ++ vmvn.8 d27, d3 + vmull.u8 q10, d26, d6 + vmull.u8 q11, d27, d7 +.endm @@ -137,7 +135,7 @@ index 2986884..2db4da8 100644 /* expecting source data in {d8, d9, d10, d11} */ /* d8 - blue, d9 - green, d10 - red, d11 - alpha */ diff --git a/pixman/pixman-arm-neon.c b/pixman/pixman-arm-neon.c -index 557301e..00b5c35 100644 +index 557301e..3f0e18e 100644 --- a/pixman/pixman-arm-neon.c +++ b/pixman/pixman-arm-neon.c @@ -269,6 +269,7 @@ BIND_SRC_NULL_DST(over_8888_8888, uint32_t, 1, uint32_t, 1) @@ -148,12 +146,14 @@ index 557301e..00b5c35 100644 BIND_N_MASK_DST(add_n_8_8, uint8_t, 1, uint8_t, 1) BIND_SRC_N_DST(over_8888_n_8888, uint32_t, 1, uint32_t, 1) -@@ -412,6 +413,8 @@ static const pixman_fast_path_t arm_neon_fast_paths[] = +@@ -412,6 +413,10 @@ static const pixman_fast_path_t arm_neon_fast_paths[] = PIXMAN_STD_FAST_PATH (OVER, solid, null, r5g6b5, neon_composite_over_n_0565), PIXMAN_STD_FAST_PATH (OVER, solid, null, a8r8g8b8, neon_composite_over_n_8888), PIXMAN_STD_FAST_PATH (OVER, solid, null, x8r8g8b8, neon_composite_over_n_8888), + PIXMAN_STD_FAST_PATH_CA (OVER, solid, a8r8g8b8, a8r8g8b8, neon_composite_over_n_8888_8888_ca), + PIXMAN_STD_FAST_PATH_CA (OVER, solid, a8r8g8b8, x8r8g8b8, neon_composite_over_n_8888_8888_ca), ++ PIXMAN_STD_FAST_PATH_CA (OVER, solid, a8b8g8r8, a8b8g8r8, neon_composite_over_n_8888_8888_ca), ++ PIXMAN_STD_FAST_PATH_CA (OVER, solid, a8b8g8r8, x8b8g8r8, neon_composite_over_n_8888_8888_ca), PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, solid, a8r8g8b8, neon_composite_over_8888_n_8888), PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, solid, x8r8g8b8, neon_composite_over_8888_n_8888), PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, a8, a8r8g8b8, neon_composite_over_8888_8_8888), diff --git a/recipes/xorg-lib/pixman-0.17.8/2-composite.patch b/recipes/xorg-lib/pixman-0.17.8/2-composite.patch index 96c87e2ac6..84d4d9c961 100644 --- a/recipes/xorg-lib/pixman-0.17.8/2-composite.patch +++ b/recipes/xorg-lib/pixman-0.17.8/2-composite.patch @@ -1,4 +1,4 @@ -From fa7f7b05fbb08b23678cf0d8928f1511e5a20ecc Mon Sep 17 00:00:00 2001 +From 6e0df74dbfca26f92a18d968e1bf410bae134c8a Mon Sep 17 00:00:00 2001 From: Siarhei Siamashka <siarhei.siamashka@nokia.com> Date: Wed, 24 Feb 2010 00:26:57 +0000 Subject: ARM: added 'neon_composite_src_x888_8888' fast path @@ -19,7 +19,7 @@ after: [ 0] image gnome-system-monitor 53.336 53.384 0.09% 6/6 --- diff --git a/pixman/pixman-arm-neon-asm.S b/pixman/pixman-arm-neon-asm.S -index 2db4da8..42ac1cb 100644 +index e90d662..f2643de 100644 --- a/pixman/pixman-arm-neon-asm.S +++ b/pixman/pixman-arm-neon-asm.S @@ -947,6 +947,44 @@ generate_composite_function \ @@ -68,7 +68,7 @@ index 2db4da8..42ac1cb 100644 /* expecting deinterleaved source data in {d8, d9, d10, d11} */ /* d8 - blue, d9 - green, d10 - red, d11 - alpha */ diff --git a/pixman/pixman-arm-neon.c b/pixman/pixman-arm-neon.c -index 00b5c35..12d92a2 100644 +index 3f0e18e..0a7ac31 100644 --- a/pixman/pixman-arm-neon.c +++ b/pixman/pixman-arm-neon.c @@ -251,6 +251,7 @@ neon_composite_##name (pixman_implementation_t *imp, \ @@ -79,16 +79,18 @@ index 00b5c35..12d92a2 100644 BIND_SRC_NULL_DST(src_0565_0565, uint16_t, 1, uint16_t, 1) BIND_SRC_NULL_DST(src_0888_0888, uint8_t, 3, uint8_t, 3) BIND_SRC_NULL_DST(src_8888_0565, uint32_t, 1, uint16_t, 1) -@@ -400,6 +401,8 @@ static const pixman_fast_path_t arm_neon_fast_paths[] = +@@ -400,6 +401,10 @@ static const pixman_fast_path_t arm_neon_fast_paths[] = PIXMAN_STD_FAST_PATH (SRC, x8r8g8b8, null, x8r8g8b8, neon_composite_src_8888_8888), PIXMAN_STD_FAST_PATH (SRC, a8b8g8r8, null, x8b8g8r8, neon_composite_src_8888_8888), PIXMAN_STD_FAST_PATH (SRC, x8b8g8r8, null, x8b8g8r8, neon_composite_src_8888_8888), + PIXMAN_STD_FAST_PATH (SRC, a8r8g8b8, null, a8r8g8b8, neon_composite_src_8888_8888), ++ PIXMAN_STD_FAST_PATH (SRC, a8b8g8r8, null, a8b8g8r8, neon_composite_src_8888_8888), + PIXMAN_STD_FAST_PATH (SRC, x8r8g8b8, null, a8r8g8b8, neon_composite_src_x888_8888), ++ PIXMAN_STD_FAST_PATH (SRC, x8b8g8r8, null, a8b8g8r8, neon_composite_src_x888_8888), PIXMAN_STD_FAST_PATH (SRC, r8g8b8, null, r8g8b8, neon_composite_src_0888_0888), PIXMAN_STD_FAST_PATH (SRC, b8g8r8, null, x8r8g8b8, neon_composite_src_0888_8888_rev), PIXMAN_STD_FAST_PATH (SRC, b8g8r8, null, r5g6b5, neon_composite_src_0888_0565_rev), -@@ -428,6 +431,7 @@ static const pixman_fast_path_t arm_neon_fast_paths[] = +@@ -430,6 +435,7 @@ static const pixman_fast_path_t arm_neon_fast_paths[] = PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, null, x8r8g8b8, neon_composite_over_8888_8888), PIXMAN_STD_FAST_PATH (OVER, a8b8g8r8, null, a8b8g8r8, neon_composite_over_8888_8888), PIXMAN_STD_FAST_PATH (OVER, a8b8g8r8, null, x8b8g8r8, neon_composite_over_8888_8888), diff --git a/recipes/xorg-lib/pixman-0.17.8/3-composite.patch b/recipes/xorg-lib/pixman-0.17.8/3-composite.patch index 81f3ff162b..06e40fe869 100644 --- a/recipes/xorg-lib/pixman-0.17.8/3-composite.patch +++ b/recipes/xorg-lib/pixman-0.17.8/3-composite.patch @@ -1,4 +1,4 @@ -From 80b75405277bacc0df0ef7d91f1a2eabefb97901 Mon Sep 17 00:00:00 2001 +From 19fc0c4c8d28796f0fbc2c8f47edc130851ae3a5 Mon Sep 17 00:00:00 2001 From: Siarhei Siamashka <siarhei.siamashka@nokia.com> Date: Wed, 24 Feb 2010 02:14:45 +0000 Subject: ARM: added 'neon_composite_over_reverse_n_8888' fast path @@ -7,6 +7,8 @@ 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 @@ -16,7 +18,7 @@ after: [ 0] image poppler 24.981 25.136 0.28% 6/6 --- diff --git a/pixman/pixman-arm-neon-asm.S b/pixman/pixman-arm-neon-asm.S -index 42ac1cb..272da27 100644 +index f2643de..eb8cc4c 100644 --- a/pixman/pixman-arm-neon-asm.S +++ b/pixman/pixman-arm-neon-asm.S @@ -680,6 +680,61 @@ generate_composite_function \ @@ -82,7 +84,7 @@ index 42ac1cb..272da27 100644 /* in */ vmull.u8 q0, d24, d8 diff --git a/pixman/pixman-arm-neon.c b/pixman/pixman-arm-neon.c -index 12d92a2..417ce5a 100644 +index 0a7ac31..30c5056 100644 --- a/pixman/pixman-arm-neon.c +++ b/pixman/pixman-arm-neon.c @@ -264,6 +264,7 @@ BIND_SRC_NULL_DST(add_8888_8888, uint32_t, 1, uint32_t, 1) @@ -93,11 +95,12 @@ index 12d92a2..417ce5a 100644 BIND_SRC_NULL_DST(over_8888_0565, uint32_t, 1, uint16_t, 1) BIND_SRC_NULL_DST(over_8888_8888, uint32_t, 1, uint32_t, 1) -@@ -438,6 +439,7 @@ static const pixman_fast_path_t arm_neon_fast_paths[] = +@@ -442,6 +443,8 @@ static const pixman_fast_path_t arm_neon_fast_paths[] = PIXMAN_STD_FAST_PATH (ADD, a8, null, a8, neon_composite_add_8000_8000), PIXMAN_STD_FAST_PATH (ADD, a8r8g8b8, null, a8r8g8b8, neon_composite_add_8888_8888), PIXMAN_STD_FAST_PATH (ADD, a8b8g8r8, null, a8b8g8r8, neon_composite_add_8888_8888), + PIXMAN_STD_FAST_PATH (OVER_REVERSE, solid, null, a8r8g8b8, neon_composite_over_reverse_n_8888), ++ PIXMAN_STD_FAST_PATH (OVER_REVERSE, solid, null, a8b8g8r8, neon_composite_over_reverse_n_8888), { PIXMAN_OP_NONE }, }; diff --git a/recipes/xorg-lib/pixman_0.17.8.bb b/recipes/xorg-lib/pixman_0.17.8.bb index 7ddb142057..adc0c4e301 100644 --- a/recipes/xorg-lib/pixman_0.17.8.bb +++ b/recipes/xorg-lib/pixman_0.17.8.bb @@ -3,6 +3,8 @@ PRIORITY = "optional" DESCRIPTION = "Low-level pixel manipulation library." LICENSE = "X11" +PR = "r1" + DEFAULT_PREFERENCE = "-1" DEFAULT_PREFERENCE_angstrom = "2" DEFAULT_PREFERENCE_shr = "2" @@ -22,13 +24,10 @@ SRC_URI = "http://cairographics.org/releases/pixman-${PV}.tar.gz;name=archive \ SRC_URI[archive.md5sum] = "a7deb2ff6b286b676d67aa6ae91317ae" SRC_URI[archive.sha256sum] = "ea24e9003455a0881bd43bf7e4169f2b34c90c8521405103e3490553876a81b4" - -inherit autotools_stage +inherit autotools NEON = " --disable-arm-neon " NEON_armv7a = "" EXTRA_OECONF = "${NEON} --disable-gtk" -AUTOTOOLS_STAGE_PKGCONFIG = "1" - -- cgit v1.2.3 From f88f6869a98e882bdfe6c6627240009b3f67a105 Mon Sep 17 00:00:00 2001 From: Koen Kooi <koen@openembedded.org> Date: Wed, 3 Mar 2010 15:32:10 +0100 Subject: pixman git: update to 0.17.8 + flags branch to test upcoming 0.18.x RCs --- recipes/xorg-lib/pixman_git.bb | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) (limited to 'recipes/xorg-lib') diff --git a/recipes/xorg-lib/pixman_git.bb b/recipes/xorg-lib/pixman_git.bb index 199c2fb4ca..3fdb698b66 100644 --- a/recipes/xorg-lib/pixman_git.bb +++ b/recipes/xorg-lib/pixman_git.bb @@ -3,25 +3,24 @@ PRIORITY = "optional" DESCRIPTION = "Low-level pixel manipulation library." LICENSE = "X11" -PV = "0.17.3" +PV = "0.17.8" PR = "r6" PR_append = "+gitr${SRCREV}" BBCLASSEXTEND="native" -SRCREV = "c97b1e803fc214e9880eaeff98410c8fa37f9ddc" +SRCREV = "7a15fa25ddb88ebb4ac00772854271f102f06e81" DEFAULT_PREFERENCE = "-1" -DEFAULT_PREFERENCE_shr = "1" -SRC_URI = "git://anongit.freedesktop.org/pixman;protocol=git \ - file://nearest-neighbour.patch;patch=1 \ - file://0001-ARM-NEON-optimized-pixman_blt.patch;patch=1 \ - file://0002-Test-program-for-pixman_blt-function.patch;patch=1 \ +SRC_URI = "git://anongit.freedesktop.org/~sandmann/pixman;protocol=git;branch=flags \ file://0003-Generic-C-implementation-of-pixman_blt-with-overlapp.patch;patch=1 \ file://0004-Support-of-overlapping-src-dst-for-pixman_blt_mmx.patch;patch=1 \ file://0005-Support-of-overlapping-src-dst-for-pixman_blt_sse2.patch;patch=1 \ file://0006-Support-of-overlapping-src-dst-for-pixman_blt_neon.patch;patch=1 \ + file://1-composite.patch;patch=1 \ + file://2-composite.patch;patch=1 \ + file://3-composite.patch;patch=1 \ " S = "${WORKDIR}/git" -- cgit v1.2.3 From 72ae9db372b96d56d95c11a52a42a31bfeb2cd18 Mon Sep 17 00:00:00 2001 From: Koen Kooi <koen@openembedded.org> Date: Wed, 10 Mar 2010 12:12:47 +0100 Subject: pixman git: add some ARMv6 optimizations --- recipes/xorg-lib/pixman/over-n-8-0565.patch | 231 ++++++++++++++++++++ recipes/xorg-lib/pixman/src-8888-0565.patch | 324 ++++++++++++++++++++++++++++ recipes/xorg-lib/pixman_git.bb | 10 +- 3 files changed, 561 insertions(+), 4 deletions(-) create mode 100644 recipes/xorg-lib/pixman/over-n-8-0565.patch create mode 100644 recipes/xorg-lib/pixman/src-8888-0565.patch (limited to 'recipes/xorg-lib') diff --git a/recipes/xorg-lib/pixman/over-n-8-0565.patch b/recipes/xorg-lib/pixman/over-n-8-0565.patch new file mode 100644 index 0000000000..3911068d94 --- /dev/null +++ b/recipes/xorg-lib/pixman/over-n-8-0565.patch @@ -0,0 +1,231 @@ +From de2221a32d0b6628116565563f7b4ccd0a44e8b6 Mon Sep 17 00:00:00 2001 +From: Siarhei Siamashka <siarhei.siamashka@nokia.com> +Date: Thu, 04 Mar 2010 23:20:25 +0000 +Subject: ARM: added 'armv6_composite_over_n_8_0565' fast path + +Provides ~3x performance improvement when working with +data in L1 cache and memory. This fast path is important +for fonts rendering when using 16bpp desktop. + +Microbenchmark from N800 (ARM11 @ 400MHz), measured in MPix/s: + +before: + + over_n_8_0565 = L1: 2.99 M: 2.86 + +after: + + over_n_8_0565 = L1: 9.07 M: 8.05 +--- +diff --git a/pixman/pixman-arm-simd.c b/pixman/pixman-arm-simd.c +index 09a2888..c375c01 100644 +--- a/pixman/pixman-arm-simd.c ++++ b/pixman/pixman-arm-simd.c +@@ -419,6 +419,193 @@ arm_composite_over_n_8_8888 (pixman_implementation_t * impl, + } + } + ++#if defined(__ARM_EABI__) && defined(__linux__) ++/* ++ * ARMv6 assembly optimized version of 'composite_over_n_8_0565'. It is ++ * a bare metal 'naked' function which uses all the available CPU registers ++ * and is compatible with ARM EABI. It might (or might not) break when used ++ * with a different ABI, anyway it is better to be safe than sorry. ++ */ ++static void __attribute__((naked)) armv6_composite_over_n_8_0565_asm ( ++ uint16_t *dst, uint8_t *mask, uint32_t src, int w, ++ int dst_stride_delta, int mask_stride_delta, int h) ++{ ++ asm volatile ( ++ ".macro composite_internal_armv6_asm opaque_flag\n" ++ /* save all registers (8 words) to stack */ ++ "stmdb sp!, {r4-r11, ip, lr}\n" ++ /* some register aliases for better readability */ ++ "DST .req r0\n" ++ "MASK .req r1\n" ++ "S .req r2\n" ++ "W .req r3\n" ++ "A .req r8\n" ++ "D .req r10\n" ++ "C0000FF .req r11\n" ++ "C00001F .req r9\n" ++ "C800080 .req ip\n" ++ "CE000E0 .req lr\n" ++ /* precalculate some stuff and put it on stack */ ++ "mov r6, #0xF8\n" ++ "mov r7, #0xFC\n" ++ ++ "str W, [sp, #-8]!\n" ++ ++ ".if \\opaque_flag\n" ++ /* precalculate and save it to stack for later use: ++ * ((src >> 3) & 0x001F) | ++ * ((src >> 5) & 0x07E0) | ++ * ((src >> 8) & 0xF800) ++ */ ++ "mov A, #0x1F\n" ++ "and D, A, S, lsr #3\n" ++ "and r4, S, #0xF80000\n" ++ "and r5, S, #0xFC00\n" ++ "orr D, r4, lsr #8\n" ++ "orr D, r5, lsr #5\n" ++ "str D, [sp, #4]\n" ++ ".endif\n" ++ ++ "ldr D, [sp, #(8 + 10*4 + 8)]\n" /* h */ ++ "ldr A, =0xFF00FF\n" ++ "ldr C800080, =0x800080\n" ++ "ldr CE000E0, =0xE000E0\n" ++ "ldr C0000FF, =0xFF\n" ++ "ldr C00001F, =0x1F\n" ++ "and r4, A, S\n" /* r4 = src & 0x00FF00FF */ ++ "and r5, A, S, lsr #8\n" /* r5 = (src >> 8) & 0x00FF00FF */ ++ "stmdb sp!, {r4, r5, r6, r7}\n" ++ "0:\n" ++ "subs D, D, #1\n" ++ "blt 6f\n" ++ "1:\n" ++ "subs W, W, #1\n" ++ "blt 5f\n" ++ "2:\n" ++ "ldrb A, [MASK], #1\n" ++ "ldmia sp, {r4, r5, r6, r7}\n" /* load constants from stack */ ++ "add DST, DST, #2\n" ++ "cmp A, #0\n" ++ "beq 1b\n" ++ ++ ".if \\opaque_flag\n" ++ "cmp A, #0xFF\n" ++ "bne 3f\n" ++ "ldr D, [sp, #(4*4 + 4)]\n" /* load precalculated value */ ++ "subs W, #1\n" ++ "strh D, [DST, #-2]\n" ++ "bge 2b\n" ++ ".endif\n" ++ ++ "3:\n" ++ "ldrh D, [DST, #-2]\n" ++ "mla r4, A, r4, C800080\n" ++ "mla r5, A, r5, C800080\n" ++ "and r6, r6, D, lsl #3\n" /* & 0xF8 */ ++ "and r7, r7, D, lsr #3\n" /* & 0xFC */ ++ "and D, D, #0xF800\n" ++ "bic S, r4, #0xFF0000\n" ++ "bic A, r5, #0xFF0000\n" ++ "add r4, r4, S, lsr #8\n" ++ "add r5, r5, A, lsr #8\n" ++ ++ "and S, r7, #0xC0\n" ++ "orr r6, r6, D, lsl #8\n" ++ "and D, r6, CE000E0\n" ++ "eor A, C0000FF, r5, lsr #24\n" ++ "orr r6, D, lsr #5\n" ++ "orr r7, S, lsr #6\n" ++ ++ "mla r6, A, r6, C800080\n" ++ "mla r7, A, r7, C800080\n" ++ "subs W, #1\n" ++ "bic D, r6, #0xFF0000\n" ++ "bic A, r7, #0xFF0000\n" ++ "add r6, r6, D, lsr #8\n" ++ "uqadd8 r4, r4, r6\n" ++ "add r7, r7, A, lsr #8\n" ++ "uqadd8 r5, r5, r7\n" ++ "and D, C00001F, r4, lsr #11\n" ++ "and r4, r4, #0xF8000000\n" ++ "and r5, r5, #0xFC00\n" ++ "orr D, r4, lsr #16\n" ++ "orr D, r5, lsr #5\n" ++ "strh D, [DST, #-2]\n" ++ "bge 2b\n" ++ "5:\n" ++ "ldr r6, [sp, #(4*4 + 8 + 10*4 + 8)]\n" /* h */ ++ "ldr r4, [sp, #(4*4 + 8 + 10*4 + 4)]\n" /* mask stride */ ++ "ldr r5, [sp, #(4*4 + 8 + 10*4 + 0)]\n" /* dst stride */ ++ "ldr W, [sp, #(4*4)]\n" ++ "subs r6, r6, #1\n" /* h */ ++ "str r6, [sp, #(4*4 + 8 + 10*4 + 8)]\n" /* h */ ++ "add MASK, MASK, r4\n" ++ "add DST, DST, r5, lsl #1\n" ++ "bgt 1b\n" ++ "6:\n" ++ "add sp, sp, #(4*4 + 8)\n" ++ /* restore all registers and return */ ++ "ldmia sp!, {r4-r11, ip, pc}\n" ++ ".unreq DST\n" ++ ".unreq MASK\n" ++ ".unreq S\n" ++ ".unreq W\n" ++ ".unreq A\n" ++ ".unreq D\n" ++ ".unreq C0000FF\n" ++ ".unreq C00001F\n" ++ ".unreq C800080\n" ++ ".unreq CE000E0\n" ++ ".endm\n" ++ ++ "mov ip, r2, lsr #24\n" ++ "cmp ip, #0xFF\n" ++ "beq 9f\n" ++ "composite_internal_armv6_asm 0\n" ++ "9:\n" ++ "composite_internal_armv6_asm 1\n" ++ ".ltorg\n" ++ ".purgem composite_internal_armv6_asm\n" ++ ); ++} ++ ++static void ++armv6_composite_over_n_8_0565 (pixman_implementation_t * impl, ++ pixman_op_t op, ++ pixman_image_t * src_image, ++ pixman_image_t * mask_image, ++ pixman_image_t * dst_image, ++ int32_t src_x, ++ int32_t src_y, ++ int32_t mask_x, ++ int32_t mask_y, ++ int32_t dest_x, ++ int32_t dest_y, ++ int32_t width, ++ int32_t height) ++{ ++ uint32_t src; ++ uint16_t *dst; ++ uint8_t *mask; ++ int dst_stride, mask_stride; ++ ++ src = _pixman_image_get_solid (src_image, dst_image->bits.format); ++ ++ /* bail out if fully transparent */ ++ if (src == 0) ++ return; ++ ++ PIXMAN_IMAGE_GET_LINE (dst_image, dest_x, dest_y, uint16_t, ++ dst_stride, dst, 1); ++ PIXMAN_IMAGE_GET_LINE (mask_image, mask_x, mask_y, uint8_t, ++ mask_stride, mask, 1); ++ ++ armv6_composite_over_n_8_0565_asm (dst, mask, src, width, ++ dst_stride - width, mask_stride - width, height); ++} ++ ++#endif ++ + static const pixman_fast_path_t arm_simd_fast_paths[] = + { + PIXMAN_STD_FAST_PATH (OVER, a8r8g8b8, null, a8r8g8b8, arm_composite_over_8888_8888), +@@ -434,7 +621,10 @@ static const pixman_fast_path_t arm_simd_fast_paths[] = + PIXMAN_STD_FAST_PATH (OVER, solid, a8, x8r8g8b8, arm_composite_over_n_8_8888), + PIXMAN_STD_FAST_PATH (OVER, solid, a8, a8b8g8r8, arm_composite_over_n_8_8888), + PIXMAN_STD_FAST_PATH (OVER, solid, a8, x8b8g8r8, arm_composite_over_n_8_8888), +- ++#if defined(__ARM_EABI__) && defined(__linux__) ++ PIXMAN_STD_FAST_PATH (OVER, solid, a8, r5g6b5, armv6_composite_over_n_8_0565), ++ PIXMAN_STD_FAST_PATH (OVER, solid, a8, b5g6r5, armv6_composite_over_n_8_0565), ++#endif + { PIXMAN_OP_NONE }, + }; + +-- +cgit v0.8.3-6-g21f6 diff --git a/recipes/xorg-lib/pixman/src-8888-0565.patch b/recipes/xorg-lib/pixman/src-8888-0565.patch new file mode 100644 index 0000000000..c544225f65 --- /dev/null +++ b/recipes/xorg-lib/pixman/src-8888-0565.patch @@ -0,0 +1,324 @@ +From 6494f9ae8820078d0e6109bf8f294156f7a5da4c Mon Sep 17 00:00:00 2001 +From: Siarhei Siamashka <siarhei.siamashka@nokia.com> +Date: Fri, 05 Mar 2010 00:40:34 +0000 +Subject: ARM: added 'armv6_composite_src_8888_0565' fast path + +Provides ~3x performance improvement when working with +data in L1 cache, and ~80% performace improvement when working +with memory. This fast path is important for 32bpp -> 16bpp +color format conversion and is commonly used with 16bpp desktop. + +Microbenchmark from N800 (ARM11 @ 400MHz), measured in MPix/s: + +before: + + src_8888_0565 = L1: 21.54 M: 15.62 + +after (armv4): + + src_8888_0565 = L1: 45.26 M: 23.29 + +after (armv6): + + src_8888_0565 = L1: 60.62 M: 28.37 +--- +diff --git a/pixman/pixman-arm-simd.c b/pixman/pixman-arm-simd.c +index c375c01..69243c1 100644 +--- a/pixman/pixman-arm-simd.c ++++ b/pixman/pixman-arm-simd.c +@@ -604,6 +604,282 @@ armv6_composite_over_n_8_0565 (pixman_implementation_t * impl, + dst_stride - width, mask_stride - width, height); + } + ++static inline void ++armv4_composite_src_8888_0565_asm ( ++ uint16_t *dst, uint32_t *src, int w, int dst_stride, ++ int src_stride, int h) ++{ ++ uint32_t a, x, y, c1F001F = 0x1F001F, cFFFF = 0xFFFF; ++ int backup_w = w; ++ while (h--) ++ { ++ w = backup_w; ++ if (w > 0 && (uintptr_t)dst & 2) ++ { ++ x = *src++; ++ ++ a = (x >> 3) & c1F001F; ++ x &= 0xFC00; ++ a |= a >> 5; ++ a |= x >> 5; ++ ++ *dst++ = a; ++ w--; ++ } ++ ++ asm volatile( ++ "subs %[w], %[w], #2\n" ++ "blt 2f\n" ++ "1:\n" ++ "ldr %[x], [%[src]], #4\n" ++ "ldr %[y], [%[src]], #4\n" ++ "subs %[w], %[w], #2\n" ++ ++ "and %[a], %[c1F001F], %[x], lsr #3\n" ++ "and %[x], %[x], #0xFC00\n\n" ++ "orr %[a], %[a], %[a], lsr #5\n" ++ "orr %[x], %[a], %[x], lsr #5\n" ++ ++ "and %[a], %[c1F001F], %[y], lsr #3\n" ++ "and %[y], %[y], #0xFC00\n\n" ++ "orr %[a], %[a], %[a], lsr #5\n" ++ "orr %[y], %[a], %[y], lsr #5\n" ++ /* ++ * Writing single 32-bit value is much faster than two ++ * separate 16-bit values for older CPUs without (efficient) ++ * write combining, even though it costs an extra instruction. ++ */ ++ "and %[x], %[x], %[cFFFF]\n" ++ "orr %[x], %[x], %[y], lsl #16\n" ++ "str %[x], [%[dst]], #4\n" ++ "bge 1b\n" ++ "2:\n" ++ : [c1F001F] "+&r" (c1F001F), [cFFFF] "+&r" (cFFFF), ++ [src] "+&r" (src), [dst] "+&r" (dst), [a] "=&r" (a), ++ [x] "=&r" (x), [y] "=&r" (y), [w] "+&r" (w) ++ ); ++ ++ if (w & 1) ++ { ++ x = *src++; ++ ++ a = (x >> 3) & c1F001F; ++ x = x & 0xFC00; ++ a |= a >> 5; ++ a |= x >> 5; ++ ++ *dst++ = a; ++ } ++ ++ src += src_stride - backup_w; ++ dst += dst_stride - backup_w; ++ } ++} ++ ++/* ++ * Conversion x8r8g8b8 -> r5g6b5 ++ * ++ * Note: 'w' must be >= 7 here ++ */ ++static void __attribute__((naked)) ++armv6_composite_src_8888_0565_asm ( ++ uint16_t *dst, uint32_t *src, int w, int dst_stride, ++ int src_stride, int h) ++{ ++ asm volatile( ++ /* define supplementary macros */ ++ ".macro cvt8888to565 PIX\n" ++ "and A, C1F001F, \\PIX, lsr #3\n" ++ "and \\PIX, \\PIX, #0xFC00\n\n" ++ "orr A, A, A, lsr #5\n" ++ "orr \\PIX, A, \\PIX, lsr #5\n" ++ ".endm\n" ++ ++ ".macro combine_pixels_pair PIX1, PIX2\n" ++ /* Note: assume little endian byte order */ ++ "pkhbt \\PIX1, \\PIX1, \\PIX2, lsl #16\n" ++ ".endm\n" ++ ++ /* function entry, save all registers (10 words) to stack */ ++ "stmdb sp!, {r4-r11, ip, lr}\n" ++ ++ /* define some aliases */ ++ "DST .req r0\n" ++ "SRC .req r1\n" ++ "W .req r2\n" ++ "H .req r3\n" ++ ++ "TMP1 .req r4\n" ++ "TMP2 .req r5\n" ++ "TMP3 .req r6\n" ++ "TMP4 .req r7\n" ++ "TMP5 .req r8\n" ++ "TMP6 .req r9\n" ++ "TMP7 .req r10\n" ++ "TMP8 .req r11\n" ++ ++ "C1F001F .req ip\n" ++ "A .req lr\n" ++ ++ "ldr TMP1, [sp, #(10*4+0)]\n" /* load src_stride */ ++ "ldr C1F001F, =0x1F001F\n" ++ "sub r3, r3, W\n" ++ "str r3, [sp, #(10*4+0)]\n" /* store (dst_stride-w) */ ++ "ldr r3, [sp, #(10*4+4)]\n" /* load h */ ++ "sub TMP1, TMP1, W\n" ++ "str TMP1, [sp, #(10*4+4)]\n" /* store (src_stride-w) */ ++ ++ "str W, [sp, #(8*4)]\n" /* saved ip = W */ ++ ++ "0:\n" ++ "subs H, H, #1\n" ++ "blt 6f\n" ++ "1:\n" ++ /* align DST at 4 byte boundary */ ++ "tst DST, #2\n" ++ "beq 2f\n" ++ "ldr TMP1, [SRC], #4\n" ++ "sub W, W, #1\n" ++ "cvt8888to565 TMP1\n" ++ "strh TMP1, [DST], #2\n" ++ "2:" ++ /* align DST at 8 byte boundary */ ++ "tst DST, #4\n" ++ "beq 2f\n" ++ "ldmia SRC!, {TMP1, TMP2}\n" ++ "sub W, W, #2\n" ++ "cvt8888to565 TMP1\n" ++ "cvt8888to565 TMP2\n" ++ "combine_pixels_pair TMP1, TMP2\n" ++ "str TMP1, [DST], #4\n" ++ "2:" ++ /* align DST at 16 byte boundary */ ++ "tst DST, #8\n" ++ "beq 2f\n" ++ "ldmia SRC!, {TMP1, TMP2, TMP3, TMP4}\n" ++ "sub W, W, #4\n" ++ "cvt8888to565 TMP1\n" ++ "cvt8888to565 TMP2\n" ++ "cvt8888to565 TMP3\n" ++ "cvt8888to565 TMP4\n" ++ "combine_pixels_pair TMP1, TMP2\n" ++ "combine_pixels_pair TMP3, TMP4\n" ++ "stmia DST!, {TMP1, TMP3}\n" ++ "2:" ++ /* inner loop, process 8 pixels per iteration */ ++ "subs W, W, #8\n" ++ "blt 4f\n" ++ "3:\n" ++ "ldmia SRC!, {TMP1, TMP2, TMP3, TMP4, TMP5, TMP6, TMP7, TMP8}\n" ++ "subs W, W, #8\n" ++ "cvt8888to565 TMP1\n" ++ "cvt8888to565 TMP2\n" ++ "cvt8888to565 TMP3\n" ++ "cvt8888to565 TMP4\n" ++ "cvt8888to565 TMP5\n" ++ "cvt8888to565 TMP6\n" ++ "cvt8888to565 TMP7\n" ++ "cvt8888to565 TMP8\n" ++ "combine_pixels_pair TMP1, TMP2\n" ++ "combine_pixels_pair TMP3, TMP4\n" ++ "combine_pixels_pair TMP5, TMP6\n" ++ "combine_pixels_pair TMP7, TMP8\n" ++ "stmia DST!, {TMP1, TMP3, TMP5, TMP7}\n" ++ "bge 3b\n" ++ "4:\n" ++ ++ /* process the remaining pixels */ ++ "tst W, #4\n" ++ "beq 4f\n" ++ "ldmia SRC!, {TMP1, TMP2, TMP3, TMP4}\n" ++ "cvt8888to565 TMP1\n" ++ "cvt8888to565 TMP2\n" ++ "cvt8888to565 TMP3\n" ++ "cvt8888to565 TMP4\n" ++ "combine_pixels_pair TMP1, TMP2\n" ++ "combine_pixels_pair TMP3, TMP4\n" ++ "stmia DST!, {TMP1, TMP3}\n" ++ "4:\n" ++ "tst W, #2\n" ++ "beq 4f\n" ++ "ldmia SRC!, {TMP1, TMP2}\n" ++ "cvt8888to565 TMP1\n" ++ "cvt8888to565 TMP2\n" ++ "combine_pixels_pair TMP1, TMP2\n" ++ "str TMP1, [DST], #4\n" ++ "4:\n" ++ "tst W, #1\n" ++ "beq 4f\n" ++ "ldr TMP1, [SRC], #4\n" ++ "cvt8888to565 TMP1\n" ++ "strh TMP1, [DST], #2\n" ++ "4:\n" ++ "ldr TMP1, [sp, #(10*4+0)]\n" /* (dst_stride-w) */ ++ "ldr TMP2, [sp, #(10*4+4)]\n" /* (src_stride-w) */ ++ "ldr W, [sp, #(8*4)]\n" ++ "subs H, H, #1\n" ++ "add DST, DST, TMP1, lsl #1\n" ++ "add SRC, SRC, TMP2, lsl #2\n" ++ "bge 1b\n" ++ "6:\n" ++ /* restore all registers and return */ ++ "ldmia sp!, {r4-r11, ip, pc}\n" ++ ".ltorg\n" ++ ++ ".unreq DST\n" ++ ".unreq SRC\n" ++ ".unreq W\n" ++ ".unreq H\n" ++ ++ ".unreq TMP1\n" ++ ".unreq TMP2\n" ++ ".unreq TMP3\n" ++ ".unreq TMP4\n" ++ ".unreq TMP5\n" ++ ".unreq TMP6\n" ++ ".unreq TMP7\n" ++ ".unreq TMP8\n" ++ ++ ".unreq C1F001F\n" ++ ".unreq A\n" ++ ++ ".purgem cvt8888to565\n" ++ ".purgem combine_pixels_pair\n" ++ ); ++} ++ ++static void ++armv6_composite_src_8888_0565 (pixman_implementation_t * impl, ++ pixman_op_t op, ++ pixman_image_t * src_image, ++ pixman_image_t * mask_image, ++ pixman_image_t * dst_image, ++ int32_t src_x, ++ int32_t src_y, ++ int32_t mask_x, ++ int32_t mask_y, ++ int32_t dest_x, ++ int32_t dest_y, ++ int32_t width, ++ int32_t height) ++{ ++ uint32_t *src; ++ uint16_t *dst; ++ int src_stride, dst_stride; ++ ++ PIXMAN_IMAGE_GET_LINE (dst_image, dest_x, dest_y, uint16_t, ++ dst_stride, dst, 1); ++ PIXMAN_IMAGE_GET_LINE (src_image, src_x, src_y, uint32_t, ++ src_stride, src, 1); ++ ++ if (width < 7) ++ armv4_composite_src_8888_0565_asm (dst, src, width, ++ dst_stride, src_stride, height); ++ else ++ armv6_composite_src_8888_0565_asm (dst, src, width, ++ dst_stride, src_stride, height); ++} ++ + #endif + + static const pixman_fast_path_t arm_simd_fast_paths[] = +@@ -624,6 +900,10 @@ static const pixman_fast_path_t arm_simd_fast_paths[] = + #if defined(__ARM_EABI__) && defined(__linux__) + PIXMAN_STD_FAST_PATH (OVER, solid, a8, r5g6b5, armv6_composite_over_n_8_0565), + PIXMAN_STD_FAST_PATH (OVER, solid, a8, b5g6r5, armv6_composite_over_n_8_0565), ++ PIXMAN_STD_FAST_PATH (SRC, a8r8g8b8, null, r5g6b5, armv6_composite_src_8888_0565), ++ PIXMAN_STD_FAST_PATH (SRC, x8r8g8b8, null, r5g6b5, armv6_composite_src_8888_0565), ++ PIXMAN_STD_FAST_PATH (SRC, a8b8g8r8, null, b5g6r5, armv6_composite_src_8888_0565), ++ PIXMAN_STD_FAST_PATH (SRC, x8b8g8r8, null, b5g6r5, armv6_composite_src_8888_0565), + #endif + { PIXMAN_OP_NONE }, + }; +-- +cgit v0.8.3-6-g21f6 diff --git a/recipes/xorg-lib/pixman_git.bb b/recipes/xorg-lib/pixman_git.bb index 3fdb698b66..b15fc355f7 100644 --- a/recipes/xorg-lib/pixman_git.bb +++ b/recipes/xorg-lib/pixman_git.bb @@ -4,15 +4,15 @@ DESCRIPTION = "Low-level pixel manipulation library." LICENSE = "X11" PV = "0.17.8" -PR = "r6" +PR = "r8" PR_append = "+gitr${SRCREV}" BBCLASSEXTEND="native" SRCREV = "7a15fa25ddb88ebb4ac00772854271f102f06e81" - + DEFAULT_PREFERENCE = "-1" - + SRC_URI = "git://anongit.freedesktop.org/~sandmann/pixman;protocol=git;branch=flags \ file://0003-Generic-C-implementation-of-pixman_blt-with-overlapp.patch;patch=1 \ file://0004-Support-of-overlapping-src-dst-for-pixman_blt_mmx.patch;patch=1 \ @@ -21,6 +21,8 @@ SRC_URI = "git://anongit.freedesktop.org/~sandmann/pixman;protocol=git;branch=fl file://1-composite.patch;patch=1 \ file://2-composite.patch;patch=1 \ file://3-composite.patch;patch=1 \ + file://over-n-8-0565.patch;patch=1 \ + file://src-8888-0565.patch;patch=1 \ " S = "${WORKDIR}/git" @@ -28,7 +30,7 @@ S = "${WORKDIR}/git" inherit autotools_stage NEON = " --disable-arm-neon " -NEON_armv7a = "" +NEON_armv7a = " " EXTRA_OECONF = "${NEON} --disable-gtk" -- cgit v1.2.3 From 5183adab7131c9f5bede3f7b2b14c91c9ed81628 Mon Sep 17 00:00:00 2001 From: Koen Kooi <koen@openembedded.org> Date: Tue, 16 Mar 2010 17:12:38 +0100 Subject: pixman git: update to 0.17.10 + ~alexl/alex-scaler2 + overlapped blt --- .../0001-Add-CONVERT_0565_TO_8888-macro.patch | 27 ++ ..._8888_TO_8888-and-CONVERT_0565_TO_0565-ma.patch | 28 ++ .../0003-Add-FAST_PATH_NO_NONE_REPEAT-flag.patch | 53 ++++ ...TH_SAMPLES_COVER_CLIP-and-FAST_PATH_16BIT.patch | 167 ++++++++++++ ...0005-Add-specialized-fast-nearest-scalers.patch | 284 +++++++++++++++++++++ ...mplementation-of-pixman_blt-with-overlapp.patch | 114 +++++++++ ...of-overlapping-src-dst-for-pixman_blt_mmx.patch | 91 +++++++ ...f-overlapping-src-dst-for-pixman_blt_sse2.patch | 91 +++++++ ...f-overlapping-src-dst-for-pixman_blt_neon.patch | 94 +++++++ recipes/xorg-lib/pixman_git.bb | 24 +- 10 files changed, 962 insertions(+), 11 deletions(-) create mode 100644 recipes/xorg-lib/pixman/0001-Add-CONVERT_0565_TO_8888-macro.patch create mode 100644 recipes/xorg-lib/pixman/0002-Add-CONVERT_8888_TO_8888-and-CONVERT_0565_TO_0565-ma.patch create mode 100644 recipes/xorg-lib/pixman/0003-Add-FAST_PATH_NO_NONE_REPEAT-flag.patch create mode 100644 recipes/xorg-lib/pixman/0004-Add-FAST_PATH_SAMPLES_COVER_CLIP-and-FAST_PATH_16BIT.patch create mode 100644 recipes/xorg-lib/pixman/0005-Add-specialized-fast-nearest-scalers.patch create mode 100644 recipes/xorg-lib/pixman/0006-Generic-C-implementation-of-pixman_blt-with-overlapp.patch create mode 100644 recipes/xorg-lib/pixman/0007-Support-of-overlapping-src-dst-for-pixman_blt_mmx.patch create mode 100644 recipes/xorg-lib/pixman/0008-Support-of-overlapping-src-dst-for-pixman_blt_sse2.patch create mode 100644 recipes/xorg-lib/pixman/0009-Support-of-overlapping-src-dst-for-pixman_blt_neon.patch (limited to 'recipes/xorg-lib') diff --git a/recipes/xorg-lib/pixman/0001-Add-CONVERT_0565_TO_8888-macro.patch b/recipes/xorg-lib/pixman/0001-Add-CONVERT_0565_TO_8888-macro.patch new file mode 100644 index 0000000000..4caf6393fc --- /dev/null +++ b/recipes/xorg-lib/pixman/0001-Add-CONVERT_0565_TO_8888-macro.patch @@ -0,0 +1,27 @@ +From deb3b0ab6a97f4584fe37b3ef708dcad59ceddde Mon Sep 17 00:00:00 2001 +From: Alexander Larsson <alexl@redhat.com> +Date: Fri, 12 Mar 2010 16:23:42 +0100 +Subject: [PATCH 1/9] 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. +--- + pixman/pixman-private.h | 2 ++ + 1 files changed, 2 insertions(+), 0 deletions(-) + +diff --git a/pixman/pixman-private.h b/pixman/pixman-private.h +index 9dcdca7..d0bec39 100644 +--- a/pixman/pixman-private.h ++++ b/pixman/pixman-private.h +@@ -704,6 +704,8 @@ pixman_region16_copy_from_region32 (pixman_region16_t *dst, + ((((s) << 5) & 0xfc00) | (((s) >> 1) & 0x300)) | \ + ((((s) << 8) & 0xf80000) | (((s) << 3) & 0x70000))) + ++#define CONVERT_0565_TO_8888(s) (CONVERT_0565_TO_0888(s) | 0xff000000) ++ + #define PIXMAN_FORMAT_IS_WIDE(f) \ + (PIXMAN_FORMAT_A (f) > 8 || \ + PIXMAN_FORMAT_R (f) > 8 || \ +-- +1.6.6.1 + diff --git a/recipes/xorg-lib/pixman/0002-Add-CONVERT_8888_TO_8888-and-CONVERT_0565_TO_0565-ma.patch b/recipes/xorg-lib/pixman/0002-Add-CONVERT_8888_TO_8888-and-CONVERT_0565_TO_0565-ma.patch new file mode 100644 index 0000000000..871ce75078 --- /dev/null +++ b/recipes/xorg-lib/pixman/0002-Add-CONVERT_8888_TO_8888-and-CONVERT_0565_TO_0565-ma.patch @@ -0,0 +1,28 @@ +From 7c2da7f27c2dd04d9ed3db5fd13f1da26cebfa3a Mon Sep 17 00:00:00 2001 +From: Alexander Larsson <alexl@redhat.com> +Date: Tue, 16 Mar 2010 14:18:29 +0100 +Subject: [PATCH 2/9] Add CONVERT_8888_TO_8888 and CONVERT_0565_TO_0565 macros + +These are useful for macroization +--- + pixman/pixman-private.h | 4 ++++ + 1 files changed, 4 insertions(+), 0 deletions(-) + +diff --git a/pixman/pixman-private.h b/pixman/pixman-private.h +index d0bec39..bc41249 100644 +--- a/pixman/pixman-private.h ++++ b/pixman/pixman-private.h +@@ -706,6 +706,10 @@ pixman_region16_copy_from_region32 (pixman_region16_t *dst, + + #define CONVERT_0565_TO_8888(s) (CONVERT_0565_TO_0888(s) | 0xff000000) + ++/* Trivial versions that are useful in macros */ ++#define CONVERT_8888_TO_8888(s) (s) ++#define CONVERT_0565_TO_0565(s) (s) ++ + #define PIXMAN_FORMAT_IS_WIDE(f) \ + (PIXMAN_FORMAT_A (f) > 8 || \ + PIXMAN_FORMAT_R (f) > 8 || \ +-- +1.6.6.1 + diff --git a/recipes/xorg-lib/pixman/0003-Add-FAST_PATH_NO_NONE_REPEAT-flag.patch b/recipes/xorg-lib/pixman/0003-Add-FAST_PATH_NO_NONE_REPEAT-flag.patch new file mode 100644 index 0000000000..d9a79985a8 --- /dev/null +++ b/recipes/xorg-lib/pixman/0003-Add-FAST_PATH_NO_NONE_REPEAT-flag.patch @@ -0,0 +1,53 @@ +From 6e80b9148a7f43b7b40235a57c1066fe64e371e5 Mon Sep 17 00:00:00 2001 +From: Alexander Larsson <alexl@redhat.com> +Date: Fri, 12 Mar 2010 15:40:07 +0100 +Subject: [PATCH 3/9] Add FAST_PATH_NO_NONE_REPEAT flag + +--- + pixman/pixman-image.c | 10 +++++++--- + pixman/pixman-private.h | 1 + + 2 files changed, 8 insertions(+), 3 deletions(-) + +diff --git a/pixman/pixman-image.c b/pixman/pixman-image.c +index d09d193..df5b457 100644 +--- a/pixman/pixman-image.c ++++ b/pixman/pixman-image.c +@@ -335,16 +335,20 @@ compute_image_info (pixman_image_t *image) + /* Repeat mode */ + switch (image->common.repeat) + { ++ case PIXMAN_REPEAT_NONE: ++ flags |= FAST_PATH_NO_REFLECT_REPEAT | FAST_PATH_NO_PAD_REPEAT; ++ break; ++ + case PIXMAN_REPEAT_REFLECT: +- flags |= FAST_PATH_NO_PAD_REPEAT; ++ flags |= FAST_PATH_NO_PAD_REPEAT | FAST_PATH_NO_NONE_REPEAT; + break; + + case PIXMAN_REPEAT_PAD: +- flags |= FAST_PATH_NO_REFLECT_REPEAT; ++ flags |= FAST_PATH_NO_REFLECT_REPEAT | FAST_PATH_NO_NONE_REPEAT; + break; + + default: +- flags |= (FAST_PATH_NO_REFLECT_REPEAT | FAST_PATH_NO_PAD_REPEAT); ++ flags |= FAST_PATH_NO_REFLECT_REPEAT | FAST_PATH_NO_PAD_REPEAT | FAST_PATH_NO_NONE_REPEAT; + break; + } + +diff --git a/pixman/pixman-private.h b/pixman/pixman-private.h +index bc41249..65314b9 100644 +--- a/pixman/pixman-private.h ++++ b/pixman/pixman-private.h +@@ -579,6 +579,7 @@ _pixman_choose_implementation (void); + #define FAST_PATH_SIMPLE_REPEAT (1 << 12) + #define FAST_PATH_IS_OPAQUE (1 << 13) + #define FAST_PATH_NEEDS_WORKAROUND (1 << 14) ++#define FAST_PATH_NO_NONE_REPEAT (1 << 15) + + #define _FAST_PATH_STANDARD_FLAGS \ + (FAST_PATH_ID_TRANSFORM | \ +-- +1.6.6.1 + diff --git a/recipes/xorg-lib/pixman/0004-Add-FAST_PATH_SAMPLES_COVER_CLIP-and-FAST_PATH_16BIT.patch b/recipes/xorg-lib/pixman/0004-Add-FAST_PATH_SAMPLES_COVER_CLIP-and-FAST_PATH_16BIT.patch new file mode 100644 index 0000000000..eb388475d9 --- /dev/null +++ b/recipes/xorg-lib/pixman/0004-Add-FAST_PATH_SAMPLES_COVER_CLIP-and-FAST_PATH_16BIT.patch @@ -0,0 +1,167 @@ +From 8e7e8e3f96b094616f37fdf8a35043d7c5f64417 Mon Sep 17 00:00:00 2001 +From: Alexander Larsson <alexl@redhat.com> +Date: Fri, 12 Mar 2010 15:41:01 +0100 +Subject: [PATCH 4/9] 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. +--- + pixman/pixman-private.h | 2 + + pixman/pixman.c | 84 +++++++++++++++++++++++++++++++++++++--------- + 2 files changed, 69 insertions(+), 17 deletions(-) + +diff --git a/pixman/pixman-private.h b/pixman/pixman-private.h +index 65314b9..0cf9113 100644 +--- a/pixman/pixman-private.h ++++ b/pixman/pixman-private.h +@@ -580,6 +580,8 @@ _pixman_choose_implementation (void); + #define FAST_PATH_IS_OPAQUE (1 << 13) + #define FAST_PATH_NEEDS_WORKAROUND (1 << 14) + #define FAST_PATH_NO_NONE_REPEAT (1 << 15) ++#define FAST_PATH_SAMPLES_COVER_CLIP (1 << 16) ++#define FAST_PATH_16BIT_SAFE (1 << 17) + + #define _FAST_PATH_STANDARD_FLAGS \ + (FAST_PATH_ID_TRANSFORM | \ +diff --git a/pixman/pixman.c b/pixman/pixman.c +index c71617e..e967e34 100644 +--- a/pixman/pixman.c ++++ b/pixman/pixman.c +@@ -479,24 +479,75 @@ walk_region_internal (pixman_implementation_t *imp, + } + } + +-static force_inline pixman_bool_t +-image_covers (pixman_image_t *image, +- pixman_box32_t *extents, +- int x, +- int y) ++#define IS_16BIT(x) (((x) >= INT16_MIN) && ((x) <= INT16_MAX)) ++ ++static force_inline uint32_t ++compute_src_extents_flags (pixman_image_t *image, ++ pixman_box32_t *extents, ++ int x, ++ int y) + { +- if (image->common.type == BITS && +- image->common.repeat == PIXMAN_REPEAT_NONE) ++ pixman_box16_t extents16; ++ uint32_t flags; ++ ++ flags = FAST_PATH_COVERS_CLIP; ++ ++ if (image->common.type != BITS) ++ return flags; ++ ++ if (image->common.repeat == PIXMAN_REPEAT_NONE && ++ (x > extents->x1 || y > extents->y1 || ++ x + image->bits.width < extents->x2 || ++ y + image->bits.height < extents->y2)) ++ { ++ flags &= ~FAST_PATH_COVERS_CLIP; ++ } ++ ++ if (IS_16BIT (extents->x1 - x) && ++ IS_16BIT (extents->y1 - y) && ++ IS_16BIT (extents->x2 - x) && ++ IS_16BIT (extents->y2 - y)) + { +- if (x > extents->x1 || y > extents->y1 || +- x + image->bits.width < extents->x2 || +- y + image->bits.height < extents->y2) ++ extents16.x1 = extents->x1 - x; ++ extents16.y1 = extents->y1 - y; ++ extents16.x2 = extents->x2 - x; ++ extents16.y2 = extents->y2 - y; ++ ++ if (!image->common.transform || ++ pixman_transform_bounds (image->common.transform, &extents16)) + { +- return FALSE; ++ if (extents16.x1 >= 0 && extents16.y1 >= 0 && ++ extents16.x2 <= image->bits.width && ++ extents16.y2 <= image->bits.height) ++ { ++ flags |= FAST_PATH_SAMPLES_COVER_CLIP; ++ } + } + } + +- return TRUE; ++ if (IS_16BIT (extents->x1 - x - 1) && ++ IS_16BIT (extents->y1 - y - 1) && ++ IS_16BIT (extents->x2 - x + 1) && ++ IS_16BIT (extents->y2 - y + 1)) ++ { ++ extents16.x1 = extents->x1 - x - 1; ++ extents16.y1 = extents->y1 - y - 1; ++ extents16.x2 = extents->x2 - x + 1; ++ extents16.y2 = extents->y2 - y + 1; ++ ++ if (/* src space expanded by one in dest space fits in 16 bit */ ++ (!image->common.transform || ++ pixman_transform_bounds (image->common.transform, &extents16)) && ++ /* And src image size can be used as 16.16 fixed point */ ++ image->bits.width < 0x7fff && ++ image->bits.height < 0x7fff) ++ { ++ /* Then we're "16bit safe" */ ++ flags |= FAST_PATH_16BIT_SAFE; ++ } ++ } ++ ++ return flags; + } + + static void +@@ -581,11 +632,10 @@ do_composite (pixman_implementation_t *imp, + + extents = pixman_region32_extents (®ion); + +- if (image_covers (src, extents, dest_x - src_x, dest_y - src_y)) +- src_flags |= FAST_PATH_COVERS_CLIP; +- +- if (mask && image_covers (mask, extents, dest_x - mask_x, dest_y - mask_y)) +- mask_flags |= FAST_PATH_COVERS_CLIP; ++ src_flags |= compute_src_extents_flags (src, extents, dest_x - src_x, dest_y - src_y); ++ ++ if (mask) ++ mask_flags |= compute_src_extents_flags (mask, extents, dest_x - mask_x, dest_y - mask_y); + + /* + * Check if we can replace our operator by a simpler one +-- +1.6.6.1 + diff --git a/recipes/xorg-lib/pixman/0005-Add-specialized-fast-nearest-scalers.patch b/recipes/xorg-lib/pixman/0005-Add-specialized-fast-nearest-scalers.patch new file mode 100644 index 0000000000..6be7b9312c --- /dev/null +++ b/recipes/xorg-lib/pixman/0005-Add-specialized-fast-nearest-scalers.patch @@ -0,0 +1,284 @@ +From def20085302693c032e81456d975454acd356acd Mon Sep 17 00:00:00 2001 +From: Alexander Larsson <alexl@redhat.com> +Date: Fri, 12 Mar 2010 15:45:04 +0100 +Subject: [PATCH 5/9] 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 +--- + pixman/pixman-fast-path.c | 243 +++++++++++++++++++++++++++++++++++++++++++++ + 1 files changed, 243 insertions(+), 0 deletions(-) + +diff --git a/pixman/pixman-fast-path.c b/pixman/pixman-fast-path.c +index 4d26b0f..6607a47 100644 +--- a/pixman/pixman-fast-path.c ++++ b/pixman/pixman-fast-path.c +@@ -27,6 +27,7 @@ + #include <config.h> + #endif + #include <string.h> ++#include <stdlib.h> + #include "pixman-private.h" + #include "pixman-combine32.h" + +@@ -1373,6 +1374,208 @@ repeat (pixman_repeat_t repeat, int *c, int size) + return TRUE; + } + ++/* A macroified version of specialized nearest scalers for some ++ * common 8888 and 565 formats. It supports SRC and OVER ops. ++ * ++ * There are two repeat versions, one that handles repeat normal, ++ * and one without repeat handling that only works if the src region ++ * used is completely covered by the pre-repeated source samples. ++ * ++ * The loops are unrolled to process two pixels per iteration for better ++ * performance on most CPU architectures (superscalar processors ++ * can issue several operations simultaneously, other processors can hide ++ * instructions latencies by pipelining operations). Unrolling more ++ * does not make much sense because the compiler will start running out ++ * of spare registers soon. ++ */ ++ ++#define GET_8888_ALPHA(s) ((s) >> 24) ++ /* This is not actually used since we don't have an OVER with ++ 565 source, but it is needed to build. */ ++#define GET_0565_ALPHA(s) 0xff ++ ++#define FAST_NEAREST(scale_func_name, SRC_FORMAT, DST_FORMAT, \ ++ src_type_t, dst_type_t, OP, do_repeat) \ ++static void \ ++fast_composite_scaled_nearest_ ## scale_func_name ## _ ## OP (pixman_implementation_t *imp, \ ++ pixman_op_t op, \ ++ pixman_image_t * src_image, \ ++ pixman_image_t * mask_image, \ ++ pixman_image_t * dst_image, \ ++ int32_t src_x, \ ++ int32_t src_y, \ ++ int32_t mask_x, \ ++ int32_t mask_y, \ ++ int32_t dst_x, \ ++ int32_t dst_y, \ ++ int32_t width, \ ++ int32_t height) \ ++{ \ ++ dst_type_t *dst_line; \ ++ src_type_t *src_first_line; \ ++ uint32_t d; \ ++ src_type_t s1, s2; \ ++ uint8_t a1, a2; \ ++ int w; \ ++ int x1, x2, y; \ ++ pixman_fixed_t orig_vx; \ ++ pixman_fixed_t max_vx, max_vy; \ ++ pixman_vector_t v; \ ++ pixman_fixed_t vx, vy; \ ++ pixman_fixed_t unit_x, unit_y; \ ++ \ ++ src_type_t *src; \ ++ dst_type_t *dst; \ ++ int src_stride, dst_stride; \ ++ \ ++ if (PIXMAN_OP_ ## OP != PIXMAN_OP_SRC && PIXMAN_OP_ ## OP != PIXMAN_OP_OVER) \ ++ abort(); \ ++ \ ++ PIXMAN_IMAGE_GET_LINE (dst_image, dst_x, dst_y, dst_type_t, dst_stride, dst_line, 1); \ ++ /* pass in 0 instead of src_x and src_y because src_x and src_y need to be \ ++ * transformed from destination space to source space */ \ ++ PIXMAN_IMAGE_GET_LINE (src_image, 0, 0, src_type_t, src_stride, src_first_line, 1); \ ++ \ ++ /* reference point is the center of the pixel */ \ ++ v.vector[0] = pixman_int_to_fixed (src_x) + pixman_fixed_1 / 2; \ ++ v.vector[1] = pixman_int_to_fixed (src_y) + pixman_fixed_1 / 2; \ ++ v.vector[2] = pixman_fixed_1; \ ++ \ ++ if (!pixman_transform_point_3d (src_image->common.transform, &v)) \ ++ return; \ ++ \ ++ unit_x = src_image->common.transform->matrix[0][0]; \ ++ unit_y = src_image->common.transform->matrix[1][1]; \ ++ \ ++ /* Round down to closest integer, ensuring that 0.5 rounds to 0, not 1 */ \ ++ v.vector[0] -= pixman_fixed_e; \ ++ v.vector[1] -= pixman_fixed_e; \ ++ \ ++ vx = v.vector[0]; \ ++ vy = v.vector[1]; \ ++ \ ++ if (do_repeat) \ ++ { \ ++ /* Clamp repeating positions inside the actual samples */ \ ++ max_vx = src_image->bits.width << 16; \ ++ max_vy = src_image->bits.height << 16; \ ++ \ ++ repeat (PIXMAN_REPEAT_NORMAL, &vx, max_vx); \ ++ repeat (PIXMAN_REPEAT_NORMAL, &vy, max_vy); \ ++ } \ ++ \ ++ orig_vx = vx; \ ++ \ ++ while (--height >= 0) \ ++ { \ ++ dst = dst_line; \ ++ dst_line += dst_stride; \ ++ \ ++ y = vy >> 16; \ ++ vy += unit_y; \ ++ if (do_repeat) \ ++ repeat (PIXMAN_REPEAT_NORMAL, &vy, max_vy); \ ++ \ ++ src = src_first_line + src_stride * y; \ ++ \ ++ w = width; \ ++ vx = orig_vx; \ ++ while ((w -= 2) >= 0) \ ++ { \ ++ x1 = vx >> 16; \ ++ vx += unit_x; \ ++ if (do_repeat) \ ++ repeat (PIXMAN_REPEAT_NORMAL, &vx, max_vx); \ ++ s1 = src[x1]; \ ++ \ ++ x2 = vx >> 16; \ ++ vx += unit_x; \ ++ if (do_repeat) \ ++ repeat (PIXMAN_REPEAT_NORMAL, &vx, max_vx); \ ++ s2 = src[x2]; \ ++ \ ++ if (PIXMAN_OP_ ## OP == PIXMAN_OP_OVER) \ ++ { \ ++ a1 = GET_ ## SRC_FORMAT ## _ALPHA(s1); \ ++ a2 = GET_ ## SRC_FORMAT ## _ALPHA(s2); \ ++ \ ++ if (a1 == 0xff) \ ++ { \ ++ *dst = CONVERT_ ## SRC_FORMAT ## _TO_ ## DST_FORMAT (s1); \ ++ } \ ++ else if (s1) \ ++ { \ ++ d = CONVERT_## DST_FORMAT ## _TO_8888 (*dst); \ ++ a1 ^= 0xff; \ ++ UN8x4_MUL_UN8_ADD_UN8x4 (d, a1, s1); \ ++ *dst = CONVERT_8888_TO_ ## DST_FORMAT (d); \ ++ } \ ++ dst++; \ ++ \ ++ if (a2 == 0xff) \ ++ { \ ++ *dst = CONVERT_ ## SRC_FORMAT ## _TO_ ## DST_FORMAT (s2); \ ++ } \ ++ else if (s2) \ ++ { \ ++ d = CONVERT_## DST_FORMAT ## _TO_8888 (*dst); \ ++ a2 ^= 0xff; \ ++ UN8x4_MUL_UN8_ADD_UN8x4 (d, a2, s2); \ ++ *dst = CONVERT_8888_TO_ ## DST_FORMAT (d); \ ++ } \ ++ dst++; \ ++ } \ ++ else /* PIXMAN_OP_SRC */ \ ++ { \ ++ *dst++ = CONVERT_ ## SRC_FORMAT ## _TO_ ## DST_FORMAT (s1); \ ++ *dst++ = CONVERT_ ## SRC_FORMAT ## _TO_ ## DST_FORMAT (s2); \ ++ } \ ++ } \ ++ \ ++ if (w & 1) \ ++ { \ ++ x1 = vx >> 16; \ ++ vx += unit_x; \ ++ if (do_repeat) \ ++ repeat (PIXMAN_REPEAT_NORMAL, &vx, max_vx); \ ++ s1 = src[x1]; \ ++ \ ++ if (PIXMAN_OP_ ## OP == PIXMAN_OP_OVER) \ ++ { \ ++ a1 = GET_ ## SRC_FORMAT ## _ALPHA(s1); \ ++ \ ++ if (a1 == 0xff) \ ++ { \ ++ *dst = CONVERT_ ## SRC_FORMAT ## _TO_ ## DST_FORMAT (s1); \ ++ } \ ++ else if (s1) \ ++ { \ ++ d = CONVERT_## DST_FORMAT ## _TO_8888 (*dst); \ ++ a1 ^= 0xff; \ ++ UN8x4_MUL_UN8_ADD_UN8x4 (d, a1, s1); \ ++ *dst = CONVERT_8888_TO_ ## DST_FORMAT (d); \ ++ } \ ++ dst++; \ ++ } \ ++ else /* PIXMAN_OP_SRC */ \ ++ { \ ++ *dst++ = CONVERT_ ## SRC_FORMAT ## _TO_ ## DST_FORMAT (s1); \ ++ } \ ++ } \ ++ } \ ++} ++ ++FAST_NEAREST(x888_x888_none, 8888, 8888, uint32_t, uint32_t, SRC, /*repeat: */ 0); ++FAST_NEAREST(x888_x888_normal, 8888, 8888, uint32_t, uint32_t, SRC, /*repeat: */ 1); ++FAST_NEAREST(x888_x888_none, 8888, 8888, uint32_t, uint32_t, OVER, /*repeat: */ 0); ++FAST_NEAREST(x888_x888_normal, 8888, 8888, uint32_t, uint32_t, OVER, /*repeat: */ 1); ++FAST_NEAREST(x888_565_none, 8888, 0565, uint32_t, uint16_t, SRC, /*repeat: */ 0); ++FAST_NEAREST(x888_565_normal, 8888, 0565, uint32_t, uint16_t, SRC, /*repeat: */ 1); ++FAST_NEAREST(565_565_none, 0565, 0565, uint16_t, uint16_t, SRC, /*repeat: */ 0); ++FAST_NEAREST(565_565_normal, 0565, 0565, uint16_t, uint16_t, SRC, /*repeat: */ 1); ++FAST_NEAREST(8888_565_none, 8888, 0565, uint32_t, uint16_t, OVER, /*repeat: */ 0); ++FAST_NEAREST(8888_565_normal, 8888, 0565, uint32_t, uint16_t, OVER, /*repeat: */ 1); ++ + static force_inline uint32_t + fetch_nearest (pixman_repeat_t src_repeat, + pixman_format_code_t format, +@@ -1595,6 +1798,46 @@ static const pixman_fast_path_t c_fast_paths[] = + FAST_PATH_NO_ACCESSORS | \ + FAST_PATH_NO_WIDE_FORMAT) + ++#define HAS_NORMAL_REPEAT_FLAGS \ ++ (FAST_PATH_NO_REFLECT_REPEAT | \ ++ FAST_PATH_NO_PAD_REPEAT | \ ++ FAST_PATH_NO_NONE_REPEAT) ++ ++#define SIMPLE_NEAREST_FAST_PATH(op,s,d,func) \ ++ { PIXMAN_OP_ ## op, \ ++ PIXMAN_ ## s, \ ++ SCALED_NEAREST_FLAGS | HAS_NORMAL_REPEAT_FLAGS | FAST_PATH_16BIT_SAFE, \ ++ PIXMAN_null, 0, \ ++ PIXMAN_ ## d, FAST_PATH_STD_DEST_FLAGS, \ ++ fast_composite_scaled_nearest_ ## func ## _normal ## _ ## op, \ ++ }, \ ++ { PIXMAN_OP_ ## op, \ ++ PIXMAN_ ## s, \ ++ SCALED_NEAREST_FLAGS | FAST_PATH_SAMPLES_COVER_CLIP, \ ++ PIXMAN_null, 0, \ ++ PIXMAN_ ## d, FAST_PATH_STD_DEST_FLAGS, \ ++ fast_composite_scaled_nearest_ ## func ## _none ## _ ## op, \ ++ } ++ SIMPLE_NEAREST_FAST_PATH (SRC, x8r8g8b8, x8r8g8b8, x888_x888), ++ SIMPLE_NEAREST_FAST_PATH (SRC, a8r8g8b8, x8r8g8b8, x888_x888), ++ SIMPLE_NEAREST_FAST_PATH (SRC, x8b8g8r8, x8b8g8r8, x888_x888), ++ SIMPLE_NEAREST_FAST_PATH (SRC, a8b8g8r8, x8b8g8r8, x888_x888), ++ ++ SIMPLE_NEAREST_FAST_PATH (SRC, a8r8g8b8, a8r8g8b8, x888_x888), ++ SIMPLE_NEAREST_FAST_PATH (SRC, a8b8g8r8, a8b8g8r8, x888_x888), ++ ++ SIMPLE_NEAREST_FAST_PATH (SRC, x8r8g8b8, r5g6b5, x888_565), ++ SIMPLE_NEAREST_FAST_PATH (SRC, a8r8g8b8, r5g6b5, x888_565), ++ ++ SIMPLE_NEAREST_FAST_PATH (SRC, r5g6b5, r5g6b5, 565_565), ++ ++ SIMPLE_NEAREST_FAST_PATH (OVER, a8r8g8b8, x8r8g8b8, x888_x888), ++ SIMPLE_NEAREST_FAST_PATH (OVER, a8b8g8r8, x8b8g8r8, x888_x888), ++ SIMPLE_NEAREST_FAST_PATH (OVER, a8r8g8b8, a8r8g8b8, x888_x888), ++ SIMPLE_NEAREST_FAST_PATH (OVER, a8b8g8r8, a8b8g8r8, x888_x888), ++ ++ SIMPLE_NEAREST_FAST_PATH (OVER, a8b8g8r8, r5g6b5, 8888_565), ++ + #define NEAREST_FAST_PATH(op,s,d) \ + { PIXMAN_OP_ ## op, \ + PIXMAN_ ## s, SCALED_NEAREST_FLAGS, \ +-- +1.6.6.1 + diff --git a/recipes/xorg-lib/pixman/0006-Generic-C-implementation-of-pixman_blt-with-overlapp.patch b/recipes/xorg-lib/pixman/0006-Generic-C-implementation-of-pixman_blt-with-overlapp.patch new file mode 100644 index 0000000000..8b265c0d74 --- /dev/null +++ b/recipes/xorg-lib/pixman/0006-Generic-C-implementation-of-pixman_blt-with-overlapp.patch @@ -0,0 +1,114 @@ +From 8d1125fd6a25a0d1d758fd93384bf1baf07bcdf0 Mon Sep 17 00:00:00 2001 +From: Siarhei Siamashka <siarhei.siamashka@nokia.com> +Date: Tue, 16 Mar 2010 16:55:28 +0100 +Subject: [PATCH 6/9] Generic C implementation of pixman_blt with overlapping support + +Uses memcpy/memmove functions to copy pixels, can handle the +case when both source and destination areas are in the same +image (this is useful for scrolling). + +It is assumed that copying direction is only important when +using the same image for both source and destination (and +src_stride == dst_stride). Copying direction is undefined +for the images with different source and destination stride +which happen to be in the overlapped areas (but this is an +unrealistic case anyway). +--- + pixman/pixman-general.c | 21 ++++++++++++++++++--- + pixman/pixman-private.h | 43 +++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 61 insertions(+), 3 deletions(-) + +diff --git a/pixman/pixman-general.c b/pixman/pixman-general.c +index bddf79a..f525744 100644 +--- a/pixman/pixman-general.c ++++ b/pixman/pixman-general.c +@@ -285,9 +285,24 @@ general_blt (pixman_implementation_t *imp, + int width, + int height) + { +- /* We can't blit unless we have sse2 or mmx */ +- +- return FALSE; ++ uint8_t *dst_bytes = (uint8_t *)dst_bits; ++ uint8_t *src_bytes = (uint8_t *)src_bits; ++ int bpp; ++ ++ if (src_bpp != dst_bpp || src_bpp & 7) ++ return FALSE; ++ ++ bpp = src_bpp >> 3; ++ width *= bpp; ++ src_stride *= 4; ++ dst_stride *= 4; ++ pixman_blt_helper (src_bytes + src_y * src_stride + src_x * bpp, ++ dst_bytes + dst_y * dst_stride + dst_x * bpp, ++ src_stride, ++ dst_stride, ++ width, ++ height); ++ return TRUE; + } + + static pixman_bool_t +diff --git a/pixman/pixman-private.h b/pixman/pixman-private.h +index 0cf9113..3478e1b 100644 +--- a/pixman/pixman-private.h ++++ b/pixman/pixman-private.h +@@ -10,6 +10,7 @@ + + #include "pixman.h" + #include <time.h> ++#include <string.h> + #include <assert.h> + #include <stdio.h> + #include <string.h> +@@ -866,4 +867,46 @@ void pixman_timer_register (pixman_timer_t *timer); + + #endif /* PIXMAN_TIMERS */ + ++/* a helper function, can blit 8-bit images with src/dst overlapping support */ ++static inline void ++pixman_blt_helper (uint8_t *src_bytes, ++ uint8_t *dst_bytes, ++ int src_stride, ++ int dst_stride, ++ int width, ++ int height) ++{ ++ /* ++ * The second part of this check is not strictly needed, but it prevents ++ * unnecessary upside-down processing of areas which belong to different ++ * images. Upside-down processing can be slower with fixed-distance-ahead ++ * prefetch and perceived as having more tearing. ++ */ ++ if (src_bytes < dst_bytes + width && ++ src_bytes + src_stride * height > dst_bytes) ++ { ++ src_bytes += src_stride * height - src_stride; ++ dst_bytes += dst_stride * height - dst_stride; ++ dst_stride = -dst_stride; ++ src_stride = -src_stride; ++ /* Horizontal scrolling to the left needs memmove */ ++ if (src_bytes + width > dst_bytes) ++ { ++ while (--height >= 0) ++ { ++ memmove (dst_bytes, src_bytes, width); ++ dst_bytes += dst_stride; ++ src_bytes += src_stride; ++ } ++ return; ++ } ++ } ++ while (--height >= 0) ++ { ++ memcpy (dst_bytes, src_bytes, width); ++ dst_bytes += dst_stride; ++ src_bytes += src_stride; ++ } ++} ++ + #endif /* PIXMAN_PRIVATE_H */ +-- +1.6.6.1 + diff --git a/recipes/xorg-lib/pixman/0007-Support-of-overlapping-src-dst-for-pixman_blt_mmx.patch b/recipes/xorg-lib/pixman/0007-Support-of-overlapping-src-dst-for-pixman_blt_mmx.patch new file mode 100644 index 0000000000..f9a812e376 --- /dev/null +++ b/recipes/xorg-lib/pixman/0007-Support-of-overlapping-src-dst-for-pixman_blt_mmx.patch @@ -0,0 +1,91 @@ +From ac9b18e8aefad1992c3057dc3cf7c309f14544d2 Mon Sep 17 00:00:00 2001 +From: Siarhei Siamashka <siarhei.siamashka@nokia.com> +Date: Thu, 22 Oct 2009 05:45:47 +0300 +Subject: [PATCH 7/9] Support of overlapping src/dst for pixman_blt_mmx + +--- + pixman/pixman-mmx.c | 55 +++++++++++++++++++++++++++++--------------------- + 1 files changed, 32 insertions(+), 23 deletions(-) + +diff --git a/pixman/pixman-mmx.c b/pixman/pixman-mmx.c +index e084e7f..6212b31 100644 +--- a/pixman/pixman-mmx.c ++++ b/pixman/pixman-mmx.c +@@ -2994,34 +2994,43 @@ pixman_blt_mmx (uint32_t *src_bits, + { + uint8_t * src_bytes; + uint8_t * dst_bytes; +- int byte_width; ++ int bpp; + +- if (src_bpp != dst_bpp) ++ if (src_bpp != dst_bpp || src_bpp & 7) + return FALSE; + +- if (src_bpp == 16) +- { +- src_stride = src_stride * (int) sizeof (uint32_t) / 2; +- dst_stride = dst_stride * (int) sizeof (uint32_t) / 2; +- src_bytes = (uint8_t *)(((uint16_t *)src_bits) + src_stride * (src_y) + (src_x)); +- dst_bytes = (uint8_t *)(((uint16_t *)dst_bits) + dst_stride * (dst_y) + (dst_x)); +- byte_width = 2 * width; +- src_stride *= 2; +- dst_stride *= 2; +- } +- else if (src_bpp == 32) ++ bpp = src_bpp >> 3; ++ width *= bpp; ++ src_stride *= 4; ++ dst_stride *= 4; ++ src_bytes = (uint8_t *)src_bits + src_y * src_stride + src_x * bpp; ++ dst_bytes = (uint8_t *)dst_bits + dst_y * dst_stride + dst_x * bpp; ++ ++ if (src_bpp != 16 && src_bpp != 32) + { +- src_stride = src_stride * (int) sizeof (uint32_t) / 4; +- dst_stride = dst_stride * (int) sizeof (uint32_t) / 4; +- src_bytes = (uint8_t *)(((uint32_t *)src_bits) + src_stride * (src_y) + (src_x)); +- dst_bytes = (uint8_t *)(((uint32_t *)dst_bits) + dst_stride * (dst_y) + (dst_x)); +- byte_width = 4 * width; +- src_stride *= 4; +- dst_stride *= 4; ++ pixman_blt_helper (src_bytes, dst_bytes, src_stride, dst_stride, ++ width, height); ++ return TRUE; + } +- else ++ ++ if (src_bytes < dst_bytes && src_bytes + src_stride * height > dst_bytes) + { +- return FALSE; ++ src_bytes += src_stride * height - src_stride; ++ dst_bytes += dst_stride * height - dst_stride; ++ dst_stride = -dst_stride; ++ src_stride = -src_stride; ++ ++ if (src_bytes + width > dst_bytes) ++ { ++ /* TODO: reverse scanline copy using MMX */ ++ while (--height >= 0) ++ { ++ memmove (dst_bytes, src_bytes, width); ++ dst_bytes += dst_stride; ++ src_bytes += src_stride; ++ } ++ return TRUE; ++ } + } + + while (height--) +@@ -3031,7 +3040,7 @@ pixman_blt_mmx (uint32_t *src_bits, + uint8_t *d = dst_bytes; + src_bytes += src_stride; + dst_bytes += dst_stride; +- w = byte_width; ++ w = width; + + while (w >= 2 && ((unsigned long)d & 3)) + { +-- +1.6.6.1 + diff --git a/recipes/xorg-lib/pixman/0008-Support-of-overlapping-src-dst-for-pixman_blt_sse2.patch b/recipes/xorg-lib/pixman/0008-Support-of-overlapping-src-dst-for-pixman_blt_sse2.patch new file mode 100644 index 0000000000..5b311fe81f --- /dev/null +++ b/recipes/xorg-lib/pixman/0008-Support-of-overlapping-src-dst-for-pixman_blt_sse2.patch @@ -0,0 +1,91 @@ +From f6d6ad1063e29a95bad4c4a2e43f3ecf90344ef7 Mon Sep 17 00:00:00 2001 +From: Siarhei Siamashka <siarhei.siamashka@nokia.com> +Date: Thu, 22 Oct 2009 05:45:54 +0300 +Subject: [PATCH 8/9] Support of overlapping src/dst for pixman_blt_sse2 + +--- + pixman/pixman-sse2.c | 55 +++++++++++++++++++++++++++++-------------------- + 1 files changed, 32 insertions(+), 23 deletions(-) + +diff --git a/pixman/pixman-sse2.c b/pixman/pixman-sse2.c +index 946e7ba..66053ae 100644 +--- a/pixman/pixman-sse2.c ++++ b/pixman/pixman-sse2.c +@@ -5299,34 +5299,43 @@ pixman_blt_sse2 (uint32_t *src_bits, + { + uint8_t * src_bytes; + uint8_t * dst_bytes; +- int byte_width; ++ int bpp; + +- if (src_bpp != dst_bpp) ++ if (src_bpp != dst_bpp || src_bpp & 7) + return FALSE; + +- if (src_bpp == 16) +- { +- src_stride = src_stride * (int) sizeof (uint32_t) / 2; +- dst_stride = dst_stride * (int) sizeof (uint32_t) / 2; +- src_bytes =(uint8_t *)(((uint16_t *)src_bits) + src_stride * (src_y) + (src_x)); +- dst_bytes = (uint8_t *)(((uint16_t *)dst_bits) + dst_stride * (dst_y) + (dst_x)); +- byte_width = 2 * width; +- src_stride *= 2; +- dst_stride *= 2; +- } +- else if (src_bpp == 32) ++ bpp = src_bpp >> 3; ++ width *= bpp; ++ src_stride *= 4; ++ dst_stride *= 4; ++ src_bytes = (uint8_t *)src_bits + src_y * src_stride + src_x * bpp; ++ dst_bytes = (uint8_t *)dst_bits + dst_y * dst_stride + dst_x * bpp; ++ ++ if (src_bpp != 16 && src_bpp != 32) + { +- src_stride = src_stride * (int) sizeof (uint32_t) / 4; +- dst_stride = dst_stride * (int) sizeof (uint32_t) / 4; +- src_bytes = (uint8_t *)(((uint32_t *)src_bits) + src_stride * (src_y) + (src_x)); +- dst_bytes = (uint8_t *)(((uint32_t *)dst_bits) + dst_stride * (dst_y) + (dst_x)); +- byte_width = 4 * width; +- src_stride *= 4; +- dst_stride *= 4; ++ pixman_blt_helper (src_bytes, dst_bytes, src_stride, dst_stride, ++ width, height); ++ return TRUE; + } +- else ++ ++ if (src_bytes < dst_bytes && src_bytes + src_stride * height > dst_bytes) + { +- return FALSE; ++ src_bytes += src_stride * height - src_stride; ++ dst_bytes += dst_stride * height - dst_stride; ++ dst_stride = -dst_stride; ++ src_stride = -src_stride; ++ ++ if (src_bytes + width > dst_bytes) ++ { ++ /* TODO: reverse scanline copy using SSE2 */ ++ while (--height >= 0) ++ { ++ memmove (dst_bytes, src_bytes, width); ++ dst_bytes += dst_stride; ++ src_bytes += src_stride; ++ } ++ return TRUE; ++ } + } + + cache_prefetch ((__m128i*)src_bytes); +@@ -5339,7 +5348,7 @@ pixman_blt_sse2 (uint32_t *src_bits, + uint8_t *d = dst_bytes; + src_bytes += src_stride; + dst_bytes += dst_stride; +- w = byte_width; ++ w = width; + + cache_prefetch_next ((__m128i*)s); + cache_prefetch_next ((__m128i*)d); +-- +1.6.6.1 + diff --git a/recipes/xorg-lib/pixman/0009-Support-of-overlapping-src-dst-for-pixman_blt_neon.patch b/recipes/xorg-lib/pixman/0009-Support-of-overlapping-src-dst-for-pixman_blt_neon.patch new file mode 100644 index 0000000000..ae7b043194 --- /dev/null +++ b/recipes/xorg-lib/pixman/0009-Support-of-overlapping-src-dst-for-pixman_blt_neon.patch @@ -0,0 +1,94 @@ +From 41572ca5aa9e50e4d1000b3da1e6ee43c6f4088a Mon Sep 17 00:00:00 2001 +From: Siarhei Siamashka <siarhei.siamashka@nokia.com> +Date: Wed, 18 Nov 2009 06:08:48 +0200 +Subject: [PATCH 9/9] Support of overlapping src/dst for pixman_blt_neon + +--- + pixman/pixman-arm-neon.c | 62 +++++++++++++++++++++++++++++++++++++-------- + 1 files changed, 51 insertions(+), 11 deletions(-) + +diff --git a/pixman/pixman-arm-neon.c b/pixman/pixman-arm-neon.c +index 24ceeeb..134493d 100644 +--- a/pixman/pixman-arm-neon.c ++++ b/pixman/pixman-arm-neon.c +@@ -360,26 +360,66 @@ pixman_blt_neon (uint32_t *src_bits, + int width, + int height) + { +- if (src_bpp != dst_bpp) ++ uint8_t * src_bytes; ++ uint8_t * dst_bytes; ++ int bpp; ++ ++ if (src_bpp != dst_bpp || src_bpp & 7) + return FALSE; + ++ bpp = src_bpp >> 3; ++ width *= bpp; ++ src_stride *= 4; ++ dst_stride *= 4; ++ src_bytes = (uint8_t *)src_bits + src_y * src_stride + src_x * bpp; ++ dst_bytes = (uint8_t *)dst_bits + dst_y * dst_stride + dst_x * bpp; ++ ++ if (src_bpp != 16 && src_bpp != 32) ++ { ++ pixman_blt_helper (src_bytes, dst_bytes, src_stride, dst_stride, ++ width, height); ++ return TRUE; ++ } ++ ++ if (src_bytes < dst_bytes && src_bytes + src_stride * height > dst_bytes) ++ { ++ src_bytes += src_stride * height - src_stride; ++ dst_bytes += dst_stride * height - dst_stride; ++ dst_stride = -dst_stride; ++ src_stride = -src_stride; ++ ++ if (src_bytes + width > dst_bytes) ++ { ++ /* TODO: reverse scanline copy using NEON */ ++ while (--height >= 0) ++ { ++ memmove (dst_bytes, src_bytes, width); ++ dst_bytes += dst_stride; ++ src_bytes += src_stride; ++ } ++ return TRUE; ++ } ++ } ++ + switch (src_bpp) + { + case 16: + pixman_composite_src_0565_0565_asm_neon ( +- width, height, +- (uint16_t *)(((char *) dst_bits) + +- dst_y * dst_stride * 4 + dst_x * 2), dst_stride * 2, +- (uint16_t *)(((char *) src_bits) + +- src_y * src_stride * 4 + src_x * 2), src_stride * 2); ++ width >> 1, ++ height, ++ (uint16_t *) dst_bytes, ++ dst_stride >> 1, ++ (uint16_t *) src_bytes, ++ src_stride >> 1); + return TRUE; + case 32: + pixman_composite_src_8888_8888_asm_neon ( +- width, height, +- (uint32_t *)(((char *) dst_bits) + +- dst_y * dst_stride * 4 + dst_x * 4), dst_stride, +- (uint32_t *)(((char *) src_bits) + +- src_y * src_stride * 4 + src_x * 4), src_stride); ++ width >> 2, ++ height, ++ (uint32_t *) dst_bytes, ++ dst_stride >> 2, ++ (uint32_t *) src_bytes, ++ src_stride >> 2); + return TRUE; + default: + return FALSE; +-- +1.6.6.1 + diff --git a/recipes/xorg-lib/pixman_git.bb b/recipes/xorg-lib/pixman_git.bb index b15fc355f7..5080438cbc 100644 --- a/recipes/xorg-lib/pixman_git.bb +++ b/recipes/xorg-lib/pixman_git.bb @@ -3,24 +3,26 @@ PRIORITY = "optional" DESCRIPTION = "Low-level pixel manipulation library." LICENSE = "X11" -PV = "0.17.8" -PR = "r8" +PV = "0.17.10" +PR = "r0" PR_append = "+gitr${SRCREV}" BBCLASSEXTEND="native" -SRCREV = "7a15fa25ddb88ebb4ac00772854271f102f06e81" +SRCREV = "313353f1fb9d40d0c3aaf7cfb99ca978b29003a4" DEFAULT_PREFERENCE = "-1" -SRC_URI = "git://anongit.freedesktop.org/~sandmann/pixman;protocol=git;branch=flags \ - file://0003-Generic-C-implementation-of-pixman_blt-with-overlapp.patch;patch=1 \ - file://0004-Support-of-overlapping-src-dst-for-pixman_blt_mmx.patch;patch=1 \ - file://0005-Support-of-overlapping-src-dst-for-pixman_blt_sse2.patch;patch=1 \ - file://0006-Support-of-overlapping-src-dst-for-pixman_blt_neon.patch;patch=1 \ - file://1-composite.patch;patch=1 \ - file://2-composite.patch;patch=1 \ - file://3-composite.patch;patch=1 \ +SRC_URI = "git://anongit.freedesktop.org/pixman;protocol=git;branch=master \ + file://0001-Add-CONVERT_0565_TO_8888-macro.patch;patch=1 \ + file://0002-Add-CONVERT_8888_TO_8888-and-CONVERT_0565_TO_0565-ma.patch;patch=1 \ + file://0003-Add-FAST_PATH_NO_NONE_REPEAT-flag.patch;patch=1 \ + file://0004-Add-FAST_PATH_SAMPLES_COVER_CLIP-and-FAST_PATH_16BIT.patch;patch=1 \ + file://0005-Add-specialized-fast-nearest-scalers.patch;patch=1 \ + file://0006-Generic-C-implementation-of-pixman_blt-with-overlapp.patch;patch=1 \ + file://0007-Support-of-overlapping-src-dst-for-pixman_blt_mmx.patch;patch=1 \ + file://0008-Support-of-overlapping-src-dst-for-pixman_blt_sse2.patch;patch=1 \ + file://0009-Support-of-overlapping-src-dst-for-pixman_blt_neon.patch;patch=1 \ file://over-n-8-0565.patch;patch=1 \ file://src-8888-0565.patch;patch=1 \ " -- cgit v1.2.3 From 01c5424aa65a52b774c71a80ba1cbc1caa41b8ab Mon Sep 17 00:00:00 2001 From: Koen Kooi <koen@openembedded.org> Date: Tue, 16 Mar 2010 19:25:03 +0100 Subject: pixman git: fix typo in patch --- recipes/xorg-lib/pixman/0005-Add-specialized-fast-nearest-scalers.patch | 2 +- recipes/xorg-lib/pixman_git.bb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'recipes/xorg-lib') diff --git a/recipes/xorg-lib/pixman/0005-Add-specialized-fast-nearest-scalers.patch b/recipes/xorg-lib/pixman/0005-Add-specialized-fast-nearest-scalers.patch index 6be7b9312c..962b4e03e2 100644 --- a/recipes/xorg-lib/pixman/0005-Add-specialized-fast-nearest-scalers.patch +++ b/recipes/xorg-lib/pixman/0005-Add-specialized-fast-nearest-scalers.patch @@ -274,7 +274,7 @@ index 4d26b0f..6607a47 100644 + SIMPLE_NEAREST_FAST_PATH (OVER, a8r8g8b8, a8r8g8b8, x888_x888), + SIMPLE_NEAREST_FAST_PATH (OVER, a8b8g8r8, a8b8g8r8, x888_x888), + -+ SIMPLE_NEAREST_FAST_PATH (OVER, a8b8g8r8, r5g6b5, 8888_565), ++ SIMPLE_NEAREST_FAST_PATH (OVER, a8r8g8b8, r5g6b5, 8888_565), + #define NEAREST_FAST_PATH(op,s,d) \ { PIXMAN_OP_ ## op, \ diff --git a/recipes/xorg-lib/pixman_git.bb b/recipes/xorg-lib/pixman_git.bb index 5080438cbc..aae86e92fe 100644 --- a/recipes/xorg-lib/pixman_git.bb +++ b/recipes/xorg-lib/pixman_git.bb @@ -4,7 +4,7 @@ DESCRIPTION = "Low-level pixel manipulation library." LICENSE = "X11" PV = "0.17.10" -PR = "r0" +PR = "r1" PR_append = "+gitr${SRCREV}" BBCLASSEXTEND="native" -- cgit v1.2.3 From 6c5f9d4325be253fb3cb9b6d3bec11f7a7a13562 Mon Sep 17 00:00:00 2001 From: Koen Kooi <koen@openembedded.org> Date: Wed, 17 Mar 2010 18:33:39 +0100 Subject: pixman git: remove patches that were applied upstream --- .../0001-ARM-NEON-optimized-pixman_blt.patch | 104 -------- .../0001-Add-CONVERT_0565_TO_8888-macro.patch | 27 -- ...mplementation-of-pixman_blt-with-overlapp.patch | 114 +++++++++ ..._8888_TO_8888-and-CONVERT_0565_TO_0565-ma.patch | 28 -- ...of-overlapping-src-dst-for-pixman_blt_mmx.patch | 91 +++++++ ...0002-Test-program-for-pixman_blt-function.patch | 178 ------------- .../0003-Add-FAST_PATH_NO_NONE_REPEAT-flag.patch | 53 ---- ...mplementation-of-pixman_blt-with-overlapp.patch | 114 --------- ...f-overlapping-src-dst-for-pixman_blt_sse2.patch | 91 +++++++ ...TH_SAMPLES_COVER_CLIP-and-FAST_PATH_16BIT.patch | 167 ------------ ...of-overlapping-src-dst-for-pixman_blt_mmx.patch | 91 ------- ...f-overlapping-src-dst-for-pixman_blt_neon.patch | 94 +++++++ ...0005-Add-specialized-fast-nearest-scalers.patch | 284 --------------------- ...f-overlapping-src-dst-for-pixman_blt_sse2.patch | 91 ------- ...mplementation-of-pixman_blt-with-overlapp.patch | 114 --------- ...f-overlapping-src-dst-for-pixman_blt_neon.patch | 93 ------- ...of-overlapping-src-dst-for-pixman_blt_mmx.patch | 91 ------- ...f-overlapping-src-dst-for-pixman_blt_sse2.patch | 91 ------- ...f-overlapping-src-dst-for-pixman_blt_neon.patch | 94 ------- recipes/xorg-lib/pixman/0041-Fix-filler-bug.patch | 25 -- .../pixman/0042-Really-fix-filler-bug.patch | 35 --- recipes/xorg-lib/pixman_git.bb | 19 +- 22 files changed, 397 insertions(+), 1692 deletions(-) delete mode 100644 recipes/xorg-lib/pixman/0001-ARM-NEON-optimized-pixman_blt.patch delete mode 100644 recipes/xorg-lib/pixman/0001-Add-CONVERT_0565_TO_8888-macro.patch create mode 100644 recipes/xorg-lib/pixman/0001-Generic-C-implementation-of-pixman_blt-with-overlapp.patch delete mode 100644 recipes/xorg-lib/pixman/0002-Add-CONVERT_8888_TO_8888-and-CONVERT_0565_TO_0565-ma.patch create mode 100644 recipes/xorg-lib/pixman/0002-Support-of-overlapping-src-dst-for-pixman_blt_mmx.patch delete mode 100644 recipes/xorg-lib/pixman/0002-Test-program-for-pixman_blt-function.patch delete mode 100644 recipes/xorg-lib/pixman/0003-Add-FAST_PATH_NO_NONE_REPEAT-flag.patch delete mode 100644 recipes/xorg-lib/pixman/0003-Generic-C-implementation-of-pixman_blt-with-overlapp.patch create mode 100644 recipes/xorg-lib/pixman/0003-Support-of-overlapping-src-dst-for-pixman_blt_sse2.patch delete mode 100644 recipes/xorg-lib/pixman/0004-Add-FAST_PATH_SAMPLES_COVER_CLIP-and-FAST_PATH_16BIT.patch delete mode 100644 recipes/xorg-lib/pixman/0004-Support-of-overlapping-src-dst-for-pixman_blt_mmx.patch create mode 100644 recipes/xorg-lib/pixman/0004-Support-of-overlapping-src-dst-for-pixman_blt_neon.patch delete mode 100644 recipes/xorg-lib/pixman/0005-Add-specialized-fast-nearest-scalers.patch delete mode 100644 recipes/xorg-lib/pixman/0005-Support-of-overlapping-src-dst-for-pixman_blt_sse2.patch delete mode 100644 recipes/xorg-lib/pixman/0006-Generic-C-implementation-of-pixman_blt-with-overlapp.patch delete mode 100644 recipes/xorg-lib/pixman/0006-Support-of-overlapping-src-dst-for-pixman_blt_neon.patch delete mode 100644 recipes/xorg-lib/pixman/0007-Support-of-overlapping-src-dst-for-pixman_blt_mmx.patch delete mode 100644 recipes/xorg-lib/pixman/0008-Support-of-overlapping-src-dst-for-pixman_blt_sse2.patch delete mode 100644 recipes/xorg-lib/pixman/0009-Support-of-overlapping-src-dst-for-pixman_blt_neon.patch delete mode 100644 recipes/xorg-lib/pixman/0041-Fix-filler-bug.patch delete mode 100644 recipes/xorg-lib/pixman/0042-Really-fix-filler-bug.patch (limited to 'recipes/xorg-lib') diff --git a/recipes/xorg-lib/pixman/0001-ARM-NEON-optimized-pixman_blt.patch b/recipes/xorg-lib/pixman/0001-ARM-NEON-optimized-pixman_blt.patch deleted file mode 100644 index ed2b68d782..0000000000 --- a/recipes/xorg-lib/pixman/0001-ARM-NEON-optimized-pixman_blt.patch +++ /dev/null @@ -1,104 +0,0 @@ -From e94b8057370a430eb91b914ed4c0050f72e9fa37 Mon Sep 17 00:00:00 2001 -From: Siarhei Siamashka <siarhei.siamashka@nokia.com> -Date: Wed, 18 Nov 2009 04:26:18 +0200 -Subject: [PATCH 1/6] ARM: NEON optimized pixman_blt - ---- - pixman/pixman-arm-neon.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++ - 1 files changed, 67 insertions(+), 0 deletions(-) - -diff --git a/pixman/pixman-arm-neon.c b/pixman/pixman-arm-neon.c -index 2ed8b4b..495fda4 100644 ---- a/pixman/pixman-arm-neon.c -+++ b/pixman/pixman-arm-neon.c -@@ -292,6 +292,43 @@ pixman_fill_neon (uint32_t *bits, - } - } - -+static pixman_bool_t -+pixman_blt_neon (uint32_t *src_bits, -+ uint32_t *dst_bits, -+ int src_stride, -+ int dst_stride, -+ int src_bpp, -+ int dst_bpp, -+ int src_x, -+ int src_y, -+ int dst_x, -+ int dst_y, -+ int width, -+ int height) -+{ -+ switch (src_bpp) -+ { -+ case 16: -+ pixman_composite_src_0565_0565_asm_neon ( -+ width, height, -+ (uint16_t *)(((char *) dst_bits) + -+ dst_y * dst_stride * 4 + dst_x * 2), dst_stride * 2, -+ (uint16_t *)(((char *) src_bits) + -+ src_y * src_stride * 4 + src_x * 2), src_stride * 2); -+ return TRUE; -+ case 32: -+ pixman_composite_src_8888_8888_asm_neon ( -+ width, height, -+ (uint32_t *)(((char *) dst_bits) + -+ dst_y * dst_stride * 4 + dst_x * 4), dst_stride, -+ (uint32_t *)(((char *) src_bits) + -+ src_y * src_stride * 4 + src_x * 4), src_stride); -+ return TRUE; -+ default: -+ return FALSE; -+ } -+} -+ - static const pixman_fast_path_t arm_neon_fast_path_array[] = - { - { PIXMAN_OP_SRC, PIXMAN_r5g6b5, PIXMAN_null, PIXMAN_r5g6b5, neon_composite_src_0565_0565 }, -@@ -361,6 +398,35 @@ arm_neon_composite (pixman_implementation_t *imp, - } - - static pixman_bool_t -+arm_neon_blt (pixman_implementation_t *imp, -+ uint32_t * src_bits, -+ uint32_t * dst_bits, -+ int src_stride, -+ int dst_stride, -+ int src_bpp, -+ int dst_bpp, -+ int src_x, -+ int src_y, -+ int dst_x, -+ int dst_y, -+ int width, -+ int height) -+{ -+ if (!pixman_blt_neon ( -+ src_bits, dst_bits, src_stride, dst_stride, src_bpp, dst_bpp, -+ src_x, src_y, dst_x, dst_y, width, height)) -+ -+ { -+ return _pixman_implementation_blt ( -+ imp->delegate, -+ src_bits, dst_bits, src_stride, dst_stride, src_bpp, dst_bpp, -+ src_x, src_y, dst_x, dst_y, width, height); -+ } -+ -+ return TRUE; -+} -+ -+static pixman_bool_t - arm_neon_fill (pixman_implementation_t *imp, - uint32_t * bits, - int stride, -@@ -385,6 +451,7 @@ _pixman_implementation_create_arm_neon (void) - pixman_implementation_t *imp = _pixman_implementation_create (general); - - imp->composite = arm_neon_composite; -+ imp->blt = arm_neon_blt; - imp->fill = arm_neon_fill; - - return imp; --- -1.6.2.4 - diff --git a/recipes/xorg-lib/pixman/0001-Add-CONVERT_0565_TO_8888-macro.patch b/recipes/xorg-lib/pixman/0001-Add-CONVERT_0565_TO_8888-macro.patch deleted file mode 100644 index 4caf6393fc..0000000000 --- a/recipes/xorg-lib/pixman/0001-Add-CONVERT_0565_TO_8888-macro.patch +++ /dev/null @@ -1,27 +0,0 @@ -From deb3b0ab6a97f4584fe37b3ef708dcad59ceddde Mon Sep 17 00:00:00 2001 -From: Alexander Larsson <alexl@redhat.com> -Date: Fri, 12 Mar 2010 16:23:42 +0100 -Subject: [PATCH 1/9] 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. ---- - pixman/pixman-private.h | 2 ++ - 1 files changed, 2 insertions(+), 0 deletions(-) - -diff --git a/pixman/pixman-private.h b/pixman/pixman-private.h -index 9dcdca7..d0bec39 100644 ---- a/pixman/pixman-private.h -+++ b/pixman/pixman-private.h -@@ -704,6 +704,8 @@ pixman_region16_copy_from_region32 (pixman_region16_t *dst, - ((((s) << 5) & 0xfc00) | (((s) >> 1) & 0x300)) | \ - ((((s) << 8) & 0xf80000) | (((s) << 3) & 0x70000))) - -+#define CONVERT_0565_TO_8888(s) (CONVERT_0565_TO_0888(s) | 0xff000000) -+ - #define PIXMAN_FORMAT_IS_WIDE(f) \ - (PIXMAN_FORMAT_A (f) > 8 || \ - PIXMAN_FORMAT_R (f) > 8 || \ --- -1.6.6.1 - diff --git a/recipes/xorg-lib/pixman/0001-Generic-C-implementation-of-pixman_blt-with-overlapp.patch b/recipes/xorg-lib/pixman/0001-Generic-C-implementation-of-pixman_blt-with-overlapp.patch new file mode 100644 index 0000000000..210cb89c62 --- /dev/null +++ b/recipes/xorg-lib/pixman/0001-Generic-C-implementation-of-pixman_blt-with-overlapp.patch @@ -0,0 +1,114 @@ +From bf8fb2bf56478c11935dbb33e725f7a25746d347 Mon Sep 17 00:00:00 2001 +From: Siarhei Siamashka <siarhei.siamashka@nokia.com> +Date: Tue, 16 Mar 2010 16:55:28 +0100 +Subject: [PATCH 1/4] Generic C implementation of pixman_blt with overlapping support + +Uses memcpy/memmove functions to copy pixels, can handle the +case when both source and destination areas are in the same +image (this is useful for scrolling). + +It is assumed that copying direction is only important when +using the same image for both source and destination (and +src_stride == dst_stride). Copying direction is undefined +for the images with different source and destination stride +which happen to be in the overlapped areas (but this is an +unrealistic case anyway). +--- + pixman/pixman-general.c | 21 ++++++++++++++++++--- + pixman/pixman-private.h | 43 +++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 61 insertions(+), 3 deletions(-) + +diff --git a/pixman/pixman-general.c b/pixman/pixman-general.c +index bddf79a..f525744 100644 +--- a/pixman/pixman-general.c ++++ b/pixman/pixman-general.c +@@ -285,9 +285,24 @@ general_blt (pixman_implementation_t *imp, + int width, + int height) + { +- /* We can't blit unless we have sse2 or mmx */ +- +- return FALSE; ++ uint8_t *dst_bytes = (uint8_t *)dst_bits; ++ uint8_t *src_bytes = (uint8_t *)src_bits; ++ int bpp; ++ ++ if (src_bpp != dst_bpp || src_bpp & 7) ++ return FALSE; ++ ++ bpp = src_bpp >> 3; ++ width *= bpp; ++ src_stride *= 4; ++ dst_stride *= 4; ++ pixman_blt_helper (src_bytes + src_y * src_stride + src_x * bpp, ++ dst_bytes + dst_y * dst_stride + dst_x * bpp, ++ src_stride, ++ dst_stride, ++ width, ++ height); ++ return TRUE; + } + + static pixman_bool_t +diff --git a/pixman/pixman-private.h b/pixman/pixman-private.h +index d5767af..eeb677d 100644 +--- a/pixman/pixman-private.h ++++ b/pixman/pixman-private.h +@@ -10,6 +10,7 @@ + + #include "pixman.h" + #include <time.h> ++#include <string.h> + #include <assert.h> + #include <stdio.h> + #include <string.h> +@@ -867,4 +868,46 @@ void pixman_timer_register (pixman_timer_t *timer); + + #endif /* PIXMAN_TIMERS */ + ++/* a helper function, can blit 8-bit images with src/dst overlapping support */ ++static inline void ++pixman_blt_helper (uint8_t *src_bytes, ++ uint8_t *dst_bytes, ++ int src_stride, ++ int dst_stride, ++ int width, ++ int height) ++{ ++ /* ++ * The second part of this check is not strictly needed, but it prevents ++ * unnecessary upside-down processing of areas which belong to different ++ * images. Upside-down processing can be slower with fixed-distance-ahead ++ * prefetch and perceived as having more tearing. ++ */ ++ if (src_bytes < dst_bytes + width && ++ src_bytes + src_stride * height > dst_bytes) ++ { ++ src_bytes += src_stride * height - src_stride; ++ dst_bytes += dst_stride * height - dst_stride; ++ dst_stride = -dst_stride; ++ src_stride = -src_stride; ++ /* Horizontal scrolling to the left needs memmove */ ++ if (src_bytes + width > dst_bytes) ++ { ++ while (--height >= 0) ++ { ++ memmove (dst_bytes, src_bytes, width); ++ dst_bytes += dst_stride; ++ src_bytes += src_stride; ++ } ++ return; ++ } ++ } ++ while (--height >= 0) ++ { ++ memcpy (dst_bytes, src_bytes, width); ++ dst_bytes += dst_stride; ++ src_bytes += src_stride; ++ } ++} ++ + #endif /* PIXMAN_PRIVATE_H */ +-- +1.6.6.1 + diff --git a/recipes/xorg-lib/pixman/0002-Add-CONVERT_8888_TO_8888-and-CONVERT_0565_TO_0565-ma.patch b/recipes/xorg-lib/pixman/0002-Add-CONVERT_8888_TO_8888-and-CONVERT_0565_TO_0565-ma.patch deleted file mode 100644 index 871ce75078..0000000000 --- a/recipes/xorg-lib/pixman/0002-Add-CONVERT_8888_TO_8888-and-CONVERT_0565_TO_0565-ma.patch +++ /dev/null @@ -1,28 +0,0 @@ -From 7c2da7f27c2dd04d9ed3db5fd13f1da26cebfa3a Mon Sep 17 00:00:00 2001 -From: Alexander Larsson <alexl@redhat.com> -Date: Tue, 16 Mar 2010 14:18:29 +0100 -Subject: [PATCH 2/9] Add CONVERT_8888_TO_8888 and CONVERT_0565_TO_0565 macros - -These are useful for macroization ---- - pixman/pixman-private.h | 4 ++++ - 1 files changed, 4 insertions(+), 0 deletions(-) - -diff --git a/pixman/pixman-private.h b/pixman/pixman-private.h -index d0bec39..bc41249 100644 ---- a/pixman/pixman-private.h -+++ b/pixman/pixman-private.h -@@ -706,6 +706,10 @@ pixman_region16_copy_from_region32 (pixman_region16_t *dst, - - #define CONVERT_0565_TO_8888(s) (CONVERT_0565_TO_0888(s) | 0xff000000) - -+/* Trivial versions that are useful in macros */ -+#define CONVERT_8888_TO_8888(s) (s) -+#define CONVERT_0565_TO_0565(s) (s) -+ - #define PIXMAN_FORMAT_IS_WIDE(f) \ - (PIXMAN_FORMAT_A (f) > 8 || \ - PIXMAN_FORMAT_R (f) > 8 || \ --- -1.6.6.1 - diff --git a/recipes/xorg-lib/pixman/0002-Support-of-overlapping-src-dst-for-pixman_blt_mmx.patch b/recipes/xorg-lib/pixman/0002-Support-of-overlapping-src-dst-for-pixman_blt_mmx.patch new file mode 100644 index 0000000000..110edd5fd5 --- /dev/null +++ b/recipes/xorg-lib/pixman/0002-Support-of-overlapping-src-dst-for-pixman_blt_mmx.patch @@ -0,0 +1,91 @@ +From 4be9e0fa02f972174efd1788eb92d8fc07d37a53 Mon Sep 17 00:00:00 2001 +From: Siarhei Siamashka <siarhei.siamashka@nokia.com> +Date: Thu, 22 Oct 2009 05:45:47 +0300 +Subject: [PATCH 2/4] Support of overlapping src/dst for pixman_blt_mmx + +--- + pixman/pixman-mmx.c | 55 +++++++++++++++++++++++++++++--------------------- + 1 files changed, 32 insertions(+), 23 deletions(-) + +diff --git a/pixman/pixman-mmx.c b/pixman/pixman-mmx.c +index e084e7f..6212b31 100644 +--- a/pixman/pixman-mmx.c ++++ b/pixman/pixman-mmx.c +@@ -2994,34 +2994,43 @@ pixman_blt_mmx (uint32_t *src_bits, + { + uint8_t * src_bytes; + uint8_t * dst_bytes; +- int byte_width; ++ int bpp; + +- if (src_bpp != dst_bpp) ++ if (src_bpp != dst_bpp || src_bpp & 7) + return FALSE; + +- if (src_bpp == 16) +- { +- src_stride = src_stride * (int) sizeof (uint32_t) / 2; +- dst_stride = dst_stride * (int) sizeof (uint32_t) / 2; +- src_bytes = (uint8_t *)(((uint16_t *)src_bits) + src_stride * (src_y) + (src_x)); +- dst_bytes = (uint8_t *)(((uint16_t *)dst_bits) + dst_stride * (dst_y) + (dst_x)); +- byte_width = 2 * width; +- src_stride *= 2; +- dst_stride *= 2; +- } +- else if (src_bpp == 32) ++ bpp = src_bpp >> 3; ++ width *= bpp; ++ src_stride *= 4; ++ dst_stride *= 4; ++ src_bytes = (uint8_t *)src_bits + src_y * src_stride + src_x * bpp; ++ dst_bytes = (uint8_t *)dst_bits + dst_y * dst_stride + dst_x * bpp; ++ ++ if (src_bpp != 16 && src_bpp != 32) + { +- src_stride = src_stride * (int) sizeof (uint32_t) / 4; +- dst_stride = dst_stride * (int) sizeof (uint32_t) / 4; +- src_bytes = (uint8_t *)(((uint32_t *)src_bits) + src_stride * (src_y) + (src_x)); +- dst_bytes = (uint8_t *)(((uint32_t *)dst_bits) + dst_stride * (dst_y) + (dst_x)); +- byte_width = 4 * width; +- src_stride *= 4; +- dst_stride *= 4; ++ pixman_blt_helper (src_bytes, dst_bytes, src_stride, dst_stride, ++ width, height); ++ return TRUE; + } +- else ++ ++ if (src_bytes < dst_bytes && src_bytes + src_stride * height > dst_bytes) + { +- return FALSE; ++ src_bytes += src_stride * height - src_stride; ++ dst_bytes += dst_stride * height - dst_stride; ++ dst_stride = -dst_stride; ++ src_stride = -src_stride; ++ ++ if (src_bytes + width > dst_bytes) ++ { ++ /* TODO: reverse scanline copy using MMX */ ++ while (--height >= 0) ++ { ++ memmove (dst_bytes, src_bytes, width); ++ dst_bytes += dst_stride; ++ src_bytes += src_stride; ++ } ++ return TRUE; ++ } + } + + while (height--) +@@ -3031,7 +3040,7 @@ pixman_blt_mmx (uint32_t *src_bits, + uint8_t *d = dst_bytes; + src_bytes += src_stride; + dst_bytes += dst_stride; +- w = byte_width; ++ w = width; + + while (w >= 2 && ((unsigned long)d & 3)) + { +-- +1.6.6.1 + diff --git a/recipes/xorg-lib/pixman/0002-Test-program-for-pixman_blt-function.patch b/recipes/xorg-lib/pixman/0002-Test-program-for-pixman_blt-function.patch deleted file mode 100644 index 143e79dabf..0000000000 --- a/recipes/xorg-lib/pixman/0002-Test-program-for-pixman_blt-function.patch +++ /dev/null @@ -1,178 +0,0 @@ -From 364406e03f9651aacb1bc684de6c00a27f9df66d Mon Sep 17 00:00:00 2001 -From: Siarhei Siamashka <siarhei.siamashka@nokia.com> -Date: Mon, 19 Oct 2009 20:32:55 +0300 -Subject: [PATCH 2/6] Test program for pixman_blt function - -It can do some basic correctness tests and also check whether -overlapping of source and destination images is supported. ---- - test/Makefile.am | 2 + - test/overlapped-blt-test.c | 136 ++++++++++++++++++++++++++++++++++++++++++++ - 2 files changed, 138 insertions(+), 0 deletions(-) - create mode 100644 test/overlapped-blt-test.c - -diff --git a/test/Makefile.am b/test/Makefile.am -index 89d32e9..40c305f 100644 ---- a/test/Makefile.am -+++ b/test/Makefile.am -@@ -9,6 +9,7 @@ TESTPROGRAMS = \ - fetch-test \ - oob-test \ - window-test \ -+ overlapped-blt-test \ - trap-crasher - - fetch_test_LDADD = $(TEST_LDADD) -@@ -17,6 +18,7 @@ composite_LDADD = $(TEST_LDADD) - trap_crasher_LDADD = $(TEST_LDADD) - oob_test_LDADD = $(TEST_LDADD) - window_test_LDADD = $(TEST_LDADD) -+overlapped_blt_test_LDADD = $(TEST_LDADD) - - blitters_test_LDADD = $(TEST_LDADD) - blitters_test_SOURCES = blitters-test.c utils.c utils.h -diff --git a/test/overlapped-blt-test.c b/test/overlapped-blt-test.c -new file mode 100644 -index 0000000..95fbc54 ---- /dev/null -+++ b/test/overlapped-blt-test.c -@@ -0,0 +1,136 @@ -+/* -+ * A small test program which can check whether pixman_blt function -+ * can support overlapping of source and destination images. -+ * Efficient blit with overlapping is useful for scrolling. -+ */ -+ -+#include <stdint.h> -+#include <stdio.h> -+#include <stdlib.h> -+#include <string.h> -+#include "pixman.h" -+ -+/* reference implementation (slow) */ -+static void -+trivial_copy8_2d ( -+ uint8_t *dst, int dst_stride, -+ uint8_t *src, int src_stride, -+ int dx, int dy, int sx, int sy, -+ int w, int h) -+{ -+ int x, y; -+ uint8_t *tmp = malloc (src_stride * (sy + h)); -+ memcpy (tmp, src, src_stride * (sy + h)); -+ for (y = 0; y < h; y++) -+ { -+ for (x = 0; x < w; x++) -+ { -+ *(dst + (dy + y) * dst_stride + dx + x) = -+ *(tmp + (sy + y) * src_stride + sx + x); -+ } -+ } -+ free (tmp); -+} -+ -+static void -+trivial_copy_2d ( -+ uint8_t *dst, int dst_stride, -+ uint8_t *src, int src_stride, -+ int dx, int dy, int sx, int sy, -+ int w, int h, int bpp) -+{ -+ trivial_copy8_2d (dst, dst_stride, src, src_stride, -+ dx * (bpp / 8), dy, sx * (bpp / 8), sy, w * (bpp / 8), h); -+} -+ -+/* now the test itself */ -+ -+#define ST_UNSUPPORTED 1 -+#define ST_NORMAL_BUG 2 -+#define ST_OVERLAPPED_BUG 4 -+ -+#define MAX_SIZE_X 64 -+#define MAX_SIZE_Y 64 -+ -+static void print_result(int bpp, int flags) -+{ -+ printf("bpp=%d, supported=%d, normal_ok=%d, overlapped_ok=%d\n", -+ bpp, -+ !(flags & ST_UNSUPPORTED), -+ !(flags & ST_NORMAL_BUG), -+ !(flags & ST_OVERLAPPED_BUG)); -+} -+ -+int main() -+{ -+ int c = 100000, r; -+ int bpp_st[33] = {0}; -+ srand(0); -+ while (c-- > 0) -+ { -+ uint8_t *src1, *src2, *src3; -+ int i; -+ int sizex = rand() % MAX_SIZE_X + 1; -+ int sizey = rand() % MAX_SIZE_Y + 1; -+ int sx = rand() % sizex; -+ int sy = rand() % sizey; -+ int dx = rand() % sizex; -+ int dy = rand() % sizey; -+ int w = rand() % sizex; -+ int h = rand() % sizex; -+ int bpp = 8 * (1 << (rand() % 3)); -+ int stride_delta = rand() % 8; -+ int bufsize; -+ if ((sizex + stride_delta) % 4) -+ stride_delta += 4 - ((sizex + stride_delta) % 4); -+ bufsize = (sizex + stride_delta) * sizey * bpp / 8; -+ src1 = malloc (bufsize); -+ src2 = malloc (bufsize); -+ src3 = malloc (bufsize); -+ for (i = 0; i < bufsize; i++) -+ src1[i] = rand(); -+ memcpy (src2, src1, bufsize); -+ memcpy (src3, src1, bufsize); -+ if (sx + w > sizex) -+ w = sizex - sx; -+ if (dx + w > sizex) -+ w = sizex - dx; -+ if (sy + h > sizey) -+ h = sizey - sy; -+ if (dy + h > sizey) -+ h = sizey - dy; -+ /* get reference result */ -+ trivial_copy_2d (src1, (sizex + stride_delta) * bpp / 8, -+ src1, (sizex + stride_delta) * bpp / 8, -+ dx, dy, sx, sy, w, h, bpp); -+ /* check nonoverlapped pixman result */ -+ r = pixman_blt ((uint32_t *)src3, (uint32_t *)src2, -+ (sizex + stride_delta) * bpp / 8 / 4, -+ (sizex + stride_delta) * bpp / 8 / 4, -+ bpp, bpp, sx, sy, dx, dy, w, h); -+ if (!r) -+ bpp_st[bpp] |= ST_UNSUPPORTED; -+ if (memcmp (src1, src2, bufsize) != 0) -+ bpp_st[bpp] |= ST_NORMAL_BUG; -+ /* check overlapped pixman result */ -+ r = pixman_blt ((uint32_t *)src3, (uint32_t *)src3, -+ (sizex + stride_delta) * bpp / 8 / 4, -+ (sizex + stride_delta) * bpp / 8 / 4, -+ bpp, bpp, sx, sy, dx, dy, w, h); -+ if (!r) -+ bpp_st[bpp] |= ST_UNSUPPORTED; -+ if (memcmp (src1, src3, bufsize) != 0) -+ bpp_st[bpp] |= ST_OVERLAPPED_BUG; -+ /* free buffers */ -+ free (src1); -+ free (src2); -+ free (src3); -+ } -+ -+ /* report results */ -+ print_result (8, bpp_st[8]); -+ print_result (16, bpp_st[16]); -+ print_result (32, bpp_st[32]); -+ -+ return 0; -+} --- -1.6.2.4 - diff --git a/recipes/xorg-lib/pixman/0003-Add-FAST_PATH_NO_NONE_REPEAT-flag.patch b/recipes/xorg-lib/pixman/0003-Add-FAST_PATH_NO_NONE_REPEAT-flag.patch deleted file mode 100644 index d9a79985a8..0000000000 --- a/recipes/xorg-lib/pixman/0003-Add-FAST_PATH_NO_NONE_REPEAT-flag.patch +++ /dev/null @@ -1,53 +0,0 @@ -From 6e80b9148a7f43b7b40235a57c1066fe64e371e5 Mon Sep 17 00:00:00 2001 -From: Alexander Larsson <alexl@redhat.com> -Date: Fri, 12 Mar 2010 15:40:07 +0100 -Subject: [PATCH 3/9] Add FAST_PATH_NO_NONE_REPEAT flag - ---- - pixman/pixman-image.c | 10 +++++++--- - pixman/pixman-private.h | 1 + - 2 files changed, 8 insertions(+), 3 deletions(-) - -diff --git a/pixman/pixman-image.c b/pixman/pixman-image.c -index d09d193..df5b457 100644 ---- a/pixman/pixman-image.c -+++ b/pixman/pixman-image.c -@@ -335,16 +335,20 @@ compute_image_info (pixman_image_t *image) - /* Repeat mode */ - switch (image->common.repeat) - { -+ case PIXMAN_REPEAT_NONE: -+ flags |= FAST_PATH_NO_REFLECT_REPEAT | FAST_PATH_NO_PAD_REPEAT; -+ break; -+ - case PIXMAN_REPEAT_REFLECT: -- flags |= FAST_PATH_NO_PAD_REPEAT; -+ flags |= FAST_PATH_NO_PAD_REPEAT | FAST_PATH_NO_NONE_REPEAT; - break; - - case PIXMAN_REPEAT_PAD: -- flags |= FAST_PATH_NO_REFLECT_REPEAT; -+ flags |= FAST_PATH_NO_REFLECT_REPEAT | FAST_PATH_NO_NONE_REPEAT; - break; - - default: -- flags |= (FAST_PATH_NO_REFLECT_REPEAT | FAST_PATH_NO_PAD_REPEAT); -+ flags |= FAST_PATH_NO_REFLECT_REPEAT | FAST_PATH_NO_PAD_REPEAT | FAST_PATH_NO_NONE_REPEAT; - break; - } - -diff --git a/pixman/pixman-private.h b/pixman/pixman-private.h -index bc41249..65314b9 100644 ---- a/pixman/pixman-private.h -+++ b/pixman/pixman-private.h -@@ -579,6 +579,7 @@ _pixman_choose_implementation (void); - #define FAST_PATH_SIMPLE_REPEAT (1 << 12) - #define FAST_PATH_IS_OPAQUE (1 << 13) - #define FAST_PATH_NEEDS_WORKAROUND (1 << 14) -+#define FAST_PATH_NO_NONE_REPEAT (1 << 15) - - #define _FAST_PATH_STANDARD_FLAGS \ - (FAST_PATH_ID_TRANSFORM | \ --- -1.6.6.1 - diff --git a/recipes/xorg-lib/pixman/0003-Generic-C-implementation-of-pixman_blt-with-overlapp.patch b/recipes/xorg-lib/pixman/0003-Generic-C-implementation-of-pixman_blt-with-overlapp.patch deleted file mode 100644 index 25ce7ee3b8..0000000000 --- a/recipes/xorg-lib/pixman/0003-Generic-C-implementation-of-pixman_blt-with-overlapp.patch +++ /dev/null @@ -1,114 +0,0 @@ -From c29c9fa826b7112156fd6150b5f1564227935c05 Mon Sep 17 00:00:00 2001 -From: Siarhei Siamashka <siarhei.siamashka@nokia.com> -Date: Thu, 22 Oct 2009 05:27:33 +0300 -Subject: [PATCH 3/6] Generic C implementation of pixman_blt with overlapping support - -Uses memcpy/memmove functions to copy pixels, can handle the -case when both source and destination areas are in the same -image (this is useful for scrolling). - -It is assumed that copying direction is only important when -using the same image for both source and destination (and -src_stride == dst_stride). Copying direction is undefined -for the images with different source and destination stride -which happen to be in the overlapped areas (but this is an -unrealistic case anyway). ---- - pixman/pixman-general.c | 21 ++++++++++++++++++--- - pixman/pixman-private.h | 43 +++++++++++++++++++++++++++++++++++++++++++ - 2 files changed, 61 insertions(+), 3 deletions(-) - -diff --git a/pixman/pixman-general.c b/pixman/pixman-general.c -index c96a3f9..d71a299 100644 ---- a/pixman/pixman-general.c -+++ b/pixman/pixman-general.c -@@ -300,9 +300,24 @@ general_blt (pixman_implementation_t *imp, - int width, - int height) - { -- /* We can't blit unless we have sse2 or mmx */ -- -- return FALSE; -+ uint8_t *dst_bytes = (uint8_t *)dst_bits; -+ uint8_t *src_bytes = (uint8_t *)src_bits; -+ int bpp; -+ -+ if (src_bpp != dst_bpp || src_bpp & 7) -+ return FALSE; -+ -+ bpp = src_bpp >> 3; -+ width *= bpp; -+ src_stride *= 4; -+ dst_stride *= 4; -+ pixman_blt_helper (src_bytes + src_y * src_stride + src_x * bpp, -+ dst_bytes + dst_y * dst_stride + dst_x * bpp, -+ src_stride, -+ dst_stride, -+ width, -+ height); -+ return TRUE; - } - - static pixman_bool_t -diff --git a/pixman/pixman-private.h b/pixman/pixman-private.h -index 5000f91..8c5d4fd 100644 ---- a/pixman/pixman-private.h -+++ b/pixman/pixman-private.h -@@ -10,6 +10,7 @@ - - #include "pixman.h" - #include <time.h> -+#include <string.h> - #include <assert.h> - - #include "pixman-compiler.h" -@@ -794,4 +795,46 @@ void pixman_timer_register (pixman_timer_t *timer); - - #endif /* PIXMAN_TIMERS */ - -+/* a helper function, can blit 8-bit images with src/dst overlapping support */ -+static inline void -+pixman_blt_helper (uint8_t *src_bytes, -+ uint8_t *dst_bytes, -+ int src_stride, -+ int dst_stride, -+ int width, -+ int height) -+{ -+ /* -+ * The second part of this check is not strictly needed, but it prevents -+ * unnecessary upside-down processing of areas which belong to different -+ * images. Upside-down processing can be slower with fixed-distance-ahead -+ * prefetch and perceived as having more tearing. -+ */ -+ if (src_bytes < dst_bytes + width && -+ src_bytes + src_stride * height > dst_bytes) -+ { -+ src_bytes += src_stride * height - src_stride; -+ dst_bytes += dst_stride * height - dst_stride; -+ dst_stride = -dst_stride; -+ src_stride = -src_stride; -+ /* Horizontal scrolling to the left needs memmove */ -+ if (src_bytes + width > dst_bytes) -+ { -+ while (--height >= 0) -+ { -+ memmove (dst_bytes, src_bytes, width); -+ dst_bytes += dst_stride; -+ src_bytes += src_stride; -+ } -+ return; -+ } -+ } -+ while (--height >= 0) -+ { -+ memcpy (dst_bytes, src_bytes, width); -+ dst_bytes += dst_stride; -+ src_bytes += src_stride; -+ } -+} -+ - #endif /* PIXMAN_PRIVATE_H */ --- -1.6.2.4 - diff --git a/recipes/xorg-lib/pixman/0003-Support-of-overlapping-src-dst-for-pixman_blt_sse2.patch b/recipes/xorg-lib/pixman/0003-Support-of-overlapping-src-dst-for-pixman_blt_sse2.patch new file mode 100644 index 0000000000..ae27f38cf0 --- /dev/null +++ b/recipes/xorg-lib/pixman/0003-Support-of-overlapping-src-dst-for-pixman_blt_sse2.patch @@ -0,0 +1,91 @@ +From 1a29e4029250b4adb52061a68e94c84523e785e2 Mon Sep 17 00:00:00 2001 +From: Siarhei Siamashka <siarhei.siamashka@nokia.com> +Date: Thu, 22 Oct 2009 05:45:54 +0300 +Subject: [PATCH 3/4] Support of overlapping src/dst for pixman_blt_sse2 + +--- + pixman/pixman-sse2.c | 55 +++++++++++++++++++++++++++++-------------------- + 1 files changed, 32 insertions(+), 23 deletions(-) + +diff --git a/pixman/pixman-sse2.c b/pixman/pixman-sse2.c +index 946e7ba..66053ae 100644 +--- a/pixman/pixman-sse2.c ++++ b/pixman/pixman-sse2.c +@@ -5299,34 +5299,43 @@ pixman_blt_sse2 (uint32_t *src_bits, + { + uint8_t * src_bytes; + uint8_t * dst_bytes; +- int byte_width; ++ int bpp; + +- if (src_bpp != dst_bpp) ++ if (src_bpp != dst_bpp || src_bpp & 7) + return FALSE; + +- if (src_bpp == 16) +- { +- src_stride = src_stride * (int) sizeof (uint32_t) / 2; +- dst_stride = dst_stride * (int) sizeof (uint32_t) / 2; +- src_bytes =(uint8_t *)(((uint16_t *)src_bits) + src_stride * (src_y) + (src_x)); +- dst_bytes = (uint8_t *)(((uint16_t *)dst_bits) + dst_stride * (dst_y) + (dst_x)); +- byte_width = 2 * width; +- src_stride *= 2; +- dst_stride *= 2; +- } +- else if (src_bpp == 32) ++ bpp = src_bpp >> 3; ++ width *= bpp; ++ src_stride *= 4; ++ dst_stride *= 4; ++ src_bytes = (uint8_t *)src_bits + src_y * src_stride + src_x * bpp; ++ dst_bytes = (uint8_t *)dst_bits + dst_y * dst_stride + dst_x * bpp; ++ ++ if (src_bpp != 16 && src_bpp != 32) + { +- src_stride = src_stride * (int) sizeof (uint32_t) / 4; +- dst_stride = dst_stride * (int) sizeof (uint32_t) / 4; +- src_bytes = (uint8_t *)(((uint32_t *)src_bits) + src_stride * (src_y) + (src_x)); +- dst_bytes = (uint8_t *)(((uint32_t *)dst_bits) + dst_stride * (dst_y) + (dst_x)); +- byte_width = 4 * width; +- src_stride *= 4; +- dst_stride *= 4; ++ pixman_blt_helper (src_bytes, dst_bytes, src_stride, dst_stride, ++ width, height); ++ return TRUE; + } +- else ++ ++ if (src_bytes < dst_bytes && src_bytes + src_stride * height > dst_bytes) + { +- return FALSE; ++ src_bytes += src_stride * height - src_stride; ++ dst_bytes += dst_stride * height - dst_stride; ++ dst_stride = -dst_stride; ++ src_stride = -src_stride; ++ ++ if (src_bytes + width > dst_bytes) ++ { ++ /* TODO: reverse scanline copy using SSE2 */ ++ while (--height >= 0) ++ { ++ memmove (dst_bytes, src_bytes, width); ++ dst_bytes += dst_stride; ++ src_bytes += src_stride; ++ } ++ return TRUE; ++ } + } + + cache_prefetch ((__m128i*)src_bytes); +@@ -5339,7 +5348,7 @@ pixman_blt_sse2 (uint32_t *src_bits, + uint8_t *d = dst_bytes; + src_bytes += src_stride; + dst_bytes += dst_stride; +- w = byte_width; ++ w = width; + + cache_prefetch_next ((__m128i*)s); + cache_prefetch_next ((__m128i*)d); +-- +1.6.6.1 + diff --git a/recipes/xorg-lib/pixman/0004-Add-FAST_PATH_SAMPLES_COVER_CLIP-and-FAST_PATH_16BIT.patch b/recipes/xorg-lib/pixman/0004-Add-FAST_PATH_SAMPLES_COVER_CLIP-and-FAST_PATH_16BIT.patch deleted file mode 100644 index eb388475d9..0000000000 --- a/recipes/xorg-lib/pixman/0004-Add-FAST_PATH_SAMPLES_COVER_CLIP-and-FAST_PATH_16BIT.patch +++ /dev/null @@ -1,167 +0,0 @@ -From 8e7e8e3f96b094616f37fdf8a35043d7c5f64417 Mon Sep 17 00:00:00 2001 -From: Alexander Larsson <alexl@redhat.com> -Date: Fri, 12 Mar 2010 15:41:01 +0100 -Subject: [PATCH 4/9] 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. ---- - pixman/pixman-private.h | 2 + - pixman/pixman.c | 84 +++++++++++++++++++++++++++++++++++++--------- - 2 files changed, 69 insertions(+), 17 deletions(-) - -diff --git a/pixman/pixman-private.h b/pixman/pixman-private.h -index 65314b9..0cf9113 100644 ---- a/pixman/pixman-private.h -+++ b/pixman/pixman-private.h -@@ -580,6 +580,8 @@ _pixman_choose_implementation (void); - #define FAST_PATH_IS_OPAQUE (1 << 13) - #define FAST_PATH_NEEDS_WORKAROUND (1 << 14) - #define FAST_PATH_NO_NONE_REPEAT (1 << 15) -+#define FAST_PATH_SAMPLES_COVER_CLIP (1 << 16) -+#define FAST_PATH_16BIT_SAFE (1 << 17) - - #define _FAST_PATH_STANDARD_FLAGS \ - (FAST_PATH_ID_TRANSFORM | \ -diff --git a/pixman/pixman.c b/pixman/pixman.c -index c71617e..e967e34 100644 ---- a/pixman/pixman.c -+++ b/pixman/pixman.c -@@ -479,24 +479,75 @@ walk_region_internal (pixman_implementation_t *imp, - } - } - --static force_inline pixman_bool_t --image_covers (pixman_image_t *image, -- pixman_box32_t *extents, -- int x, -- int y) -+#define IS_16BIT(x) (((x) >= INT16_MIN) && ((x) <= INT16_MAX)) -+ -+static force_inline uint32_t -+compute_src_extents_flags (pixman_image_t *image, -+ pixman_box32_t *extents, -+ int x, -+ int y) - { -- if (image->common.type == BITS && -- image->common.repeat == PIXMAN_REPEAT_NONE) -+ pixman_box16_t extents16; -+ uint32_t flags; -+ -+ flags = FAST_PATH_COVERS_CLIP; -+ -+ if (image->common.type != BITS) -+ return flags; -+ -+ if (image->common.repeat == PIXMAN_REPEAT_NONE && -+ (x > extents->x1 || y > extents->y1 || -+ x + image->bits.width < extents->x2 || -+ y + image->bits.height < extents->y2)) -+ { -+ flags &= ~FAST_PATH_COVERS_CLIP; -+ } -+ -+ if (IS_16BIT (extents->x1 - x) && -+ IS_16BIT (extents->y1 - y) && -+ IS_16BIT (extents->x2 - x) && -+ IS_16BIT (extents->y2 - y)) - { -- if (x > extents->x1 || y > extents->y1 || -- x + image->bits.width < extents->x2 || -- y + image->bits.height < extents->y2) -+ extents16.x1 = extents->x1 - x; -+ extents16.y1 = extents->y1 - y; -+ extents16.x2 = extents->x2 - x; -+ extents16.y2 = extents->y2 - y; -+ -+ if (!image->common.transform || -+ pixman_transform_bounds (image->common.transform, &extents16)) - { -- return FALSE; -+ if (extents16.x1 >= 0 && extents16.y1 >= 0 && -+ extents16.x2 <= image->bits.width && -+ extents16.y2 <= image->bits.height) -+ { -+ flags |= FAST_PATH_SAMPLES_COVER_CLIP; -+ } - } - } - -- return TRUE; -+ if (IS_16BIT (extents->x1 - x - 1) && -+ IS_16BIT (extents->y1 - y - 1) && -+ IS_16BIT (extents->x2 - x + 1) && -+ IS_16BIT (extents->y2 - y + 1)) -+ { -+ extents16.x1 = extents->x1 - x - 1; -+ extents16.y1 = extents->y1 - y - 1; -+ extents16.x2 = extents->x2 - x + 1; -+ extents16.y2 = extents->y2 - y + 1; -+ -+ if (/* src space expanded by one in dest space fits in 16 bit */ -+ (!image->common.transform || -+ pixman_transform_bounds (image->common.transform, &extents16)) && -+ /* And src image size can be used as 16.16 fixed point */ -+ image->bits.width < 0x7fff && -+ image->bits.height < 0x7fff) -+ { -+ /* Then we're "16bit safe" */ -+ flags |= FAST_PATH_16BIT_SAFE; -+ } -+ } -+ -+ return flags; - } - - static void -@@ -581,11 +632,10 @@ do_composite (pixman_implementation_t *imp, - - extents = pixman_region32_extents (®ion); - -- if (image_covers (src, extents, dest_x - src_x, dest_y - src_y)) -- src_flags |= FAST_PATH_COVERS_CLIP; -- -- if (mask && image_covers (mask, extents, dest_x - mask_x, dest_y - mask_y)) -- mask_flags |= FAST_PATH_COVERS_CLIP; -+ src_flags |= compute_src_extents_flags (src, extents, dest_x - src_x, dest_y - src_y); -+ -+ if (mask) -+ mask_flags |= compute_src_extents_flags (mask, extents, dest_x - mask_x, dest_y - mask_y); - - /* - * Check if we can replace our operator by a simpler one --- -1.6.6.1 - diff --git a/recipes/xorg-lib/pixman/0004-Support-of-overlapping-src-dst-for-pixman_blt_mmx.patch b/recipes/xorg-lib/pixman/0004-Support-of-overlapping-src-dst-for-pixman_blt_mmx.patch deleted file mode 100644 index 74c7b45bc4..0000000000 --- a/recipes/xorg-lib/pixman/0004-Support-of-overlapping-src-dst-for-pixman_blt_mmx.patch +++ /dev/null @@ -1,91 +0,0 @@ -From 7ca32542c957ff308a6ca7e3715e6552a65ae395 Mon Sep 17 00:00:00 2001 -From: Siarhei Siamashka <siarhei.siamashka@nokia.com> -Date: Thu, 22 Oct 2009 05:45:47 +0300 -Subject: [PATCH 4/6] Support of overlapping src/dst for pixman_blt_mmx - ---- - pixman/pixman-mmx.c | 55 +++++++++++++++++++++++++++++--------------------- - 1 files changed, 32 insertions(+), 23 deletions(-) - -diff --git a/pixman/pixman-mmx.c b/pixman/pixman-mmx.c -index 819e3a0..dcccadb 100644 ---- a/pixman/pixman-mmx.c -+++ b/pixman/pixman-mmx.c -@@ -3002,34 +3002,43 @@ pixman_blt_mmx (uint32_t *src_bits, - { - uint8_t * src_bytes; - uint8_t * dst_bytes; -- int byte_width; -+ int bpp; - -- if (src_bpp != dst_bpp) -+ if (src_bpp != dst_bpp || src_bpp & 7) - return FALSE; - -- if (src_bpp == 16) -- { -- src_stride = src_stride * (int) sizeof (uint32_t) / 2; -- dst_stride = dst_stride * (int) sizeof (uint32_t) / 2; -- src_bytes = (uint8_t *)(((uint16_t *)src_bits) + src_stride * (src_y) + (src_x)); -- dst_bytes = (uint8_t *)(((uint16_t *)dst_bits) + dst_stride * (dst_y) + (dst_x)); -- byte_width = 2 * width; -- src_stride *= 2; -- dst_stride *= 2; -- } -- else if (src_bpp == 32) -+ bpp = src_bpp >> 3; -+ width *= bpp; -+ src_stride *= 4; -+ dst_stride *= 4; -+ src_bytes = (uint8_t *)src_bits + src_y * src_stride + src_x * bpp; -+ dst_bytes = (uint8_t *)dst_bits + dst_y * dst_stride + dst_x * bpp; -+ -+ if (src_bpp != 16 && src_bpp != 32) - { -- src_stride = src_stride * (int) sizeof (uint32_t) / 4; -- dst_stride = dst_stride * (int) sizeof (uint32_t) / 4; -- src_bytes = (uint8_t *)(((uint32_t *)src_bits) + src_stride * (src_y) + (src_x)); -- dst_bytes = (uint8_t *)(((uint32_t *)dst_bits) + dst_stride * (dst_y) + (dst_x)); -- byte_width = 4 * width; -- src_stride *= 4; -- dst_stride *= 4; -+ pixman_blt_helper (src_bytes, dst_bytes, src_stride, dst_stride, -+ width, height); -+ return TRUE; - } -- else -+ -+ if (src_bytes < dst_bytes && src_bytes + src_stride * height > dst_bytes) - { -- return FALSE; -+ src_bytes += src_stride * height - src_stride; -+ dst_bytes += dst_stride * height - dst_stride; -+ dst_stride = -dst_stride; -+ src_stride = -src_stride; -+ -+ if (src_bytes + width > dst_bytes) -+ { -+ /* TODO: reverse scanline copy using MMX */ -+ while (--height >= 0) -+ { -+ memmove (dst_bytes, src_bytes, width); -+ dst_bytes += dst_stride; -+ src_bytes += src_stride; -+ } -+ return TRUE; -+ } - } - - while (height--) -@@ -3039,7 +3048,7 @@ pixman_blt_mmx (uint32_t *src_bits, - uint8_t *d = dst_bytes; - src_bytes += src_stride; - dst_bytes += dst_stride; -- w = byte_width; -+ w = width; - - while (w >= 2 && ((unsigned long)d & 3)) - { --- -1.6.2.4 - diff --git a/recipes/xorg-lib/pixman/0004-Support-of-overlapping-src-dst-for-pixman_blt_neon.patch b/recipes/xorg-lib/pixman/0004-Support-of-overlapping-src-dst-for-pixman_blt_neon.patch new file mode 100644 index 0000000000..3dcba178ef --- /dev/null +++ b/recipes/xorg-lib/pixman/0004-Support-of-overlapping-src-dst-for-pixman_blt_neon.patch @@ -0,0 +1,94 @@ +From 6d52bc4c8f4f29643a3353deb9cb06769e2f0186 Mon Sep 17 00:00:00 2001 +From: Siarhei Siamashka <siarhei.siamashka@nokia.com> +Date: Wed, 18 Nov 2009 06:08:48 +0200 +Subject: [PATCH 4/4] Support of overlapping src/dst for pixman_blt_neon + +--- + pixman/pixman-arm-neon.c | 62 +++++++++++++++++++++++++++++++++++++-------- + 1 files changed, 51 insertions(+), 11 deletions(-) + +diff --git a/pixman/pixman-arm-neon.c b/pixman/pixman-arm-neon.c +index 24ceeeb..134493d 100644 +--- a/pixman/pixman-arm-neon.c ++++ b/pixman/pixman-arm-neon.c +@@ -360,26 +360,66 @@ pixman_blt_neon (uint32_t *src_bits, + int width, + int height) + { +- if (src_bpp != dst_bpp) ++ uint8_t * src_bytes; ++ uint8_t * dst_bytes; ++ int bpp; ++ ++ if (src_bpp != dst_bpp || src_bpp & 7) + return FALSE; + ++ bpp = src_bpp >> 3; ++ width *= bpp; ++ src_stride *= 4; ++ dst_stride *= 4; ++ src_bytes = (uint8_t *)src_bits + src_y * src_stride + src_x * bpp; ++ dst_bytes = (uint8_t *)dst_bits + dst_y * dst_stride + dst_x * bpp; ++ ++ if (src_bpp != 16 && src_bpp != 32) ++ { ++ pixman_blt_helper (src_bytes, dst_bytes, src_stride, dst_stride, ++ width, height); ++ return TRUE; ++ } ++ ++ if (src_bytes < dst_bytes && src_bytes + src_stride * height > dst_bytes) ++ { ++ src_bytes += src_stride * height - src_stride; ++ dst_bytes += dst_stride * height - dst_stride; ++ dst_stride = -dst_stride; ++ src_stride = -src_stride; ++ ++ if (src_bytes + width > dst_bytes) ++ { ++ /* TODO: reverse scanline copy using NEON */ ++ while (--height >= 0) ++ { ++ memmove (dst_bytes, src_bytes, width); ++ dst_bytes += dst_stride; ++ src_bytes += src_stride; ++ } ++ return TRUE; ++ } ++ } ++ + switch (src_bpp) + { + case 16: + pixman_composite_src_0565_0565_asm_neon ( +- width, height, +- (uint16_t *)(((char *) dst_bits) + +- dst_y * dst_stride * 4 + dst_x * 2), dst_stride * 2, +- (uint16_t *)(((char *) src_bits) + +- src_y * src_stride * 4 + src_x * 2), src_stride * 2); ++ width >> 1, ++ height, ++ (uint16_t *) dst_bytes, ++ dst_stride >> 1, ++ (uint16_t *) src_bytes, ++ src_stride >> 1); + return TRUE; + case 32: + pixman_composite_src_8888_8888_asm_neon ( +- width, height, +- (uint32_t *)(((char *) dst_bits) + +- dst_y * dst_stride * 4 + dst_x * 4), dst_stride, +- (uint32_t *)(((char *) src_bits) + +- src_y * src_stride * 4 + src_x * 4), src_stride); ++ width >> 2, ++ height, ++ (uint32_t *) dst_bytes, ++ dst_stride >> 2, ++ (uint32_t *) src_bytes, ++ src_stride >> 2); + return TRUE; + default: + return FALSE; +-- +1.6.6.1 + diff --git a/recipes/xorg-lib/pixman/0005-Add-specialized-fast-nearest-scalers.patch b/recipes/xorg-lib/pixman/0005-Add-specialized-fast-nearest-scalers.patch deleted file mode 100644 index 962b4e03e2..0000000000 --- a/recipes/xorg-lib/pixman/0005-Add-specialized-fast-nearest-scalers.patch +++ /dev/null @@ -1,284 +0,0 @@ -From def20085302693c032e81456d975454acd356acd Mon Sep 17 00:00:00 2001 -From: Alexander Larsson <alexl@redhat.com> -Date: Fri, 12 Mar 2010 15:45:04 +0100 -Subject: [PATCH 5/9] 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 ---- - pixman/pixman-fast-path.c | 243 +++++++++++++++++++++++++++++++++++++++++++++ - 1 files changed, 243 insertions(+), 0 deletions(-) - -diff --git a/pixman/pixman-fast-path.c b/pixman/pixman-fast-path.c -index 4d26b0f..6607a47 100644 ---- a/pixman/pixman-fast-path.c -+++ b/pixman/pixman-fast-path.c -@@ -27,6 +27,7 @@ - #include <config.h> - #endif - #include <string.h> -+#include <stdlib.h> - #include "pixman-private.h" - #include "pixman-combine32.h" - -@@ -1373,6 +1374,208 @@ repeat (pixman_repeat_t repeat, int *c, int size) - return TRUE; - } - -+/* A macroified version of specialized nearest scalers for some -+ * common 8888 and 565 formats. It supports SRC and OVER ops. -+ * -+ * There are two repeat versions, one that handles repeat normal, -+ * and one without repeat handling that only works if the src region -+ * used is completely covered by the pre-repeated source samples. -+ * -+ * The loops are unrolled to process two pixels per iteration for better -+ * performance on most CPU architectures (superscalar processors -+ * can issue several operations simultaneously, other processors can hide -+ * instructions latencies by pipelining operations). Unrolling more -+ * does not make much sense because the compiler will start running out -+ * of spare registers soon. -+ */ -+ -+#define GET_8888_ALPHA(s) ((s) >> 24) -+ /* This is not actually used since we don't have an OVER with -+ 565 source, but it is needed to build. */ -+#define GET_0565_ALPHA(s) 0xff -+ -+#define FAST_NEAREST(scale_func_name, SRC_FORMAT, DST_FORMAT, \ -+ src_type_t, dst_type_t, OP, do_repeat) \ -+static void \ -+fast_composite_scaled_nearest_ ## scale_func_name ## _ ## OP (pixman_implementation_t *imp, \ -+ pixman_op_t op, \ -+ pixman_image_t * src_image, \ -+ pixman_image_t * mask_image, \ -+ pixman_image_t * dst_image, \ -+ int32_t src_x, \ -+ int32_t src_y, \ -+ int32_t mask_x, \ -+ int32_t mask_y, \ -+ int32_t dst_x, \ -+ int32_t dst_y, \ -+ int32_t width, \ -+ int32_t height) \ -+{ \ -+ dst_type_t *dst_line; \ -+ src_type_t *src_first_line; \ -+ uint32_t d; \ -+ src_type_t s1, s2; \ -+ uint8_t a1, a2; \ -+ int w; \ -+ int x1, x2, y; \ -+ pixman_fixed_t orig_vx; \ -+ pixman_fixed_t max_vx, max_vy; \ -+ pixman_vector_t v; \ -+ pixman_fixed_t vx, vy; \ -+ pixman_fixed_t unit_x, unit_y; \ -+ \ -+ src_type_t *src; \ -+ dst_type_t *dst; \ -+ int src_stride, dst_stride; \ -+ \ -+ if (PIXMAN_OP_ ## OP != PIXMAN_OP_SRC && PIXMAN_OP_ ## OP != PIXMAN_OP_OVER) \ -+ abort(); \ -+ \ -+ PIXMAN_IMAGE_GET_LINE (dst_image, dst_x, dst_y, dst_type_t, dst_stride, dst_line, 1); \ -+ /* pass in 0 instead of src_x and src_y because src_x and src_y need to be \ -+ * transformed from destination space to source space */ \ -+ PIXMAN_IMAGE_GET_LINE (src_image, 0, 0, src_type_t, src_stride, src_first_line, 1); \ -+ \ -+ /* reference point is the center of the pixel */ \ -+ v.vector[0] = pixman_int_to_fixed (src_x) + pixman_fixed_1 / 2; \ -+ v.vector[1] = pixman_int_to_fixed (src_y) + pixman_fixed_1 / 2; \ -+ v.vector[2] = pixman_fixed_1; \ -+ \ -+ if (!pixman_transform_point_3d (src_image->common.transform, &v)) \ -+ return; \ -+ \ -+ unit_x = src_image->common.transform->matrix[0][0]; \ -+ unit_y = src_image->common.transform->matrix[1][1]; \ -+ \ -+ /* Round down to closest integer, ensuring that 0.5 rounds to 0, not 1 */ \ -+ v.vector[0] -= pixman_fixed_e; \ -+ v.vector[1] -= pixman_fixed_e; \ -+ \ -+ vx = v.vector[0]; \ -+ vy = v.vector[1]; \ -+ \ -+ if (do_repeat) \ -+ { \ -+ /* Clamp repeating positions inside the actual samples */ \ -+ max_vx = src_image->bits.width << 16; \ -+ max_vy = src_image->bits.height << 16; \ -+ \ -+ repeat (PIXMAN_REPEAT_NORMAL, &vx, max_vx); \ -+ repeat (PIXMAN_REPEAT_NORMAL, &vy, max_vy); \ -+ } \ -+ \ -+ orig_vx = vx; \ -+ \ -+ while (--height >= 0) \ -+ { \ -+ dst = dst_line; \ -+ dst_line += dst_stride; \ -+ \ -+ y = vy >> 16; \ -+ vy += unit_y; \ -+ if (do_repeat) \ -+ repeat (PIXMAN_REPEAT_NORMAL, &vy, max_vy); \ -+ \ -+ src = src_first_line + src_stride * y; \ -+ \ -+ w = width; \ -+ vx = orig_vx; \ -+ while ((w -= 2) >= 0) \ -+ { \ -+ x1 = vx >> 16; \ -+ vx += unit_x; \ -+ if (do_repeat) \ -+ repeat (PIXMAN_REPEAT_NORMAL, &vx, max_vx); \ -+ s1 = src[x1]; \ -+ \ -+ x2 = vx >> 16; \ -+ vx += unit_x; \ -+ if (do_repeat) \ -+ repeat (PIXMAN_REPEAT_NORMAL, &vx, max_vx); \ -+ s2 = src[x2]; \ -+ \ -+ if (PIXMAN_OP_ ## OP == PIXMAN_OP_OVER) \ -+ { \ -+ a1 = GET_ ## SRC_FORMAT ## _ALPHA(s1); \ -+ a2 = GET_ ## SRC_FORMAT ## _ALPHA(s2); \ -+ \ -+ if (a1 == 0xff) \ -+ { \ -+ *dst = CONVERT_ ## SRC_FORMAT ## _TO_ ## DST_FORMAT (s1); \ -+ } \ -+ else if (s1) \ -+ { \ -+ d = CONVERT_## DST_FORMAT ## _TO_8888 (*dst); \ -+ a1 ^= 0xff; \ -+ UN8x4_MUL_UN8_ADD_UN8x4 (d, a1, s1); \ -+ *dst = CONVERT_8888_TO_ ## DST_FORMAT (d); \ -+ } \ -+ dst++; \ -+ \ -+ if (a2 == 0xff) \ -+ { \ -+ *dst = CONVERT_ ## SRC_FORMAT ## _TO_ ## DST_FORMAT (s2); \ -+ } \ -+ else if (s2) \ -+ { \ -+ d = CONVERT_## DST_FORMAT ## _TO_8888 (*dst); \ -+ a2 ^= 0xff; \ -+ UN8x4_MUL_UN8_ADD_UN8x4 (d, a2, s2); \ -+ *dst = CONVERT_8888_TO_ ## DST_FORMAT (d); \ -+ } \ -+ dst++; \ -+ } \ -+ else /* PIXMAN_OP_SRC */ \ -+ { \ -+ *dst++ = CONVERT_ ## SRC_FORMAT ## _TO_ ## DST_FORMAT (s1); \ -+ *dst++ = CONVERT_ ## SRC_FORMAT ## _TO_ ## DST_FORMAT (s2); \ -+ } \ -+ } \ -+ \ -+ if (w & 1) \ -+ { \ -+ x1 = vx >> 16; \ -+ vx += unit_x; \ -+ if (do_repeat) \ -+ repeat (PIXMAN_REPEAT_NORMAL, &vx, max_vx); \ -+ s1 = src[x1]; \ -+ \ -+ if (PIXMAN_OP_ ## OP == PIXMAN_OP_OVER) \ -+ { \ -+ a1 = GET_ ## SRC_FORMAT ## _ALPHA(s1); \ -+ \ -+ if (a1 == 0xff) \ -+ { \ -+ *dst = CONVERT_ ## SRC_FORMAT ## _TO_ ## DST_FORMAT (s1); \ -+ } \ -+ else if (s1) \ -+ { \ -+ d = CONVERT_## DST_FORMAT ## _TO_8888 (*dst); \ -+ a1 ^= 0xff; \ -+ UN8x4_MUL_UN8_ADD_UN8x4 (d, a1, s1); \ -+ *dst = CONVERT_8888_TO_ ## DST_FORMAT (d); \ -+ } \ -+ dst++; \ -+ } \ -+ else /* PIXMAN_OP_SRC */ \ -+ { \ -+ *dst++ = CONVERT_ ## SRC_FORMAT ## _TO_ ## DST_FORMAT (s1); \ -+ } \ -+ } \ -+ } \ -+} -+ -+FAST_NEAREST(x888_x888_none, 8888, 8888, uint32_t, uint32_t, SRC, /*repeat: */ 0); -+FAST_NEAREST(x888_x888_normal, 8888, 8888, uint32_t, uint32_t, SRC, /*repeat: */ 1); -+FAST_NEAREST(x888_x888_none, 8888, 8888, uint32_t, uint32_t, OVER, /*repeat: */ 0); -+FAST_NEAREST(x888_x888_normal, 8888, 8888, uint32_t, uint32_t, OVER, /*repeat: */ 1); -+FAST_NEAREST(x888_565_none, 8888, 0565, uint32_t, uint16_t, SRC, /*repeat: */ 0); -+FAST_NEAREST(x888_565_normal, 8888, 0565, uint32_t, uint16_t, SRC, /*repeat: */ 1); -+FAST_NEAREST(565_565_none, 0565, 0565, uint16_t, uint16_t, SRC, /*repeat: */ 0); -+FAST_NEAREST(565_565_normal, 0565, 0565, uint16_t, uint16_t, SRC, /*repeat: */ 1); -+FAST_NEAREST(8888_565_none, 8888, 0565, uint32_t, uint16_t, OVER, /*repeat: */ 0); -+FAST_NEAREST(8888_565_normal, 8888, 0565, uint32_t, uint16_t, OVER, /*repeat: */ 1); -+ - static force_inline uint32_t - fetch_nearest (pixman_repeat_t src_repeat, - pixman_format_code_t format, -@@ -1595,6 +1798,46 @@ static const pixman_fast_path_t c_fast_paths[] = - FAST_PATH_NO_ACCESSORS | \ - FAST_PATH_NO_WIDE_FORMAT) - -+#define HAS_NORMAL_REPEAT_FLAGS \ -+ (FAST_PATH_NO_REFLECT_REPEAT | \ -+ FAST_PATH_NO_PAD_REPEAT | \ -+ FAST_PATH_NO_NONE_REPEAT) -+ -+#define SIMPLE_NEAREST_FAST_PATH(op,s,d,func) \ -+ { PIXMAN_OP_ ## op, \ -+ PIXMAN_ ## s, \ -+ SCALED_NEAREST_FLAGS | HAS_NORMAL_REPEAT_FLAGS | FAST_PATH_16BIT_SAFE, \ -+ PIXMAN_null, 0, \ -+ PIXMAN_ ## d, FAST_PATH_STD_DEST_FLAGS, \ -+ fast_composite_scaled_nearest_ ## func ## _normal ## _ ## op, \ -+ }, \ -+ { PIXMAN_OP_ ## op, \ -+ PIXMAN_ ## s, \ -+ SCALED_NEAREST_FLAGS | FAST_PATH_SAMPLES_COVER_CLIP, \ -+ PIXMAN_null, 0, \ -+ PIXMAN_ ## d, FAST_PATH_STD_DEST_FLAGS, \ -+ fast_composite_scaled_nearest_ ## func ## _none ## _ ## op, \ -+ } -+ SIMPLE_NEAREST_FAST_PATH (SRC, x8r8g8b8, x8r8g8b8, x888_x888), -+ SIMPLE_NEAREST_FAST_PATH (SRC, a8r8g8b8, x8r8g8b8, x888_x888), -+ SIMPLE_NEAREST_FAST_PATH (SRC, x8b8g8r8, x8b8g8r8, x888_x888), -+ SIMPLE_NEAREST_FAST_PATH (SRC, a8b8g8r8, x8b8g8r8, x888_x888), -+ -+ SIMPLE_NEAREST_FAST_PATH (SRC, a8r8g8b8, a8r8g8b8, x888_x888), -+ SIMPLE_NEAREST_FAST_PATH (SRC, a8b8g8r8, a8b8g8r8, x888_x888), -+ -+ SIMPLE_NEAREST_FAST_PATH (SRC, x8r8g8b8, r5g6b5, x888_565), -+ SIMPLE_NEAREST_FAST_PATH (SRC, a8r8g8b8, r5g6b5, x888_565), -+ -+ SIMPLE_NEAREST_FAST_PATH (SRC, r5g6b5, r5g6b5, 565_565), -+ -+ SIMPLE_NEAREST_FAST_PATH (OVER, a8r8g8b8, x8r8g8b8, x888_x888), -+ SIMPLE_NEAREST_FAST_PATH (OVER, a8b8g8r8, x8b8g8r8, x888_x888), -+ SIMPLE_NEAREST_FAST_PATH (OVER, a8r8g8b8, a8r8g8b8, x888_x888), -+ SIMPLE_NEAREST_FAST_PATH (OVER, a8b8g8r8, a8b8g8r8, x888_x888), -+ -+ SIMPLE_NEAREST_FAST_PATH (OVER, a8r8g8b8, r5g6b5, 8888_565), -+ - #define NEAREST_FAST_PATH(op,s,d) \ - { PIXMAN_OP_ ## op, \ - PIXMAN_ ## s, SCALED_NEAREST_FLAGS, \ --- -1.6.6.1 - diff --git a/recipes/xorg-lib/pixman/0005-Support-of-overlapping-src-dst-for-pixman_blt_sse2.patch b/recipes/xorg-lib/pixman/0005-Support-of-overlapping-src-dst-for-pixman_blt_sse2.patch deleted file mode 100644 index 3704fbf1cf..0000000000 --- a/recipes/xorg-lib/pixman/0005-Support-of-overlapping-src-dst-for-pixman_blt_sse2.patch +++ /dev/null @@ -1,91 +0,0 @@ -From edc80b41c6480b7c80ec5f7c835c92b2debb3774 Mon Sep 17 00:00:00 2001 -From: Siarhei Siamashka <siarhei.siamashka@nokia.com> -Date: Thu, 22 Oct 2009 05:45:54 +0300 -Subject: [PATCH 5/6] Support of overlapping src/dst for pixman_blt_sse2 - ---- - pixman/pixman-sse2.c | 55 +++++++++++++++++++++++++++++-------------------- - 1 files changed, 32 insertions(+), 23 deletions(-) - -diff --git a/pixman/pixman-sse2.c b/pixman/pixman-sse2.c -index 78b0ad1..b84636b 100644 ---- a/pixman/pixman-sse2.c -+++ b/pixman/pixman-sse2.c -@@ -5300,34 +5300,43 @@ pixman_blt_sse2 (uint32_t *src_bits, - { - uint8_t * src_bytes; - uint8_t * dst_bytes; -- int byte_width; -+ int bpp; - -- if (src_bpp != dst_bpp) -+ if (src_bpp != dst_bpp || src_bpp & 7) - return FALSE; - -- if (src_bpp == 16) -- { -- src_stride = src_stride * (int) sizeof (uint32_t) / 2; -- dst_stride = dst_stride * (int) sizeof (uint32_t) / 2; -- src_bytes =(uint8_t *)(((uint16_t *)src_bits) + src_stride * (src_y) + (src_x)); -- dst_bytes = (uint8_t *)(((uint16_t *)dst_bits) + dst_stride * (dst_y) + (dst_x)); -- byte_width = 2 * width; -- src_stride *= 2; -- dst_stride *= 2; -- } -- else if (src_bpp == 32) -+ bpp = src_bpp >> 3; -+ width *= bpp; -+ src_stride *= 4; -+ dst_stride *= 4; -+ src_bytes = (uint8_t *)src_bits + src_y * src_stride + src_x * bpp; -+ dst_bytes = (uint8_t *)dst_bits + dst_y * dst_stride + dst_x * bpp; -+ -+ if (src_bpp != 16 && src_bpp != 32) - { -- src_stride = src_stride * (int) sizeof (uint32_t) / 4; -- dst_stride = dst_stride * (int) sizeof (uint32_t) / 4; -- src_bytes = (uint8_t *)(((uint32_t *)src_bits) + src_stride * (src_y) + (src_x)); -- dst_bytes = (uint8_t *)(((uint32_t *)dst_bits) + dst_stride * (dst_y) + (dst_x)); -- byte_width = 4 * width; -- src_stride *= 4; -- dst_stride *= 4; -+ pixman_blt_helper (src_bytes, dst_bytes, src_stride, dst_stride, -+ width, height); -+ return TRUE; - } -- else -+ -+ if (src_bytes < dst_bytes && src_bytes + src_stride * height > dst_bytes) - { -- return FALSE; -+ src_bytes += src_stride * height - src_stride; -+ dst_bytes += dst_stride * height - dst_stride; -+ dst_stride = -dst_stride; -+ src_stride = -src_stride; -+ -+ if (src_bytes + width > dst_bytes) -+ { -+ /* TODO: reverse scanline copy using SSE2 */ -+ while (--height >= 0) -+ { -+ memmove (dst_bytes, src_bytes, width); -+ dst_bytes += dst_stride; -+ src_bytes += src_stride; -+ } -+ return TRUE; -+ } - } - - cache_prefetch ((__m128i*)src_bytes); -@@ -5340,7 +5349,7 @@ pixman_blt_sse2 (uint32_t *src_bits, - uint8_t *d = dst_bytes; - src_bytes += src_stride; - dst_bytes += dst_stride; -- w = byte_width; -+ w = width; - - cache_prefetch_next ((__m128i*)s); - cache_prefetch_next ((__m128i*)d); --- -1.6.2.4 - diff --git a/recipes/xorg-lib/pixman/0006-Generic-C-implementation-of-pixman_blt-with-overlapp.patch b/recipes/xorg-lib/pixman/0006-Generic-C-implementation-of-pixman_blt-with-overlapp.patch deleted file mode 100644 index 8b265c0d74..0000000000 --- a/recipes/xorg-lib/pixman/0006-Generic-C-implementation-of-pixman_blt-with-overlapp.patch +++ /dev/null @@ -1,114 +0,0 @@ -From 8d1125fd6a25a0d1d758fd93384bf1baf07bcdf0 Mon Sep 17 00:00:00 2001 -From: Siarhei Siamashka <siarhei.siamashka@nokia.com> -Date: Tue, 16 Mar 2010 16:55:28 +0100 -Subject: [PATCH 6/9] Generic C implementation of pixman_blt with overlapping support - -Uses memcpy/memmove functions to copy pixels, can handle the -case when both source and destination areas are in the same -image (this is useful for scrolling). - -It is assumed that copying direction is only important when -using the same image for both source and destination (and -src_stride == dst_stride). Copying direction is undefined -for the images with different source and destination stride -which happen to be in the overlapped areas (but this is an -unrealistic case anyway). ---- - pixman/pixman-general.c | 21 ++++++++++++++++++--- - pixman/pixman-private.h | 43 +++++++++++++++++++++++++++++++++++++++++++ - 2 files changed, 61 insertions(+), 3 deletions(-) - -diff --git a/pixman/pixman-general.c b/pixman/pixman-general.c -index bddf79a..f525744 100644 ---- a/pixman/pixman-general.c -+++ b/pixman/pixman-general.c -@@ -285,9 +285,24 @@ general_blt (pixman_implementation_t *imp, - int width, - int height) - { -- /* We can't blit unless we have sse2 or mmx */ -- -- return FALSE; -+ uint8_t *dst_bytes = (uint8_t *)dst_bits; -+ uint8_t *src_bytes = (uint8_t *)src_bits; -+ int bpp; -+ -+ if (src_bpp != dst_bpp || src_bpp & 7) -+ return FALSE; -+ -+ bpp = src_bpp >> 3; -+ width *= bpp; -+ src_stride *= 4; -+ dst_stride *= 4; -+ pixman_blt_helper (src_bytes + src_y * src_stride + src_x * bpp, -+ dst_bytes + dst_y * dst_stride + dst_x * bpp, -+ src_stride, -+ dst_stride, -+ width, -+ height); -+ return TRUE; - } - - static pixman_bool_t -diff --git a/pixman/pixman-private.h b/pixman/pixman-private.h -index 0cf9113..3478e1b 100644 ---- a/pixman/pixman-private.h -+++ b/pixman/pixman-private.h -@@ -10,6 +10,7 @@ - - #include "pixman.h" - #include <time.h> -+#include <string.h> - #include <assert.h> - #include <stdio.h> - #include <string.h> -@@ -866,4 +867,46 @@ void pixman_timer_register (pixman_timer_t *timer); - - #endif /* PIXMAN_TIMERS */ - -+/* a helper function, can blit 8-bit images with src/dst overlapping support */ -+static inline void -+pixman_blt_helper (uint8_t *src_bytes, -+ uint8_t *dst_bytes, -+ int src_stride, -+ int dst_stride, -+ int width, -+ int height) -+{ -+ /* -+ * The second part of this check is not strictly needed, but it prevents -+ * unnecessary upside-down processing of areas which belong to different -+ * images. Upside-down processing can be slower with fixed-distance-ahead -+ * prefetch and perceived as having more tearing. -+ */ -+ if (src_bytes < dst_bytes + width && -+ src_bytes + src_stride * height > dst_bytes) -+ { -+ src_bytes += src_stride * height - src_stride; -+ dst_bytes += dst_stride * height - dst_stride; -+ dst_stride = -dst_stride; -+ src_stride = -src_stride; -+ /* Horizontal scrolling to the left needs memmove */ -+ if (src_bytes + width > dst_bytes) -+ { -+ while (--height >= 0) -+ { -+ memmove (dst_bytes, src_bytes, width); -+ dst_bytes += dst_stride; -+ src_bytes += src_stride; -+ } -+ return; -+ } -+ } -+ while (--height >= 0) -+ { -+ memcpy (dst_bytes, src_bytes, width); -+ dst_bytes += dst_stride; -+ src_bytes += src_stride; -+ } -+} -+ - #endif /* PIXMAN_PRIVATE_H */ --- -1.6.6.1 - diff --git a/recipes/xorg-lib/pixman/0006-Support-of-overlapping-src-dst-for-pixman_blt_neon.patch b/recipes/xorg-lib/pixman/0006-Support-of-overlapping-src-dst-for-pixman_blt_neon.patch deleted file mode 100644 index af75716bb8..0000000000 --- a/recipes/xorg-lib/pixman/0006-Support-of-overlapping-src-dst-for-pixman_blt_neon.patch +++ /dev/null @@ -1,93 +0,0 @@ -From 86870ff530b5e435034bd80207e5758466d96cff Mon Sep 17 00:00:00 2001 -From: Siarhei Siamashka <siarhei.siamashka@nokia.com> -Date: Wed, 18 Nov 2009 06:08:48 +0200 -Subject: [PATCH 6/6] Support of overlapping src/dst for pixman_blt_neon - ---- - pixman/pixman-arm-neon.c | 63 ++++++++++++++++++++++++++++++++++++++------- - 1 files changed, 53 insertions(+), 10 deletions(-) - -diff --git a/pixman/pixman-arm-neon.c b/pixman/pixman-arm-neon.c -index 495fda4..c632ff5 100644 ---- a/pixman/pixman-arm-neon.c -+++ b/pixman/pixman-arm-neon.c -@@ -306,23 +306,66 @@ pixman_blt_neon (uint32_t *src_bits, - int width, - int height) - { -+ uint8_t * src_bytes; -+ uint8_t * dst_bytes; -+ int bpp; -+ -+ if (src_bpp != dst_bpp || src_bpp & 7) -+ return FALSE; -+ -+ bpp = src_bpp >> 3; -+ width *= bpp; -+ src_stride *= 4; -+ dst_stride *= 4; -+ src_bytes = (uint8_t *)src_bits + src_y * src_stride + src_x * bpp; -+ dst_bytes = (uint8_t *)dst_bits + dst_y * dst_stride + dst_x * bpp; -+ -+ if (src_bpp != 16 && src_bpp != 32) -+ { -+ pixman_blt_helper (src_bytes, dst_bytes, src_stride, dst_stride, -+ width, height); -+ return TRUE; -+ } -+ -+ if (src_bytes < dst_bytes && src_bytes + src_stride * height > dst_bytes) -+ { -+ src_bytes += src_stride * height - src_stride; -+ dst_bytes += dst_stride * height - dst_stride; -+ dst_stride = -dst_stride; -+ src_stride = -src_stride; -+ -+ if (src_bytes + width > dst_bytes) -+ { -+ /* TODO: reverse scanline copy using NEON */ -+ while (--height >= 0) -+ { -+ memmove (dst_bytes, src_bytes, width); -+ dst_bytes += dst_stride; -+ src_bytes += src_stride; -+ } -+ return TRUE; -+ } -+ } -+ - switch (src_bpp) - { - case 16: - pixman_composite_src_0565_0565_asm_neon ( -- width, height, -- (uint16_t *)(((char *) dst_bits) + -- dst_y * dst_stride * 4 + dst_x * 2), dst_stride * 2, -- (uint16_t *)(((char *) src_bits) + -- src_y * src_stride * 4 + src_x * 2), src_stride * 2); -+ width >> 1, -+ height, -+ (uint16_t *) dst_bytes, -+ dst_stride >> 1, -+ (uint16_t *) src_bytes, -+ src_stride >> 1); - return TRUE; - case 32: - pixman_composite_src_8888_8888_asm_neon ( -- width, height, -- (uint32_t *)(((char *) dst_bits) + -- dst_y * dst_stride * 4 + dst_x * 4), dst_stride, -- (uint32_t *)(((char *) src_bits) + -- src_y * src_stride * 4 + src_x * 4), src_stride); -+ width >> 2, -+ height, -+ (uint32_t *) dst_bytes, -+ dst_stride >> 2, -+ (uint32_t *) src_bytes, -+ src_stride >> 2); - return TRUE; - default: - return FALSE; --- -1.6.2.4 - diff --git a/recipes/xorg-lib/pixman/0007-Support-of-overlapping-src-dst-for-pixman_blt_mmx.patch b/recipes/xorg-lib/pixman/0007-Support-of-overlapping-src-dst-for-pixman_blt_mmx.patch deleted file mode 100644 index f9a812e376..0000000000 --- a/recipes/xorg-lib/pixman/0007-Support-of-overlapping-src-dst-for-pixman_blt_mmx.patch +++ /dev/null @@ -1,91 +0,0 @@ -From ac9b18e8aefad1992c3057dc3cf7c309f14544d2 Mon Sep 17 00:00:00 2001 -From: Siarhei Siamashka <siarhei.siamashka@nokia.com> -Date: Thu, 22 Oct 2009 05:45:47 +0300 -Subject: [PATCH 7/9] Support of overlapping src/dst for pixman_blt_mmx - ---- - pixman/pixman-mmx.c | 55 +++++++++++++++++++++++++++++--------------------- - 1 files changed, 32 insertions(+), 23 deletions(-) - -diff --git a/pixman/pixman-mmx.c b/pixman/pixman-mmx.c -index e084e7f..6212b31 100644 ---- a/pixman/pixman-mmx.c -+++ b/pixman/pixman-mmx.c -@@ -2994,34 +2994,43 @@ pixman_blt_mmx (uint32_t *src_bits, - { - uint8_t * src_bytes; - uint8_t * dst_bytes; -- int byte_width; -+ int bpp; - -- if (src_bpp != dst_bpp) -+ if (src_bpp != dst_bpp || src_bpp & 7) - return FALSE; - -- if (src_bpp == 16) -- { -- src_stride = src_stride * (int) sizeof (uint32_t) / 2; -- dst_stride = dst_stride * (int) sizeof (uint32_t) / 2; -- src_bytes = (uint8_t *)(((uint16_t *)src_bits) + src_stride * (src_y) + (src_x)); -- dst_bytes = (uint8_t *)(((uint16_t *)dst_bits) + dst_stride * (dst_y) + (dst_x)); -- byte_width = 2 * width; -- src_stride *= 2; -- dst_stride *= 2; -- } -- else if (src_bpp == 32) -+ bpp = src_bpp >> 3; -+ width *= bpp; -+ src_stride *= 4; -+ dst_stride *= 4; -+ src_bytes = (uint8_t *)src_bits + src_y * src_stride + src_x * bpp; -+ dst_bytes = (uint8_t *)dst_bits + dst_y * dst_stride + dst_x * bpp; -+ -+ if (src_bpp != 16 && src_bpp != 32) - { -- src_stride = src_stride * (int) sizeof (uint32_t) / 4; -- dst_stride = dst_stride * (int) sizeof (uint32_t) / 4; -- src_bytes = (uint8_t *)(((uint32_t *)src_bits) + src_stride * (src_y) + (src_x)); -- dst_bytes = (uint8_t *)(((uint32_t *)dst_bits) + dst_stride * (dst_y) + (dst_x)); -- byte_width = 4 * width; -- src_stride *= 4; -- dst_stride *= 4; -+ pixman_blt_helper (src_bytes, dst_bytes, src_stride, dst_stride, -+ width, height); -+ return TRUE; - } -- else -+ -+ if (src_bytes < dst_bytes && src_bytes + src_stride * height > dst_bytes) - { -- return FALSE; -+ src_bytes += src_stride * height - src_stride; -+ dst_bytes += dst_stride * height - dst_stride; -+ dst_stride = -dst_stride; -+ src_stride = -src_stride; -+ -+ if (src_bytes + width > dst_bytes) -+ { -+ /* TODO: reverse scanline copy using MMX */ -+ while (--height >= 0) -+ { -+ memmove (dst_bytes, src_bytes, width); -+ dst_bytes += dst_stride; -+ src_bytes += src_stride; -+ } -+ return TRUE; -+ } - } - - while (height--) -@@ -3031,7 +3040,7 @@ pixman_blt_mmx (uint32_t *src_bits, - uint8_t *d = dst_bytes; - src_bytes += src_stride; - dst_bytes += dst_stride; -- w = byte_width; -+ w = width; - - while (w >= 2 && ((unsigned long)d & 3)) - { --- -1.6.6.1 - diff --git a/recipes/xorg-lib/pixman/0008-Support-of-overlapping-src-dst-for-pixman_blt_sse2.patch b/recipes/xorg-lib/pixman/0008-Support-of-overlapping-src-dst-for-pixman_blt_sse2.patch deleted file mode 100644 index 5b311fe81f..0000000000 --- a/recipes/xorg-lib/pixman/0008-Support-of-overlapping-src-dst-for-pixman_blt_sse2.patch +++ /dev/null @@ -1,91 +0,0 @@ -From f6d6ad1063e29a95bad4c4a2e43f3ecf90344ef7 Mon Sep 17 00:00:00 2001 -From: Siarhei Siamashka <siarhei.siamashka@nokia.com> -Date: Thu, 22 Oct 2009 05:45:54 +0300 -Subject: [PATCH 8/9] Support of overlapping src/dst for pixman_blt_sse2 - ---- - pixman/pixman-sse2.c | 55 +++++++++++++++++++++++++++++-------------------- - 1 files changed, 32 insertions(+), 23 deletions(-) - -diff --git a/pixman/pixman-sse2.c b/pixman/pixman-sse2.c -index 946e7ba..66053ae 100644 ---- a/pixman/pixman-sse2.c -+++ b/pixman/pixman-sse2.c -@@ -5299,34 +5299,43 @@ pixman_blt_sse2 (uint32_t *src_bits, - { - uint8_t * src_bytes; - uint8_t * dst_bytes; -- int byte_width; -+ int bpp; - -- if (src_bpp != dst_bpp) -+ if (src_bpp != dst_bpp || src_bpp & 7) - return FALSE; - -- if (src_bpp == 16) -- { -- src_stride = src_stride * (int) sizeof (uint32_t) / 2; -- dst_stride = dst_stride * (int) sizeof (uint32_t) / 2; -- src_bytes =(uint8_t *)(((uint16_t *)src_bits) + src_stride * (src_y) + (src_x)); -- dst_bytes = (uint8_t *)(((uint16_t *)dst_bits) + dst_stride * (dst_y) + (dst_x)); -- byte_width = 2 * width; -- src_stride *= 2; -- dst_stride *= 2; -- } -- else if (src_bpp == 32) -+ bpp = src_bpp >> 3; -+ width *= bpp; -+ src_stride *= 4; -+ dst_stride *= 4; -+ src_bytes = (uint8_t *)src_bits + src_y * src_stride + src_x * bpp; -+ dst_bytes = (uint8_t *)dst_bits + dst_y * dst_stride + dst_x * bpp; -+ -+ if (src_bpp != 16 && src_bpp != 32) - { -- src_stride = src_stride * (int) sizeof (uint32_t) / 4; -- dst_stride = dst_stride * (int) sizeof (uint32_t) / 4; -- src_bytes = (uint8_t *)(((uint32_t *)src_bits) + src_stride * (src_y) + (src_x)); -- dst_bytes = (uint8_t *)(((uint32_t *)dst_bits) + dst_stride * (dst_y) + (dst_x)); -- byte_width = 4 * width; -- src_stride *= 4; -- dst_stride *= 4; -+ pixman_blt_helper (src_bytes, dst_bytes, src_stride, dst_stride, -+ width, height); -+ return TRUE; - } -- else -+ -+ if (src_bytes < dst_bytes && src_bytes + src_stride * height > dst_bytes) - { -- return FALSE; -+ src_bytes += src_stride * height - src_stride; -+ dst_bytes += dst_stride * height - dst_stride; -+ dst_stride = -dst_stride; -+ src_stride = -src_stride; -+ -+ if (src_bytes + width > dst_bytes) -+ { -+ /* TODO: reverse scanline copy using SSE2 */ -+ while (--height >= 0) -+ { -+ memmove (dst_bytes, src_bytes, width); -+ dst_bytes += dst_stride; -+ src_bytes += src_stride; -+ } -+ return TRUE; -+ } - } - - cache_prefetch ((__m128i*)src_bytes); -@@ -5339,7 +5348,7 @@ pixman_blt_sse2 (uint32_t *src_bits, - uint8_t *d = dst_bytes; - src_bytes += src_stride; - dst_bytes += dst_stride; -- w = byte_width; -+ w = width; - - cache_prefetch_next ((__m128i*)s); - cache_prefetch_next ((__m128i*)d); --- -1.6.6.1 - diff --git a/recipes/xorg-lib/pixman/0009-Support-of-overlapping-src-dst-for-pixman_blt_neon.patch b/recipes/xorg-lib/pixman/0009-Support-of-overlapping-src-dst-for-pixman_blt_neon.patch deleted file mode 100644 index ae7b043194..0000000000 --- a/recipes/xorg-lib/pixman/0009-Support-of-overlapping-src-dst-for-pixman_blt_neon.patch +++ /dev/null @@ -1,94 +0,0 @@ -From 41572ca5aa9e50e4d1000b3da1e6ee43c6f4088a Mon Sep 17 00:00:00 2001 -From: Siarhei Siamashka <siarhei.siamashka@nokia.com> -Date: Wed, 18 Nov 2009 06:08:48 +0200 -Subject: [PATCH 9/9] Support of overlapping src/dst for pixman_blt_neon - ---- - pixman/pixman-arm-neon.c | 62 +++++++++++++++++++++++++++++++++++++-------- - 1 files changed, 51 insertions(+), 11 deletions(-) - -diff --git a/pixman/pixman-arm-neon.c b/pixman/pixman-arm-neon.c -index 24ceeeb..134493d 100644 ---- a/pixman/pixman-arm-neon.c -+++ b/pixman/pixman-arm-neon.c -@@ -360,26 +360,66 @@ pixman_blt_neon (uint32_t *src_bits, - int width, - int height) - { -- if (src_bpp != dst_bpp) -+ uint8_t * src_bytes; -+ uint8_t * dst_bytes; -+ int bpp; -+ -+ if (src_bpp != dst_bpp || src_bpp & 7) - return FALSE; - -+ bpp = src_bpp >> 3; -+ width *= bpp; -+ src_stride *= 4; -+ dst_stride *= 4; -+ src_bytes = (uint8_t *)src_bits + src_y * src_stride + src_x * bpp; -+ dst_bytes = (uint8_t *)dst_bits + dst_y * dst_stride + dst_x * bpp; -+ -+ if (src_bpp != 16 && src_bpp != 32) -+ { -+ pixman_blt_helper (src_bytes, dst_bytes, src_stride, dst_stride, -+ width, height); -+ return TRUE; -+ } -+ -+ if (src_bytes < dst_bytes && src_bytes + src_stride * height > dst_bytes) -+ { -+ src_bytes += src_stride * height - src_stride; -+ dst_bytes += dst_stride * height - dst_stride; -+ dst_stride = -dst_stride; -+ src_stride = -src_stride; -+ -+ if (src_bytes + width > dst_bytes) -+ { -+ /* TODO: reverse scanline copy using NEON */ -+ while (--height >= 0) -+ { -+ memmove (dst_bytes, src_bytes, width); -+ dst_bytes += dst_stride; -+ src_bytes += src_stride; -+ } -+ return TRUE; -+ } -+ } -+ - switch (src_bpp) - { - case 16: - pixman_composite_src_0565_0565_asm_neon ( -- width, height, -- (uint16_t *)(((char *) dst_bits) + -- dst_y * dst_stride * 4 + dst_x * 2), dst_stride * 2, -- (uint16_t *)(((char *) src_bits) + -- src_y * src_stride * 4 + src_x * 2), src_stride * 2); -+ width >> 1, -+ height, -+ (uint16_t *) dst_bytes, -+ dst_stride >> 1, -+ (uint16_t *) src_bytes, -+ src_stride >> 1); - return TRUE; - case 32: - pixman_composite_src_8888_8888_asm_neon ( -- width, height, -- (uint32_t *)(((char *) dst_bits) + -- dst_y * dst_stride * 4 + dst_x * 4), dst_stride, -- (uint32_t *)(((char *) src_bits) + -- src_y * src_stride * 4 + src_x * 4), src_stride); -+ width >> 2, -+ height, -+ (uint32_t *) dst_bytes, -+ dst_stride >> 2, -+ (uint32_t *) src_bytes, -+ src_stride >> 2); - return TRUE; - default: - return FALSE; --- -1.6.6.1 - diff --git a/recipes/xorg-lib/pixman/0041-Fix-filler-bug.patch b/recipes/xorg-lib/pixman/0041-Fix-filler-bug.patch deleted file mode 100644 index 02bd13a0db..0000000000 --- a/recipes/xorg-lib/pixman/0041-Fix-filler-bug.patch +++ /dev/null @@ -1,25 +0,0 @@ -From 82ea3295e435b49478cf7943100b22286baf47dc Mon Sep 17 00:00:00 2001 -From: Jonathan Morton <jmorton@sd070.hel.movial.fi> -Date: Thu, 4 Jun 2009 10:43:41 +0300 -Subject: [PATCH] Fix filler bug. - ---- - pixman/pixman-arm-neon.c | 2 +- - 1 files changed, 1 insertions(+), 1 deletions(-) - -diff --git a/pixman/pixman-arm-neon.c b/pixman/pixman-arm-neon.c -index 18e9a16..67f0b63 100644 ---- a/pixman/pixman-arm-neon.c -+++ b/pixman/pixman-arm-neon.c -@@ -1377,7 +1377,7 @@ pixman_fill_neon (uint32_t *bits, - "beq 2f\n" - "strh %[color], [r4]!\n" - "2:\n" -- "tst r5, #1\n" -+ "tst %[width], #1\n" - "beq 2f\n" - "strb %[color], [r4]!\n" - "2:\n" --- -1.5.6.3 - diff --git a/recipes/xorg-lib/pixman/0042-Really-fix-filler-bug.patch b/recipes/xorg-lib/pixman/0042-Really-fix-filler-bug.patch deleted file mode 100644 index e23b9cd133..0000000000 --- a/recipes/xorg-lib/pixman/0042-Really-fix-filler-bug.patch +++ /dev/null @@ -1,35 +0,0 @@ -From 5cdd43ac753780ef2cfd6adde822af5dcba6091f Mon Sep 17 00:00:00 2001 -From: Jonathan Morton <jmorton@sd070.hel.movial.fi> -Date: Thu, 4 Jun 2009 15:11:40 +0300 -Subject: [PATCH] Really fix filler bug. - ---- - pixman/pixman-arm-neon.c | 6 +++--- - 1 files changed, 3 insertions(+), 3 deletions(-) - -diff --git a/pixman/pixman-arm-neon.c b/pixman/pixman-arm-neon.c -index cfb69f4..0c05f64 100644 ---- a/pixman/pixman-arm-neon.c -+++ b/pixman/pixman-arm-neon.c -@@ -1369,15 +1369,15 @@ pixman_fill_neon (uint32_t *bits, - "2:\n" - "tst %[width], #4\n" - "beq 2f\n" -- "str %[color], [r4]!\n" -+ "str %[color], [r4], #4\n" - "2:\n" - "tst %[width], #2\n" - "beq 2f\n" -- "strh %[color], [r4]!\n" -+ "strh %[color], [r4], #2\n" - "2:\n" - "tst %[width], #1\n" - "beq 2f\n" -- "strb %[color], [r4]!\n" -+ "strb %[color], [r4], #1\n" - "2:\n" - - "subs %[height], %[height], #1\n" --- -1.5.6.3 - diff --git a/recipes/xorg-lib/pixman_git.bb b/recipes/xorg-lib/pixman_git.bb index aae86e92fe..6b2e8e567d 100644 --- a/recipes/xorg-lib/pixman_git.bb +++ b/recipes/xorg-lib/pixman_git.bb @@ -3,26 +3,21 @@ PRIORITY = "optional" DESCRIPTION = "Low-level pixel manipulation library." LICENSE = "X11" -PV = "0.17.10" -PR = "r1" +PV = "0.17.11" +PR = "r2" PR_append = "+gitr${SRCREV}" BBCLASSEXTEND="native" -SRCREV = "313353f1fb9d40d0c3aaf7cfb99ca978b29003a4" +SRCREV = "265ea1fb4d05a920323f23a02f9dc379312bbdae" DEFAULT_PREFERENCE = "-1" SRC_URI = "git://anongit.freedesktop.org/pixman;protocol=git;branch=master \ - file://0001-Add-CONVERT_0565_TO_8888-macro.patch;patch=1 \ - file://0002-Add-CONVERT_8888_TO_8888-and-CONVERT_0565_TO_0565-ma.patch;patch=1 \ - file://0003-Add-FAST_PATH_NO_NONE_REPEAT-flag.patch;patch=1 \ - file://0004-Add-FAST_PATH_SAMPLES_COVER_CLIP-and-FAST_PATH_16BIT.patch;patch=1 \ - file://0005-Add-specialized-fast-nearest-scalers.patch;patch=1 \ - file://0006-Generic-C-implementation-of-pixman_blt-with-overlapp.patch;patch=1 \ - file://0007-Support-of-overlapping-src-dst-for-pixman_blt_mmx.patch;patch=1 \ - file://0008-Support-of-overlapping-src-dst-for-pixman_blt_sse2.patch;patch=1 \ - file://0009-Support-of-overlapping-src-dst-for-pixman_blt_neon.patch;patch=1 \ + file://0001-Generic-C-implementation-of-pixman_blt-with-overlapp.patch;patch=1 \ + file://0002-Support-of-overlapping-src-dst-for-pixman_blt_mmx.patch;patch=1 \ + file://0003-Support-of-overlapping-src-dst-for-pixman_blt_sse2.patch;patch=1 \ + file://0004-Support-of-overlapping-src-dst-for-pixman_blt_neon.patch;patch=1 \ file://over-n-8-0565.patch;patch=1 \ file://src-8888-0565.patch;patch=1 \ " -- cgit v1.2.3 From 2f48ef98570605e84b83d57665cb966bba1a52f2 Mon Sep 17 00:00:00 2001 From: Martin Jansa <Martin.Jansa@gmail.com> Date: Thu, 18 Mar 2010 11:47:46 +0100 Subject: xinit, xinput, libxt: add newer versions Signed-off-by: Martin Jansa <Martin.Jansa@gmail.com> --- recipes/xorg-lib/libxt-native_1.0.8.bb | 8 ++++++++ recipes/xorg-lib/libxt_1.0.8.bb | 20 ++++++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 recipes/xorg-lib/libxt-native_1.0.8.bb create mode 100644 recipes/xorg-lib/libxt_1.0.8.bb (limited to 'recipes/xorg-lib') diff --git a/recipes/xorg-lib/libxt-native_1.0.8.bb b/recipes/xorg-lib/libxt-native_1.0.8.bb new file mode 100644 index 0000000000..9745f6530d --- /dev/null +++ b/recipes/xorg-lib/libxt-native_1.0.8.bb @@ -0,0 +1,8 @@ +require libxt_${PV}.bb + +DEPENDS = "libx11-native libsm-native kbproto-native" +PROVIDES = "xt-native" + +inherit native + +XORG_PN = "libXt" diff --git a/recipes/xorg-lib/libxt_1.0.8.bb b/recipes/xorg-lib/libxt_1.0.8.bb new file mode 100644 index 0000000000..7a5447ce26 --- /dev/null +++ b/recipes/xorg-lib/libxt_1.0.8.bb @@ -0,0 +1,20 @@ +require xorg-lib-common.inc + +DESCRIPTION = "X11 toolkit intrinsics library" +DEPENDS += "libsm virtual/libx11 kbproto" +PROVIDES = "xt" +PE = "1" + +XORG_PN = "libXt" + +EXTRA_OECONF += "--disable-install-makestrs --disable-xkb" + +do_compile() { + ( + unset CC LD CXX CCLD + oe_runmake -C util 'XT_CFLAGS=' 'CC=${BUILD_CC}' 'LD=${BUILD_LD}' 'CXX=${BUILD_CXX}' 'CCLD=${BUILD_CCLD}' 'CFLAGS=-D_GNU_SOURCE -I${STAGING_INCDIR_NATIVE} ${BUILD_CFLAGS}' 'LDFLAGS=${BUILD_LDFLAGS}' 'CXXFLAGS=${BUILD_CXXFLAGS}' 'CPPFLAGS=${BUILD_CPPFLAGS}' makestrs + ) || exit 1 + oe_runmake +} +SRC_URI[archive.md5sum] = "fb7d2aa5b24cd5fe9b238a26d88030e7" +SRC_URI[archive.sha256sum] = "70f52c81258661811c8eae86a7a6dc910d0bf84cd48aeeed85ba430ad6b2037c" -- cgit v1.2.3 From b34c4a2a273c29b788f1bcdcd54b43529755aa3c Mon Sep 17 00:00:00 2001 From: Koen Kooi <koen@openembedded.org> Date: Fri, 19 Mar 2010 10:22:31 +0100 Subject: pixman git: update to 0.17.13, update NEON patches --- ...mplementation-of-pixman_blt-with-overlapp.patch | 4 +- ...of-overlapping-src-dst-for-pixman_blt_mmx.patch | 4 +- ...f-overlapping-src-dst-for-pixman_blt_sse2.patch | 4 +- ...f-overlapping-src-dst-for-pixman_blt_neon.patch | 4 +- ...EON-optimizations-for-fetch-store-r5g6b5-.patch | 169 +++++++++++++++++++++ recipes/xorg-lib/pixman_git.bb | 7 +- 6 files changed, 181 insertions(+), 11 deletions(-) create mode 100644 recipes/xorg-lib/pixman/0005-ARM-added-NEON-optimizations-for-fetch-store-r5g6b5-.patch (limited to 'recipes/xorg-lib') diff --git a/recipes/xorg-lib/pixman/0001-Generic-C-implementation-of-pixman_blt-with-overlapp.patch b/recipes/xorg-lib/pixman/0001-Generic-C-implementation-of-pixman_blt-with-overlapp.patch index 210cb89c62..a2cda2438e 100644 --- a/recipes/xorg-lib/pixman/0001-Generic-C-implementation-of-pixman_blt-with-overlapp.patch +++ b/recipes/xorg-lib/pixman/0001-Generic-C-implementation-of-pixman_blt-with-overlapp.patch @@ -1,7 +1,7 @@ -From bf8fb2bf56478c11935dbb33e725f7a25746d347 Mon Sep 17 00:00:00 2001 +From 8ea1a333de202018a862a7b04b94479d3109274b Mon Sep 17 00:00:00 2001 From: Siarhei Siamashka <siarhei.siamashka@nokia.com> Date: Tue, 16 Mar 2010 16:55:28 +0100 -Subject: [PATCH 1/4] Generic C implementation of pixman_blt with overlapping support +Subject: [PATCH 1/5] Generic C implementation of pixman_blt with overlapping support Uses memcpy/memmove functions to copy pixels, can handle the case when both source and destination areas are in the same diff --git a/recipes/xorg-lib/pixman/0002-Support-of-overlapping-src-dst-for-pixman_blt_mmx.patch b/recipes/xorg-lib/pixman/0002-Support-of-overlapping-src-dst-for-pixman_blt_mmx.patch index 110edd5fd5..003337f48d 100644 --- a/recipes/xorg-lib/pixman/0002-Support-of-overlapping-src-dst-for-pixman_blt_mmx.patch +++ b/recipes/xorg-lib/pixman/0002-Support-of-overlapping-src-dst-for-pixman_blt_mmx.patch @@ -1,7 +1,7 @@ -From 4be9e0fa02f972174efd1788eb92d8fc07d37a53 Mon Sep 17 00:00:00 2001 +From 3170d9f5e927681a2516bcec52b317d1d4785e25 Mon Sep 17 00:00:00 2001 From: Siarhei Siamashka <siarhei.siamashka@nokia.com> Date: Thu, 22 Oct 2009 05:45:47 +0300 -Subject: [PATCH 2/4] Support of overlapping src/dst for pixman_blt_mmx +Subject: [PATCH 2/5] Support of overlapping src/dst for pixman_blt_mmx --- pixman/pixman-mmx.c | 55 +++++++++++++++++++++++++++++--------------------- diff --git a/recipes/xorg-lib/pixman/0003-Support-of-overlapping-src-dst-for-pixman_blt_sse2.patch b/recipes/xorg-lib/pixman/0003-Support-of-overlapping-src-dst-for-pixman_blt_sse2.patch index ae27f38cf0..7e8f34f6bd 100644 --- a/recipes/xorg-lib/pixman/0003-Support-of-overlapping-src-dst-for-pixman_blt_sse2.patch +++ b/recipes/xorg-lib/pixman/0003-Support-of-overlapping-src-dst-for-pixman_blt_sse2.patch @@ -1,7 +1,7 @@ -From 1a29e4029250b4adb52061a68e94c84523e785e2 Mon Sep 17 00:00:00 2001 +From f07cd58c643b490dcb1ef7be2642926cfeca1e69 Mon Sep 17 00:00:00 2001 From: Siarhei Siamashka <siarhei.siamashka@nokia.com> Date: Thu, 22 Oct 2009 05:45:54 +0300 -Subject: [PATCH 3/4] Support of overlapping src/dst for pixman_blt_sse2 +Subject: [PATCH 3/5] Support of overlapping src/dst for pixman_blt_sse2 --- pixman/pixman-sse2.c | 55 +++++++++++++++++++++++++++++-------------------- diff --git a/recipes/xorg-lib/pixman/0004-Support-of-overlapping-src-dst-for-pixman_blt_neon.patch b/recipes/xorg-lib/pixman/0004-Support-of-overlapping-src-dst-for-pixman_blt_neon.patch index 3dcba178ef..0ba5b843b5 100644 --- a/recipes/xorg-lib/pixman/0004-Support-of-overlapping-src-dst-for-pixman_blt_neon.patch +++ b/recipes/xorg-lib/pixman/0004-Support-of-overlapping-src-dst-for-pixman_blt_neon.patch @@ -1,7 +1,7 @@ -From 6d52bc4c8f4f29643a3353deb9cb06769e2f0186 Mon Sep 17 00:00:00 2001 +From e0542866c466ad512d69292df098d4b880e35e52 Mon Sep 17 00:00:00 2001 From: Siarhei Siamashka <siarhei.siamashka@nokia.com> Date: Wed, 18 Nov 2009 06:08:48 +0200 -Subject: [PATCH 4/4] Support of overlapping src/dst for pixman_blt_neon +Subject: [PATCH 4/5] Support of overlapping src/dst for pixman_blt_neon --- pixman/pixman-arm-neon.c | 62 +++++++++++++++++++++++++++++++++++++-------- diff --git a/recipes/xorg-lib/pixman/0005-ARM-added-NEON-optimizations-for-fetch-store-r5g6b5-.patch b/recipes/xorg-lib/pixman/0005-ARM-added-NEON-optimizations-for-fetch-store-r5g6b5-.patch new file mode 100644 index 0000000000..769ed2e7d0 --- /dev/null +++ b/recipes/xorg-lib/pixman/0005-ARM-added-NEON-optimizations-for-fetch-store-r5g6b5-.patch @@ -0,0 +1,169 @@ +From d51b10a2750d99543a0c92ca44802aa7a4d70e54 Mon Sep 17 00:00:00 2001 +From: Siarhei Siamashka <siarhei.siamashka@nokia.com> +Date: Thu, 10 Dec 2009 00:51:50 +0200 +Subject: [PATCH 5/5] ARM: added NEON optimizations for fetch/store r5g6b5 scanline + +--- + pixman/pixman-access.c | 23 ++++++++++++++++++++++- + pixman/pixman-arm-neon-asm.S | 20 ++++++++++++++++++++ + pixman/pixman-arm-neon.c | 41 +++++++++++++++++++++++++++++++++++++++++ + pixman/pixman-private.h | 5 +++++ + 4 files changed, 88 insertions(+), 1 deletions(-) + +diff --git a/pixman/pixman-access.c b/pixman/pixman-access.c +index fa0a267..5bb3e09 100644 +--- a/pixman/pixman-access.c ++++ b/pixman/pixman-access.c +@@ -2748,7 +2748,7 @@ typedef struct + store_scanline_ ## format, store_scanline_generic_64 \ + } + +-static const format_info_t accessors[] = ++static format_info_t accessors[] = + { + /* 32 bpp formats */ + FORMAT_INFO (a8r8g8b8), +@@ -2891,6 +2891,27 @@ _pixman_bits_image_setup_raw_accessors (bits_image_t *image) + setup_accessors (image); + } + ++void ++_pixman_bits_override_accessors (pixman_format_code_t format, ++ fetch_scanline_t fetch_func, ++ store_scanline_t store_func) ++{ ++ format_info_t *info = accessors; ++ ++ while (info->format != PIXMAN_null) ++ { ++ if (info->format == format) ++ { ++ if (fetch_func) ++ info->fetch_scanline_raw_32 = fetch_func; ++ if (store_func) ++ info->store_scanline_raw_32 = store_func; ++ return; ++ } ++ info++; ++ } ++} ++ + #else + + void +diff --git a/pixman/pixman-arm-neon-asm.S b/pixman/pixman-arm-neon-asm.S +index eb8cc4c..6ab3301 100644 +--- a/pixman/pixman-arm-neon-asm.S ++++ b/pixman/pixman-arm-neon-asm.S +@@ -454,6 +454,16 @@ generate_composite_function \ + pixman_composite_src_8888_0565_process_pixblock_tail, \ + pixman_composite_src_8888_0565_process_pixblock_tail_head + ++generate_composite_function_single_scanline \ ++ pixman_store_scanline_r5g6b5_asm_neon, 32, 0, 16, \ ++ FLAG_DST_WRITEONLY | FLAG_DEINTERLEAVE_32BPP, \ ++ 8, /* number of pixels, processed in a single block */ \ ++ default_init, \ ++ default_cleanup, \ ++ pixman_composite_src_8888_0565_process_pixblock_head, \ ++ pixman_composite_src_8888_0565_process_pixblock_tail, \ ++ pixman_composite_src_8888_0565_process_pixblock_tail_head ++ + /******************************************************************************/ + + .macro pixman_composite_src_0565_8888_process_pixblock_head +@@ -489,6 +499,16 @@ generate_composite_function \ + pixman_composite_src_0565_8888_process_pixblock_tail, \ + pixman_composite_src_0565_8888_process_pixblock_tail_head + ++generate_composite_function_single_scanline \ ++ pixman_fetch_scanline_r5g6b5_asm_neon, 16, 0, 32, \ ++ FLAG_DST_WRITEONLY | FLAG_DEINTERLEAVE_32BPP, \ ++ 8, /* number of pixels, processed in a single block */ \ ++ default_init, \ ++ default_cleanup, \ ++ pixman_composite_src_0565_8888_process_pixblock_head, \ ++ pixman_composite_src_0565_8888_process_pixblock_tail, \ ++ pixman_composite_src_0565_8888_process_pixblock_tail_head ++ + /******************************************************************************/ + + .macro pixman_composite_add_8000_8000_process_pixblock_head +diff --git a/pixman/pixman-arm-neon.c b/pixman/pixman-arm-neon.c +index 134493d..2245b52 100644 +--- a/pixman/pixman-arm-neon.c ++++ b/pixman/pixman-arm-neon.c +@@ -567,6 +567,43 @@ neon_combine_##name##_u (pixman_implementation_t *imp, \ + BIND_COMBINE_U (over) + BIND_COMBINE_U (add) + ++void ++pixman_fetch_scanline_r5g6b5_asm_neon (int width, ++ uint32_t *buffer, ++ const uint16_t *pixel); ++void ++pixman_store_scanline_r5g6b5_asm_neon (int width, ++ uint16_t *pixel, ++ const uint32_t *values); ++ ++static void ++neon_fetch_scanline_r5g6b5 (pixman_image_t *image, ++ int x, ++ int y, ++ int width, ++ uint32_t * buffer, ++ const uint32_t *mask, ++ uint32_t mask_bits) ++{ ++ const uint32_t *bits = image->bits.bits + y * image->bits.rowstride; ++ const uint16_t *pixel = (const uint16_t *)bits + x; ++ ++ pixman_fetch_scanline_r5g6b5_asm_neon (width, buffer, pixel); ++} ++ ++static void ++neon_store_scanline_r5g6b5 (bits_image_t * image, ++ int x, ++ int y, ++ int width, ++ const uint32_t *values) ++{ ++ uint32_t *bits = image->bits + image->rowstride * y; ++ uint16_t *pixel = ((uint16_t *) bits) + x; ++ ++ pixman_store_scanline_r5g6b5_asm_neon (width, pixel, values); ++} ++ + pixman_implementation_t * + _pixman_implementation_create_arm_neon (void) + { +@@ -577,6 +614,10 @@ _pixman_implementation_create_arm_neon (void) + imp->combine_32[PIXMAN_OP_OVER] = neon_combine_over_u; + imp->combine_32[PIXMAN_OP_ADD] = neon_combine_add_u; + ++ _pixman_bits_override_accessors (PIXMAN_r5g6b5, ++ neon_fetch_scanline_r5g6b5, ++ neon_store_scanline_r5g6b5); ++ + imp->blt = arm_neon_blt; + imp->fill = arm_neon_fill; + +diff --git a/pixman/pixman-private.h b/pixman/pixman-private.h +index eeb677d..ba2d401 100644 +--- a/pixman/pixman-private.h ++++ b/pixman/pixman-private.h +@@ -220,6 +220,11 @@ void + _pixman_bits_image_setup_raw_accessors (bits_image_t *image); + + void ++_pixman_bits_override_accessors (pixman_format_code_t format, ++ fetch_scanline_t fetch_func, ++ store_scanline_t store_func); ++ ++void + _pixman_image_get_scanline_generic_64 (pixman_image_t *image, + int x, + int y, +-- +1.6.6.1 + diff --git a/recipes/xorg-lib/pixman_git.bb b/recipes/xorg-lib/pixman_git.bb index 6b2e8e567d..52224ef4fe 100644 --- a/recipes/xorg-lib/pixman_git.bb +++ b/recipes/xorg-lib/pixman_git.bb @@ -3,13 +3,13 @@ PRIORITY = "optional" DESCRIPTION = "Low-level pixel manipulation library." LICENSE = "X11" -PV = "0.17.11" -PR = "r2" +PV = "0.17.13" +PR = "r0" PR_append = "+gitr${SRCREV}" BBCLASSEXTEND="native" -SRCREV = "265ea1fb4d05a920323f23a02f9dc379312bbdae" +SRCREV = "69f1ec9a7827aeb522fcae99846237ef0f896e7b" DEFAULT_PREFERENCE = "-1" @@ -18,6 +18,7 @@ SRC_URI = "git://anongit.freedesktop.org/pixman;protocol=git;branch=master \ file://0002-Support-of-overlapping-src-dst-for-pixman_blt_mmx.patch;patch=1 \ file://0003-Support-of-overlapping-src-dst-for-pixman_blt_sse2.patch;patch=1 \ file://0004-Support-of-overlapping-src-dst-for-pixman_blt_neon.patch;patch=1 \ + file://0005-ARM-added-NEON-optimizations-for-fetch-store-r5g6b5-.patch;patch=1 \ file://over-n-8-0565.patch;patch=1 \ file://src-8888-0565.patch;patch=1 \ " -- cgit v1.2.3 From 96b8c73a385eaf72685d99295e892367956c9118 Mon Sep 17 00:00:00 2001 From: Koen Kooi <koen@openembedded.org> Date: Fri, 19 Mar 2010 10:45:34 +0100 Subject: pixman git: revert a commit that breaks thumb, reported by Martin Jansa --- ...SIMD-Try-without-any-CFLAGS-before-forcin.patch | 53 ++++++++++++++++++++++ recipes/xorg-lib/pixman_git.bb | 3 +- 2 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 recipes/xorg-lib/pixman/0006-Revert-ARM-SIMD-Try-without-any-CFLAGS-before-forcin.patch (limited to 'recipes/xorg-lib') diff --git a/recipes/xorg-lib/pixman/0006-Revert-ARM-SIMD-Try-without-any-CFLAGS-before-forcin.patch b/recipes/xorg-lib/pixman/0006-Revert-ARM-SIMD-Try-without-any-CFLAGS-before-forcin.patch new file mode 100644 index 0000000000..3d8d4e8292 --- /dev/null +++ b/recipes/xorg-lib/pixman/0006-Revert-ARM-SIMD-Try-without-any-CFLAGS-before-forcin.patch @@ -0,0 +1,53 @@ +From 7f0adaef68c5b0bb1c5eb9f5db5792b71b8b8beb Mon Sep 17 00:00:00 2001 +From: Koen Kooi <koen@dominion.thruhere.net> +Date: Fri, 19 Mar 2010 10:44:09 +0100 +Subject: [PATCH 6/6] Revert "ARM: SIMD: Try without any CFLAGS before forcing -mcpu=" + +This forces -marm that results in runtime SIGILL on thumb userspace + +This reverts commit 18f0de452dc7e12e4cb544d761a626d5c6031663. +--- + configure.ac | 20 +++++--------------- + 1 files changed, 5 insertions(+), 15 deletions(-) + +diff --git a/configure.ac b/configure.ac +index fc3ee24..f84a4dc 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -363,28 +363,18 @@ AM_CONDITIONAL(USE_VMX, test $have_vmx_intrinsics = yes) + + dnl =========================================================================== + dnl Check for ARM SIMD instructions +-ARM_SIMD_CFLAGS="" ++ARM_SIMD_CFLAGS="-mcpu=arm1136j-s" + + have_arm_simd=no + AC_MSG_CHECKING(whether to use ARM SIMD assembler) +-# check with default CFLAGS in case the toolchain turns on a sufficiently recent -mcpu= ++xserver_save_CFLAGS=$CFLAGS ++CFLAGS="$ARM_SIMD_CFLAGS $CFLAGS" + AC_COMPILE_IFELSE([ + int main () { + asm("uqadd8 r1, r1, r2"); + return 0; +-}], have_arm_simd=yes, +- # check again with an explicit -mcpu= in case the toolchain defaults to an +- # older one; note that uqadd8 isn't available in Thumb mode on arm1136j-s +- # so we force ARM mode +- ARM_SIMD_CFLAGS="-mcpu=arm1136j-s -marm" +- xserver_save_CFLAGS=$CFLAGS +- CFLAGS="$ARM_SIMD_CFLAGS $CFLAGS" +- AC_COMPILE_IFELSE([ +- int main () { +- asm("uqadd8 r1, r1, r2"); +- return 0; +- }], have_arm_simd=yes) +- CFLAGS=$xserver_save_CFLAGS) ++}], have_arm_simd=yes) ++CFLAGS=$xserver_save_CFLAGS + + AC_ARG_ENABLE(arm-simd, + [AC_HELP_STRING([--disable-arm-simd], +-- +1.6.6.1 + diff --git a/recipes/xorg-lib/pixman_git.bb b/recipes/xorg-lib/pixman_git.bb index 52224ef4fe..543cf50f9f 100644 --- a/recipes/xorg-lib/pixman_git.bb +++ b/recipes/xorg-lib/pixman_git.bb @@ -4,7 +4,7 @@ DESCRIPTION = "Low-level pixel manipulation library." LICENSE = "X11" PV = "0.17.13" -PR = "r0" +PR = "r1" PR_append = "+gitr${SRCREV}" BBCLASSEXTEND="native" @@ -19,6 +19,7 @@ SRC_URI = "git://anongit.freedesktop.org/pixman;protocol=git;branch=master \ file://0003-Support-of-overlapping-src-dst-for-pixman_blt_sse2.patch;patch=1 \ file://0004-Support-of-overlapping-src-dst-for-pixman_blt_neon.patch;patch=1 \ file://0005-ARM-added-NEON-optimizations-for-fetch-store-r5g6b5-.patch;patch=1 \ + file://0006-Revert-ARM-SIMD-Try-without-any-CFLAGS-before-forcin.patch;patch=1 \ file://over-n-8-0565.patch;patch=1 \ file://src-8888-0565.patch;patch=1 \ " -- cgit v1.2.3 From b2df355282fd8ccafa4df1b7bd416d5caab8fd5e Mon Sep 17 00:00:00 2001 From: Martin Jansa <Martin.Jansa@gmail.com> Date: Thu, 18 Mar 2010 11:19:34 +0100 Subject: pixman: add pixman.inc, unify recipes, remove do_stage from few old versions, add 0.17.12 with positive D_P Signed-off-by: Martin Jansa <Martin.Jansa@gmail.com> --- recipes/xorg-lib/pixman.inc | 13 +++++++++++++ recipes/xorg-lib/pixman_0.10.0.bb | 15 ++------------- recipes/xorg-lib/pixman_0.11.4.bb | 15 ++------------- recipes/xorg-lib/pixman_0.11.8.bb | 18 +++--------------- recipes/xorg-lib/pixman_0.12.0.bb | 16 +++------------- recipes/xorg-lib/pixman_0.13.2.bb | 22 +++++----------------- recipes/xorg-lib/pixman_0.15.18.bb | 13 ++----------- recipes/xorg-lib/pixman_0.15.6.bb | 13 ++----------- recipes/xorg-lib/pixman_0.16.2.bb | 17 ++--------------- recipes/xorg-lib/pixman_0.17.12.bb | 25 +++++++++++++++++++++++++ recipes/xorg-lib/pixman_0.17.8.bb | 17 ++++------------- recipes/xorg-lib/pixman_0.9.6.bb | 15 ++------------- recipes/xorg-lib/pixman_git.bb | 15 ++------------- 13 files changed, 67 insertions(+), 147 deletions(-) create mode 100644 recipes/xorg-lib/pixman.inc create mode 100644 recipes/xorg-lib/pixman_0.17.12.bb (limited to 'recipes/xorg-lib') diff --git a/recipes/xorg-lib/pixman.inc b/recipes/xorg-lib/pixman.inc new file mode 100644 index 0000000000..1828eef4ce --- /dev/null +++ b/recipes/xorg-lib/pixman.inc @@ -0,0 +1,13 @@ +SECTION = "libs" +PRIORITY = "optional" +DESCRIPTION = "Low-level pixel manipulation library." +LICENSE = "X11" + +BBCLASSEXTEND="native" + +SRC_URI = "http://cairographics.org/releases/${BPN}-${PV}.tar.gz;name=archive " + +INC_PR = "r5" + +inherit autotools_stage pkgconfig +AUTOTOOLS_STAGE_PKGCONFIG = "1" diff --git a/recipes/xorg-lib/pixman_0.10.0.bb b/recipes/xorg-lib/pixman_0.10.0.bb index 35f62990b5..b1ac2eb5bd 100644 --- a/recipes/xorg-lib/pixman_0.10.0.bb +++ b/recipes/xorg-lib/pixman_0.10.0.bb @@ -1,13 +1,2 @@ -SECTION = "libs" -PRIORITY = "optional" -DESCRIPTION = "Low-level pixel manipulation library." -LICENSE = "X11" - -SRC_URI = "http://cairographics.org/releases/pixman-${PV}.tar.gz" - -inherit autotools pkgconfig - -do_stage () { - autotools_stage_all -} - +require pixman.inc +PR = "${INC_PR}.0" diff --git a/recipes/xorg-lib/pixman_0.11.4.bb b/recipes/xorg-lib/pixman_0.11.4.bb index d9da96718f..873a57df6e 100644 --- a/recipes/xorg-lib/pixman_0.11.4.bb +++ b/recipes/xorg-lib/pixman_0.11.4.bb @@ -1,15 +1,4 @@ -SECTION = "libs" -PRIORITY = "optional" -DESCRIPTION = "Low-level pixel manipulation library." -LICENSE = "X11" +require pixman.inc +PR = "${INC_PR}.0" DEFAULT_PREFERENCE = "-1" - -SRC_URI = "http://cairographics.org/releases/pixman-${PV}.tar.gz" - -inherit autotools pkgconfig - -do_stage () { - autotools_stage_all -} - diff --git a/recipes/xorg-lib/pixman_0.11.8.bb b/recipes/xorg-lib/pixman_0.11.8.bb index 239684e71f..b3413dea10 100644 --- a/recipes/xorg-lib/pixman_0.11.8.bb +++ b/recipes/xorg-lib/pixman_0.11.8.bb @@ -1,19 +1,7 @@ -SECTION = "libs" -PRIORITY = "optional" -DESCRIPTION = "Low-level pixel manipulation library." -LICENSE = "X11" +require pixman.inc +PR = "${INC_PR}.0" -PR = "r4" - -SRC_URI = "http://cairographics.org/releases/pixman-${PV}.tar.gz \ +SRC_URI += " \ file://pixman-arm.patch;patch=1 \ file://pixman-x888-565.patch;patch=1 \ " - -inherit autotools - -AUTOTOOLS_STAGE_PKGCONFIG = "1" -do_stage () { - autotools_stage_all -} - diff --git a/recipes/xorg-lib/pixman_0.12.0.bb b/recipes/xorg-lib/pixman_0.12.0.bb index 5d43adba30..b3413dea10 100644 --- a/recipes/xorg-lib/pixman_0.12.0.bb +++ b/recipes/xorg-lib/pixman_0.12.0.bb @@ -1,17 +1,7 @@ -SECTION = "libs" -PRIORITY = "optional" -DESCRIPTION = "Low-level pixel manipulation library." -LICENSE = "X11" +require pixman.inc +PR = "${INC_PR}.0" -SRC_URI = "http://cairographics.org/releases/pixman-${PV}.tar.gz \ +SRC_URI += " \ file://pixman-arm.patch;patch=1 \ file://pixman-x888-565.patch;patch=1 \ " - -inherit autotools - -AUTOTOOLS_STAGE_PKGCONFIG = "1" -do_stage () { - autotools_stage_all -} - diff --git a/recipes/xorg-lib/pixman_0.13.2.bb b/recipes/xorg-lib/pixman_0.13.2.bb index 4b489f89a6..87ffda4748 100644 --- a/recipes/xorg-lib/pixman_0.13.2.bb +++ b/recipes/xorg-lib/pixman_0.13.2.bb @@ -1,23 +1,11 @@ -SECTION = "libs" -PRIORITY = "optional" -DESCRIPTION = "Low-level pixel manipulation library." -LICENSE = "X11" - -PR = "r2" +require pixman.inc +PR = "${INC_PR}.0" DEFAULT_PREFERENCE = "-1" -SRC_URI = "http://cairographics.org/releases/pixman-${PV}.tar.gz \ - file://pixman-0.13.2-neon1.patch;patch=1 \ - " - -inherit autotools +SRC_URI += " \ + file://pixman-0.13.2-neon1.patch;patch=1 \ + " # We have NEON EXTRA_OECONF_append_armv7a = " --disable-arm-simd" - -AUTOTOOLS_STAGE_PKGCONFIG = "1" -do_stage () { - autotools_stage_all -} - diff --git a/recipes/xorg-lib/pixman_0.15.18.bb b/recipes/xorg-lib/pixman_0.15.18.bb index 2517f8f354..873a57df6e 100644 --- a/recipes/xorg-lib/pixman_0.15.18.bb +++ b/recipes/xorg-lib/pixman_0.15.18.bb @@ -1,13 +1,4 @@ -SECTION = "libs" -PRIORITY = "optional" -DESCRIPTION = "Low-level pixel manipulation library." -LICENSE = "X11" +require pixman.inc +PR = "${INC_PR}.0" DEFAULT_PREFERENCE = "-1" - -SRC_URI = "http://cairographics.org/releases/pixman-${PV}.tar.gz \ - " - -inherit autotools_stage -AUTOTOOLS_STAGE_PKGCONFIG = "1" - diff --git a/recipes/xorg-lib/pixman_0.15.6.bb b/recipes/xorg-lib/pixman_0.15.6.bb index 2517f8f354..873a57df6e 100644 --- a/recipes/xorg-lib/pixman_0.15.6.bb +++ b/recipes/xorg-lib/pixman_0.15.6.bb @@ -1,13 +1,4 @@ -SECTION = "libs" -PRIORITY = "optional" -DESCRIPTION = "Low-level pixel manipulation library." -LICENSE = "X11" +require pixman.inc +PR = "${INC_PR}.0" DEFAULT_PREFERENCE = "-1" - -SRC_URI = "http://cairographics.org/releases/pixman-${PV}.tar.gz \ - " - -inherit autotools_stage -AUTOTOOLS_STAGE_PKGCONFIG = "1" - diff --git a/recipes/xorg-lib/pixman_0.16.2.bb b/recipes/xorg-lib/pixman_0.16.2.bb index 1a15ac4a96..b1ac2eb5bd 100644 --- a/recipes/xorg-lib/pixman_0.16.2.bb +++ b/recipes/xorg-lib/pixman_0.16.2.bb @@ -1,15 +1,2 @@ -SECTION = "libs" -PRIORITY = "optional" -DESCRIPTION = "Low-level pixel manipulation library." -LICENSE = "X11" - -PR = "r1" - -BBCLASSEXTEND="native" - -SRC_URI = "http://cairographics.org/releases/pixman-${PV}.tar.gz \ - " - -inherit autotools_stage -AUTOTOOLS_STAGE_PKGCONFIG = "1" - +require pixman.inc +PR = "${INC_PR}.0" diff --git a/recipes/xorg-lib/pixman_0.17.12.bb b/recipes/xorg-lib/pixman_0.17.12.bb new file mode 100644 index 0000000000..dbaf36a561 --- /dev/null +++ b/recipes/xorg-lib/pixman_0.17.12.bb @@ -0,0 +1,25 @@ +require pixman.inc +PR = "${INC_PR}.0" + +DEFAULT_PREFERENCE = "-1" +DEFAULT_PREFERENCE_angstrom = "2" +DEFAULT_PREFERENCE_shr = "2" + +SRC_URI += "\ + file://0001-Generic-C-implementation-of-pixman_blt-with-overlapp.patch;patch=1 \ + file://0002-Support-of-overlapping-src-dst-for-pixman_blt_mmx.patch;patch=1 \ + file://0003-Support-of-overlapping-src-dst-for-pixman_blt_sse2.patch;patch=1 \ + file://0004-Support-of-overlapping-src-dst-for-pixman_blt_neon.patch;patch=1 \ + file://0005-ARM-added-NEON-optimizations-for-fetch-store-r5g6b5-.patch;patch=1 \ + file://0006-Revert-ARM-SIMD-Try-without-any-CFLAGS-before-forcin.patch;patch=1 \ + file://over-n-8-0565.patch;patch=1 \ + file://src-8888-0565.patch;patch=1 \ +" + +SRC_URI[archive.md5sum] = "331415d7a110145cf27aa00e11d0a683" +SRC_URI[archive.sha256sum] = "8cce103af1b4200a13bedca5b763f74c9bc99a55985ab44ca92ba532dac6b57f" + +NEON = " --disable-arm-neon " +NEON_armv7a = " " + +EXTRA_OECONF = "${NEON} --disable-gtk" diff --git a/recipes/xorg-lib/pixman_0.17.8.bb b/recipes/xorg-lib/pixman_0.17.8.bb index adc0c4e301..eb3fe85a20 100644 --- a/recipes/xorg-lib/pixman_0.17.8.bb +++ b/recipes/xorg-lib/pixman_0.17.8.bb @@ -1,17 +1,11 @@ -SECTION = "libs" -PRIORITY = "optional" -DESCRIPTION = "Low-level pixel manipulation library." -LICENSE = "X11" - -PR = "r1" +require pixman.inc +PR = "${INC_PR}.0" DEFAULT_PREFERENCE = "-1" DEFAULT_PREFERENCE_angstrom = "2" DEFAULT_PREFERENCE_shr = "2" -BBCLASSEXTEND="native" - -SRC_URI = "http://cairographics.org/releases/pixman-${PV}.tar.gz;name=archive \ +SRC_URI += " \ file://0003-Generic-C-implementation-of-pixman_blt-with-overlapp.patch;patch=1 \ file://0004-Support-of-overlapping-src-dst-for-pixman_blt_mmx.patch;patch=1 \ file://0005-Support-of-overlapping-src-dst-for-pixman_blt_sse2.patch;patch=1 \ @@ -24,10 +18,7 @@ SRC_URI = "http://cairographics.org/releases/pixman-${PV}.tar.gz;name=archive \ SRC_URI[archive.md5sum] = "a7deb2ff6b286b676d67aa6ae91317ae" SRC_URI[archive.sha256sum] = "ea24e9003455a0881bd43bf7e4169f2b34c90c8521405103e3490553876a81b4" -inherit autotools - NEON = " --disable-arm-neon " -NEON_armv7a = "" +NEON_armv7a = " " EXTRA_OECONF = "${NEON} --disable-gtk" - diff --git a/recipes/xorg-lib/pixman_0.9.6.bb b/recipes/xorg-lib/pixman_0.9.6.bb index 1269ff46a7..76ec2955f4 100644 --- a/recipes/xorg-lib/pixman_0.9.6.bb +++ b/recipes/xorg-lib/pixman_0.9.6.bb @@ -1,14 +1,3 @@ -SECTION = "libs" -PRIORITY = "optional" -DESCRIPTION = "Low-level pixel manipulation library." -LICENSE = "X11" - -SRC_URI = "http://cairographics.org/releases/pixman-${PV}.tar.gz" +require pixman.inc +PR = "${INC_PR}.0" S = "${WORKDIR}/pixman-${PV}" - -inherit autotools pkgconfig - -do_stage () { - autotools_stage_all -} - diff --git a/recipes/xorg-lib/pixman_git.bb b/recipes/xorg-lib/pixman_git.bb index 543cf50f9f..70886edc31 100644 --- a/recipes/xorg-lib/pixman_git.bb +++ b/recipes/xorg-lib/pixman_git.bb @@ -1,14 +1,8 @@ -SECTION = "libs" -PRIORITY = "optional" -DESCRIPTION = "Low-level pixel manipulation library." -LICENSE = "X11" - +require pixman.inc PV = "0.17.13" -PR = "r1" +PR = "${INC_PR}.0" PR_append = "+gitr${SRCREV}" -BBCLASSEXTEND="native" - SRCREV = "69f1ec9a7827aeb522fcae99846237ef0f896e7b" DEFAULT_PREFERENCE = "-1" @@ -26,12 +20,7 @@ SRC_URI = "git://anongit.freedesktop.org/pixman;protocol=git;branch=master \ S = "${WORKDIR}/git" -inherit autotools_stage - NEON = " --disable-arm-neon " NEON_armv7a = " " EXTRA_OECONF = "${NEON} --disable-gtk" - -AUTOTOOLS_STAGE_PKGCONFIG = "1" - -- cgit v1.2.3 From 68710643f05c1127a2a30523d1f8de9c98e2bf3d Mon Sep 17 00:00:00 2001 From: Martin Jansa <Martin.Jansa@gmail.com> Date: Fri, 19 Mar 2010 18:01:06 +0100 Subject: pixman_0.16.2: disable gtk (as done in 0.17.*, to break circular dependency gtk+->cairo->pixman->gtk+ and also libtool issue Signed-off-by: Martin Jansa <Martin.Jansa@gmail.com> --- recipes/xorg-lib/pixman_0.16.2.bb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'recipes/xorg-lib') diff --git a/recipes/xorg-lib/pixman_0.16.2.bb b/recipes/xorg-lib/pixman_0.16.2.bb index b1ac2eb5bd..86a224a341 100644 --- a/recipes/xorg-lib/pixman_0.16.2.bb +++ b/recipes/xorg-lib/pixman_0.16.2.bb @@ -1,2 +1,4 @@ require pixman.inc -PR = "${INC_PR}.0" +PR = "${INC_PR}.1" + +EXTRA_OECONF = "--disable-gtk" -- cgit v1.2.3