summaryrefslogtreecommitdiff
path: root/recipes/xorg-lib
diff options
context:
space:
mode:
authorSergey Lapin <slapin@ossfans.org>2010-03-22 18:13:56 +0300
committerSergey Lapin <slapin@ossfans.org>2010-03-22 18:13:56 +0300
commit3937c88166a493900a694ea8fe53b860f4099d83 (patch)
tree57597245b6efd4cf27c1f4c9ff21c0515e530c15 /recipes/xorg-lib
parentdf2ace6d59e22b42e50bcf4e8a9c92b580602c2e (diff)
parent3510d2ed15a4b477aa7af802a839e11a87b981ed (diff)
Merge branch 'org.openembedded.dev' of git@git.openembedded.net:openembedded into org.openembedded.dev
Diffstat (limited to 'recipes/xorg-lib')
-rw-r--r--recipes/xorg-lib/libx11_1.3.3.bb5
-rw-r--r--recipes/xorg-lib/libxt-native_1.0.8.bb8
-rw-r--r--recipes/xorg-lib/libxt_1.0.8.bb20
-rw-r--r--recipes/xorg-lib/pixman-0.17.8/0003-Generic-C-implementation-of-pixman_blt-with-overlapp.patch (renamed from recipes/xorg-lib/pixman/0003-Generic-C-implementation-of-pixman_blt-with-overlapp.patch)0
-rw-r--r--recipes/xorg-lib/pixman-0.17.8/0004-Support-of-overlapping-src-dst-for-pixman_blt_mmx.patch (renamed from recipes/xorg-lib/pixman/0004-Support-of-overlapping-src-dst-for-pixman_blt_mmx.patch)0
-rw-r--r--recipes/xorg-lib/pixman-0.17.8/0005-Support-of-overlapping-src-dst-for-pixman_blt_sse2.patch (renamed from recipes/xorg-lib/pixman/0005-Support-of-overlapping-src-dst-for-pixman_blt_sse2.patch)0
-rw-r--r--recipes/xorg-lib/pixman-0.17.8/0006-Support-of-overlapping-src-dst-for-pixman_blt_neon.patch (renamed from recipes/xorg-lib/pixman/0006-Support-of-overlapping-src-dst-for-pixman_blt_neon.patch)7
-rw-r--r--recipes/xorg-lib/pixman-0.17.8/1-composite.patch161
-rw-r--r--recipes/xorg-lib/pixman-0.17.8/2-composite.patch102
-rw-r--r--recipes/xorg-lib/pixman-0.17.8/3-composite.patch108
-rw-r--r--recipes/xorg-lib/pixman.inc13
-rw-r--r--recipes/xorg-lib/pixman/0001-ARM-NEON-optimized-pixman_blt.patch104
-rw-r--r--recipes/xorg-lib/pixman/0001-Generic-C-implementation-of-pixman_blt-with-overlapp.patch114
-rw-r--r--recipes/xorg-lib/pixman/0002-Support-of-overlapping-src-dst-for-pixman_blt_mmx.patch91
-rw-r--r--recipes/xorg-lib/pixman/0002-Test-program-for-pixman_blt-function.patch178
-rw-r--r--recipes/xorg-lib/pixman/0003-Support-of-overlapping-src-dst-for-pixman_blt_sse2.patch91
-rw-r--r--recipes/xorg-lib/pixman/0004-Support-of-overlapping-src-dst-for-pixman_blt_neon.patch94
-rw-r--r--recipes/xorg-lib/pixman/0005-ARM-added-NEON-optimizations-for-fetch-store-r5g6b5-.patch169
-rw-r--r--recipes/xorg-lib/pixman/0006-Revert-ARM-SIMD-Try-without-any-CFLAGS-before-forcin.patch53
-rw-r--r--recipes/xorg-lib/pixman/0041-Fix-filler-bug.patch25
-rw-r--r--recipes/xorg-lib/pixman/0042-Really-fix-filler-bug.patch35
-rw-r--r--recipes/xorg-lib/pixman/over-n-8-0565.patch231
-rw-r--r--recipes/xorg-lib/pixman/src-8888-0565.patch324
-rw-r--r--recipes/xorg-lib/pixman_0.10.0.bb15
-rw-r--r--recipes/xorg-lib/pixman_0.11.4.bb15
-rw-r--r--recipes/xorg-lib/pixman_0.11.8.bb18
-rw-r--r--recipes/xorg-lib/pixman_0.12.0.bb16
-rw-r--r--recipes/xorg-lib/pixman_0.13.2.bb22
-rw-r--r--recipes/xorg-lib/pixman_0.15.18.bb13
-rw-r--r--recipes/xorg-lib/pixman_0.15.6.bb13
-rw-r--r--recipes/xorg-lib/pixman_0.16.2.bb17
-rw-r--r--recipes/xorg-lib/pixman_0.17.12.bb25
-rw-r--r--recipes/xorg-lib/pixman_0.17.8.bb24
-rw-r--r--recipes/xorg-lib/pixman_0.9.6.bb15
-rw-r--r--recipes/xorg-lib/pixman_git.bb44
-rw-r--r--recipes/xorg-lib/xorg-lib-common.inc2
36 files changed, 1676 insertions, 496 deletions
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() {
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"
diff --git a/recipes/xorg-lib/pixman/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
index 25ce7ee3b8..25ce7ee3b8 100644
--- a/recipes/xorg-lib/pixman/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
diff --git a/recipes/xorg-lib/pixman/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
index 74c7b45bc4..74c7b45bc4 100644
--- a/recipes/xorg-lib/pixman/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
diff --git a/recipes/xorg-lib/pixman/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
index 3704fbf1cf..3704fbf1cf 100644
--- a/recipes/xorg-lib/pixman/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
diff --git a/recipes/xorg-lib/pixman/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
index af75716bb8..7c22483a2e 100644
--- a/recipes/xorg-lib/pixman/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
@@ -11,17 +11,18 @@ 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,
+@@ -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;
-+
+ return FALSE;
+
+ bpp = src_bpp >> 3;
+ width *= bpp;
+ src_stride *= 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..31bfa39cc4
--- /dev/null
+++ b/recipes/xorg-lib/pixman-0.17.8/1-composite.patch
@@ -0,0 +1,161 @@
+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
+
+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..e90d662 100644
+--- a/pixman/pixman-arm-neon-asm.S
++++ b/pixman/pixman-arm-neon-asm.S
+@@ -1026,6 +1026,111 @@ 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, 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, d25
++ vmull.u8 q12, d11, d24
++ vmull.u8 q13, d11, d26
++ 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
++ vraddhn.u16 d24, q12, q11
++ vraddhn.u16 d25, q9, q8
++ vraddhn.u16 d26, q13, q6
++ vraddhn.u16 d3, q7, q10
++ /*
++ * '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, d3
++ 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..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)
+
+ 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,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),
+--
+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..84d4d9c961
--- /dev/null
+++ b/recipes/xorg-lib/pixman-0.17.8/2-composite.patch
@@ -0,0 +1,102 @@
+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
+
+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 e90d662..f2643de 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 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, \
+
+
+ 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,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),
+@@ -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),
++ 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..06e40fe869
--- /dev/null
+++ b/recipes/xorg-lib/pixman-0.17.8/3-composite.patch
@@ -0,0 +1,108 @@
+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
+
+This fast path function improves performance of 'poppler' cairo-perf trace.
+
+Benchmark from ARM Cortex-A8 @720MHz
+
+before:
+
+[ # ] backend test min(s) median(s) stddev. count
+[ 0] image poppler 38.986 39.158 0.23% 6/6
+
+after:
+
+[ # ] backend test min(s) median(s) stddev. count
+[ 0] image poppler 24.981 25.136 0.28% 6/6
+---
+diff --git a/pixman/pixman-arm-neon-asm.S b/pixman/pixman-arm-neon-asm.S
+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 \
+
+ /******************************************************************************/
+
++.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 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)
+
+ 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)
+@@ -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 },
+ };
+--
+cgit v0.8.3-6-g21f6
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/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-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..a2cda2438e
--- /dev/null
+++ b/recipes/xorg-lib/pixman/0001-Generic-C-implementation-of-pixman_blt-with-overlapp.patch
@@ -0,0 +1,114 @@
+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/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
+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-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..003337f48d
--- /dev/null
+++ b/recipes/xorg-lib/pixman/0002-Support-of-overlapping-src-dst-for-pixman_blt_mmx.patch
@@ -0,0 +1,91 @@
+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/5] 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-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..7e8f34f6bd
--- /dev/null
+++ b/recipes/xorg-lib/pixman/0003-Support-of-overlapping-src-dst-for-pixman_blt_sse2.patch
@@ -0,0 +1,91 @@
+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/5] 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-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..0ba5b843b5
--- /dev/null
+++ b/recipes/xorg-lib/pixman/0004-Support-of-overlapping-src-dst-for-pixman_blt_neon.patch
@@ -0,0 +1,94 @@
+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/5] 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-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/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/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/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_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..86a224a341 100644
--- a/recipes/xorg-lib/pixman_0.16.2.bb
+++ b/recipes/xorg-lib/pixman_0.16.2.bb
@@ -1,15 +1,4 @@
-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}.1"
+EXTRA_OECONF = "--disable-gtk"
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
new file mode 100644
index 0000000000..eb3fe85a20
--- /dev/null
+++ b/recipes/xorg-lib/pixman_0.17.8.bb
@@ -0,0 +1,24 @@
+require pixman.inc
+PR = "${INC_PR}.0"
+
+DEFAULT_PREFERENCE = "-1"
+DEFAULT_PREFERENCE_angstrom = "2"
+DEFAULT_PREFERENCE_shr = "2"
+
+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 \
+ 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"
+
+NEON = " --disable-arm-neon "
+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 06547d3ddb..70886edc31 100644
--- a/recipes/xorg-lib/pixman_git.bb
+++ b/recipes/xorg-lib/pixman_git.bb
@@ -1,38 +1,26 @@
-SECTION = "libs"
-PRIORITY = "optional"
-DESCRIPTION = "Low-level pixel manipulation library."
-LICENSE = "X11"
-
-PV = "0.17.3"
-PR = "r6"
+require pixman.inc
+PV = "0.17.13"
+PR = "${INC_PR}.0"
PR_append = "+gitr${SRCREV}"
-BBCLASSEXTEND="native"
-
-SRCREV = "c97b1e803fc214e9880eaeff98410c8fa37f9ddc"
-
+SRCREV = "69f1ec9a7827aeb522fcae99846237ef0f896e7b"
+
DEFAULT_PREFERENCE = "-1"
-DEFAULT_PREFERENCE_angstrom = "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 \
- 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 = "git://anongit.freedesktop.org/pixman;protocol=git;branch=master \
+ 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 \
"
S = "${WORKDIR}/git"
-inherit autotools_stage
-
NEON = " --disable-arm-neon "
-NEON_armv7a = ""
+NEON_armv7a = " "
EXTRA_OECONF = "${NEON} --disable-gtk"
-
-AUTOTOOLS_STAGE_PKGCONFIG = "1"
-
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}"