diff options
author | Koen Kooi <koen@dominion.thruhere.net> | 2010-11-01 14:39:20 +0100 |
---|---|---|
committer | Koen Kooi <koen@dominion.thruhere.net> | 2010-11-01 20:07:13 +0100 |
commit | 2b41bf1cc71b52e09573b130a568100e18bef12b (patch) | |
tree | 20ed56e64ecf1000f65fdae1e5ab54118ccf290d | |
download | meta-openembedded-2b41bf1cc71b52e09573b130a568100e18bef12b.tar.gz |
angstrom-layers: add 'meta-openembedded' layer to merge in cleaned up OE recipes
Signed-off-by: Koen Kooi <k-kooi@ti.com>
12 files changed, 1019 insertions, 0 deletions
diff --git a/conf/layer.conf b/conf/layer.conf new file mode 100644 index 0000000000..119b114f0c --- /dev/null +++ b/conf/layer.conf | |||
@@ -0,0 +1,9 @@ | |||
1 | # We have a conf and classes directory, add to BBPATH | ||
2 | BBPATH := "${BBPATH}:${LAYERDIR}" | ||
3 | |||
4 | # We have a recipes directory, add to BBFILES | ||
5 | BBFILES := "${BBFILES} ${LAYERDIR}/recipes-*/*/*.bb" | ||
6 | |||
7 | BBFILE_COLLECTIONS += "openembedded-layer" | ||
8 | BBFILE_PATTERN_openembedded-layer := "^${LAYERDIR}/" | ||
9 | BBFILE_PRIORITY_openembedded-layer = "5" | ||
diff --git a/recipes-graphics/xorg-lib/pixman-0.20.0/0000-Add-pixman_bits_override_accessors.patch b/recipes-graphics/xorg-lib/pixman-0.20.0/0000-Add-pixman_bits_override_accessors.patch new file mode 100644 index 0000000000..43cd44268e --- /dev/null +++ b/recipes-graphics/xorg-lib/pixman-0.20.0/0000-Add-pixman_bits_override_accessors.patch | |||
@@ -0,0 +1,77 @@ | |||
1 | From 38aabb3be87ea68e37f34256c778d07f62680ec6 Mon Sep 17 00:00:00 2001 | ||
2 | From: Siarhei Siamashka <siarhei.siamashka@nokia.com> | ||
3 | Date: Thu, 10 Dec 2009 00:51:50 +0200 | ||
4 | Subject: [PATCH 1/9] add _pixman_bits_override_accessors | ||
5 | |||
6 | * from patch ARM: HACK: added NEON optimizations for fetch/store r5g6b5 scanline | ||
7 | * used in | ||
8 | 0005-ARM-added-NEON-optimizations-for-fetch-store-r5g6b5-.patch | ||
9 | 0006-ARM-added-NEON-optimizations-for-fetch-store-a8-scan.patch | ||
10 | 0007-ARM-added-NEON-optimizations-for-fetching-x8r8g8b8-s.patch | ||
11 | |||
12 | |||
13 | --- | ||
14 | pixman/pixman-access.c | 23 ++++++++++++++++++++++- | ||
15 | pixman/pixman-private.h | 5 +++++ | ||
16 | 4 files changed, 87 insertions(+), 1 deletions(-) | ||
17 | |||
18 | diff --git a/pixman/pixman-access.c b/pixman/pixman-access.c | ||
19 | index f1ce0ba..b33da29 100644 | ||
20 | --- a/pixman/pixman-access.c | ||
21 | +++ b/pixman/pixman-access.c | ||
22 | @@ -2836,7 +2836,7 @@ typedef struct | ||
23 | store_scanline_ ## format, store_scanline_generic_64 \ | ||
24 | } | ||
25 | |||
26 | -static const format_info_t accessors[] = | ||
27 | +static format_info_t accessors[] = | ||
28 | { | ||
29 | /* 32 bpp formats */ | ||
30 | FORMAT_INFO (a8r8g8b8), | ||
31 | @@ -2978,6 +2978,27 @@ _pixman_bits_image_setup_accessors (bits_image_t *image) | ||
32 | setup_accessors (image); | ||
33 | } | ||
34 | |||
35 | +void | ||
36 | +_pixman_bits_override_accessors (pixman_format_code_t format, | ||
37 | + fetch_scanline_t fetch_func, | ||
38 | + store_scanline_t store_func) | ||
39 | +{ | ||
40 | + format_info_t *info = accessors; | ||
41 | + | ||
42 | + while (info->format != PIXMAN_null) | ||
43 | + { | ||
44 | + if (info->format == format) | ||
45 | + { | ||
46 | + if (fetch_func) | ||
47 | + info->fetch_scanline_32 = fetch_func; | ||
48 | + if (store_func) | ||
49 | + info->store_scanline_32 = store_func; | ||
50 | + return; | ||
51 | + } | ||
52 | + info++; | ||
53 | + } | ||
54 | +} | ||
55 | + | ||
56 | #else | ||
57 | |||
58 | void | ||
59 | diff --git a/pixman/pixman-private.h b/pixman/pixman-private.h | ||
60 | index d85868f..564f8f0 100644 | ||
61 | --- a/pixman/pixman-private.h | ||
62 | +++ b/pixman/pixman-private.h | ||
63 | @@ -206,6 +206,11 @@ void | ||
64 | _pixman_bits_image_setup_accessors (bits_image_t *image); | ||
65 | |||
66 | void | ||
67 | +_pixman_bits_override_accessors (pixman_format_code_t format, | ||
68 | + fetch_scanline_t fetch_func, | ||
69 | + store_scanline_t store_func); | ||
70 | + | ||
71 | +void | ||
72 | _pixman_image_get_scanline_generic_64 (pixman_image_t *image, | ||
73 | int x, | ||
74 | int y, | ||
75 | -- | ||
76 | 1.6.6.1 | ||
77 | |||
diff --git a/recipes-graphics/xorg-lib/pixman-0.20.0/0001-Generic-C-implementation-of-pixman_blt-with-overlapp.patch b/recipes-graphics/xorg-lib/pixman-0.20.0/0001-Generic-C-implementation-of-pixman_blt-with-overlapp.patch new file mode 100644 index 0000000000..795cce5bad --- /dev/null +++ b/recipes-graphics/xorg-lib/pixman-0.20.0/0001-Generic-C-implementation-of-pixman_blt-with-overlapp.patch | |||
@@ -0,0 +1,114 @@ | |||
1 | From 97b2bb933455f222b392b5c60a8bde82d7d6329f Mon Sep 17 00:00:00 2001 | ||
2 | From: Siarhei Siamashka <siarhei.siamashka@nokia.com> | ||
3 | Date: Tue, 16 Mar 2010 16:55:28 +0100 | ||
4 | Subject: [PATCH 1/8] Generic C implementation of pixman_blt with overlapping support | ||
5 | |||
6 | Uses memcpy/memmove functions to copy pixels, can handle the | ||
7 | case when both source and destination areas are in the same | ||
8 | image (this is useful for scrolling). | ||
9 | |||
10 | It is assumed that copying direction is only important when | ||
11 | using the same image for both source and destination (and | ||
12 | src_stride == dst_stride). Copying direction is undefined | ||
13 | for the images with different source and destination stride | ||
14 | which happen to be in the overlapped areas (but this is an | ||
15 | unrealistic case anyway). | ||
16 | --- | ||
17 | pixman/pixman-general.c | 21 ++++++++++++++++++--- | ||
18 | pixman/pixman-private.h | 43 +++++++++++++++++++++++++++++++++++++++++++ | ||
19 | 2 files changed, 61 insertions(+), 3 deletions(-) | ||
20 | |||
21 | diff --git a/pixman/pixman-general.c b/pixman/pixman-general.c | ||
22 | index 4d234a0..c4d2c14 100644 | ||
23 | --- a/pixman/pixman-general.c | ||
24 | +++ b/pixman/pixman-general.c | ||
25 | @@ -280,9 +280,24 @@ general_blt (pixman_implementation_t *imp, | ||
26 | int width, | ||
27 | int height) | ||
28 | { | ||
29 | - /* We can't blit unless we have sse2 or mmx */ | ||
30 | - | ||
31 | - return FALSE; | ||
32 | + uint8_t *dst_bytes = (uint8_t *)dst_bits; | ||
33 | + uint8_t *src_bytes = (uint8_t *)src_bits; | ||
34 | + int bpp; | ||
35 | + | ||
36 | + if (src_bpp != dst_bpp || src_bpp & 7) | ||
37 | + return FALSE; | ||
38 | + | ||
39 | + bpp = src_bpp >> 3; | ||
40 | + width *= bpp; | ||
41 | + src_stride *= 4; | ||
42 | + dst_stride *= 4; | ||
43 | + pixman_blt_helper (src_bytes + src_y * src_stride + src_x * bpp, | ||
44 | + dst_bytes + dst_y * dst_stride + dst_x * bpp, | ||
45 | + src_stride, | ||
46 | + dst_stride, | ||
47 | + width, | ||
48 | + height); | ||
49 | + return TRUE; | ||
50 | } | ||
51 | |||
52 | static pixman_bool_t | ||
53 | diff --git a/pixman/pixman-private.h b/pixman/pixman-private.h | ||
54 | index c43172b..f980454 100644 | ||
55 | --- a/pixman/pixman-private.h | ||
56 | +++ b/pixman/pixman-private.h | ||
57 | @@ -10,6 +10,7 @@ | ||
58 | |||
59 | #include "pixman.h" | ||
60 | #include <time.h> | ||
61 | +#include <string.h> | ||
62 | #include <assert.h> | ||
63 | #include <stdio.h> | ||
64 | #include <string.h> | ||
65 | @@ -873,4 +874,46 @@ void pixman_timer_register (pixman_timer_t *timer); | ||
66 | |||
67 | #endif /* PIXMAN_TIMERS */ | ||
68 | |||
69 | +/* a helper function, can blit 8-bit images with src/dst overlapping support */ | ||
70 | +static inline void | ||
71 | +pixman_blt_helper (uint8_t *src_bytes, | ||
72 | + uint8_t *dst_bytes, | ||
73 | + int src_stride, | ||
74 | + int dst_stride, | ||
75 | + int width, | ||
76 | + int height) | ||
77 | +{ | ||
78 | + /* | ||
79 | + * The second part of this check is not strictly needed, but it prevents | ||
80 | + * unnecessary upside-down processing of areas which belong to different | ||
81 | + * images. Upside-down processing can be slower with fixed-distance-ahead | ||
82 | + * prefetch and perceived as having more tearing. | ||
83 | + */ | ||
84 | + if (src_bytes < dst_bytes + width && | ||
85 | + src_bytes + src_stride * height > dst_bytes) | ||
86 | + { | ||
87 | + src_bytes += src_stride * height - src_stride; | ||
88 | + dst_bytes += dst_stride * height - dst_stride; | ||
89 | + dst_stride = -dst_stride; | ||
90 | + src_stride = -src_stride; | ||
91 | + /* Horizontal scrolling to the left needs memmove */ | ||
92 | + if (src_bytes + width > dst_bytes) | ||
93 | + { | ||
94 | + while (--height >= 0) | ||
95 | + { | ||
96 | + memmove (dst_bytes, src_bytes, width); | ||
97 | + dst_bytes += dst_stride; | ||
98 | + src_bytes += src_stride; | ||
99 | + } | ||
100 | + return; | ||
101 | + } | ||
102 | + } | ||
103 | + while (--height >= 0) | ||
104 | + { | ||
105 | + memcpy (dst_bytes, src_bytes, width); | ||
106 | + dst_bytes += dst_stride; | ||
107 | + src_bytes += src_stride; | ||
108 | + } | ||
109 | +} | ||
110 | + | ||
111 | #endif /* PIXMAN_PRIVATE_H */ | ||
112 | -- | ||
113 | 1.6.6.1 | ||
114 | |||
diff --git a/recipes-graphics/xorg-lib/pixman-0.20.0/0002-Support-of-overlapping-src-dst-for-pixman_blt_mmx.patch b/recipes-graphics/xorg-lib/pixman-0.20.0/0002-Support-of-overlapping-src-dst-for-pixman_blt_mmx.patch new file mode 100644 index 0000000000..6e2d492aaf --- /dev/null +++ b/recipes-graphics/xorg-lib/pixman-0.20.0/0002-Support-of-overlapping-src-dst-for-pixman_blt_mmx.patch | |||
@@ -0,0 +1,91 @@ | |||
1 | From 47b31f936641da07431093ede340465625bfcb3d Mon Sep 17 00:00:00 2001 | ||
2 | From: Siarhei Siamashka <siarhei.siamashka@nokia.com> | ||
3 | Date: Thu, 22 Oct 2009 05:45:47 +0300 | ||
4 | Subject: [PATCH 2/8] Support of overlapping src/dst for pixman_blt_mmx | ||
5 | |||
6 | --- | ||
7 | pixman/pixman-mmx.c | 55 +++++++++++++++++++++++++++++--------------------- | ||
8 | 1 files changed, 32 insertions(+), 23 deletions(-) | ||
9 | |||
10 | diff --git a/pixman/pixman-mmx.c b/pixman/pixman-mmx.c | ||
11 | index e936c4c..2413197 100644 | ||
12 | --- a/pixman/pixman-mmx.c | ||
13 | +++ b/pixman/pixman-mmx.c | ||
14 | @@ -2996,34 +2996,43 @@ pixman_blt_mmx (uint32_t *src_bits, | ||
15 | { | ||
16 | uint8_t * src_bytes; | ||
17 | uint8_t * dst_bytes; | ||
18 | - int byte_width; | ||
19 | + int bpp; | ||
20 | |||
21 | - if (src_bpp != dst_bpp) | ||
22 | + if (src_bpp != dst_bpp || src_bpp & 7) | ||
23 | return FALSE; | ||
24 | |||
25 | - if (src_bpp == 16) | ||
26 | - { | ||
27 | - src_stride = src_stride * (int) sizeof (uint32_t) / 2; | ||
28 | - dst_stride = dst_stride * (int) sizeof (uint32_t) / 2; | ||
29 | - src_bytes = (uint8_t *)(((uint16_t *)src_bits) + src_stride * (src_y) + (src_x)); | ||
30 | - dst_bytes = (uint8_t *)(((uint16_t *)dst_bits) + dst_stride * (dst_y) + (dst_x)); | ||
31 | - byte_width = 2 * width; | ||
32 | - src_stride *= 2; | ||
33 | - dst_stride *= 2; | ||
34 | - } | ||
35 | - else if (src_bpp == 32) | ||
36 | + bpp = src_bpp >> 3; | ||
37 | + width *= bpp; | ||
38 | + src_stride *= 4; | ||
39 | + dst_stride *= 4; | ||
40 | + src_bytes = (uint8_t *)src_bits + src_y * src_stride + src_x * bpp; | ||
41 | + dst_bytes = (uint8_t *)dst_bits + dst_y * dst_stride + dst_x * bpp; | ||
42 | + | ||
43 | + if (src_bpp != 16 && src_bpp != 32) | ||
44 | { | ||
45 | - src_stride = src_stride * (int) sizeof (uint32_t) / 4; | ||
46 | - dst_stride = dst_stride * (int) sizeof (uint32_t) / 4; | ||
47 | - src_bytes = (uint8_t *)(((uint32_t *)src_bits) + src_stride * (src_y) + (src_x)); | ||
48 | - dst_bytes = (uint8_t *)(((uint32_t *)dst_bits) + dst_stride * (dst_y) + (dst_x)); | ||
49 | - byte_width = 4 * width; | ||
50 | - src_stride *= 4; | ||
51 | - dst_stride *= 4; | ||
52 | + pixman_blt_helper (src_bytes, dst_bytes, src_stride, dst_stride, | ||
53 | + width, height); | ||
54 | + return TRUE; | ||
55 | } | ||
56 | - else | ||
57 | + | ||
58 | + if (src_bytes < dst_bytes && src_bytes + src_stride * height > dst_bytes) | ||
59 | { | ||
60 | - return FALSE; | ||
61 | + src_bytes += src_stride * height - src_stride; | ||
62 | + dst_bytes += dst_stride * height - dst_stride; | ||
63 | + dst_stride = -dst_stride; | ||
64 | + src_stride = -src_stride; | ||
65 | + | ||
66 | + if (src_bytes + width > dst_bytes) | ||
67 | + { | ||
68 | + /* TODO: reverse scanline copy using MMX */ | ||
69 | + while (--height >= 0) | ||
70 | + { | ||
71 | + memmove (dst_bytes, src_bytes, width); | ||
72 | + dst_bytes += dst_stride; | ||
73 | + src_bytes += src_stride; | ||
74 | + } | ||
75 | + return TRUE; | ||
76 | + } | ||
77 | } | ||
78 | |||
79 | while (height--) | ||
80 | @@ -3033,7 +3042,7 @@ pixman_blt_mmx (uint32_t *src_bits, | ||
81 | uint8_t *d = dst_bytes; | ||
82 | src_bytes += src_stride; | ||
83 | dst_bytes += dst_stride; | ||
84 | - w = byte_width; | ||
85 | + w = width; | ||
86 | |||
87 | while (w >= 2 && ((unsigned long)d & 3)) | ||
88 | { | ||
89 | -- | ||
90 | 1.6.6.1 | ||
91 | |||
diff --git a/recipes-graphics/xorg-lib/pixman-0.20.0/0003-Support-of-overlapping-src-dst-for-pixman_blt_sse2.patch b/recipes-graphics/xorg-lib/pixman-0.20.0/0003-Support-of-overlapping-src-dst-for-pixman_blt_sse2.patch new file mode 100644 index 0000000000..910f62e6dd --- /dev/null +++ b/recipes-graphics/xorg-lib/pixman-0.20.0/0003-Support-of-overlapping-src-dst-for-pixman_blt_sse2.patch | |||
@@ -0,0 +1,91 @@ | |||
1 | From 13be027637602fffda3b3cb6e171d8d6a67b3b4b Mon Sep 17 00:00:00 2001 | ||
2 | From: Siarhei Siamashka <siarhei.siamashka@nokia.com> | ||
3 | Date: Thu, 22 Oct 2009 05:45:54 +0300 | ||
4 | Subject: [PATCH 3/8] Support of overlapping src/dst for pixman_blt_sse2 | ||
5 | |||
6 | --- | ||
7 | pixman/pixman-sse2.c | 55 +++++++++++++++++++++++++++++-------------------- | ||
8 | 1 files changed, 32 insertions(+), 23 deletions(-) | ||
9 | |||
10 | diff --git a/pixman/pixman-sse2.c b/pixman/pixman-sse2.c | ||
11 | index 5907de0..25015ae 100644 | ||
12 | --- a/pixman/pixman-sse2.c | ||
13 | +++ b/pixman/pixman-sse2.c | ||
14 | @@ -5027,34 +5027,43 @@ pixman_blt_sse2 (uint32_t *src_bits, | ||
15 | { | ||
16 | uint8_t * src_bytes; | ||
17 | uint8_t * dst_bytes; | ||
18 | - int byte_width; | ||
19 | + int bpp; | ||
20 | |||
21 | - if (src_bpp != dst_bpp) | ||
22 | + if (src_bpp != dst_bpp || src_bpp & 7) | ||
23 | return FALSE; | ||
24 | |||
25 | - if (src_bpp == 16) | ||
26 | - { | ||
27 | - src_stride = src_stride * (int) sizeof (uint32_t) / 2; | ||
28 | - dst_stride = dst_stride * (int) sizeof (uint32_t) / 2; | ||
29 | - src_bytes =(uint8_t *)(((uint16_t *)src_bits) + src_stride * (src_y) + (src_x)); | ||
30 | - dst_bytes = (uint8_t *)(((uint16_t *)dst_bits) + dst_stride * (dst_y) + (dst_x)); | ||
31 | - byte_width = 2 * width; | ||
32 | - src_stride *= 2; | ||
33 | - dst_stride *= 2; | ||
34 | - } | ||
35 | - else if (src_bpp == 32) | ||
36 | + bpp = src_bpp >> 3; | ||
37 | + width *= bpp; | ||
38 | + src_stride *= 4; | ||
39 | + dst_stride *= 4; | ||
40 | + src_bytes = (uint8_t *)src_bits + src_y * src_stride + src_x * bpp; | ||
41 | + dst_bytes = (uint8_t *)dst_bits + dst_y * dst_stride + dst_x * bpp; | ||
42 | + | ||
43 | + if (src_bpp != 16 && src_bpp != 32) | ||
44 | { | ||
45 | - src_stride = src_stride * (int) sizeof (uint32_t) / 4; | ||
46 | - dst_stride = dst_stride * (int) sizeof (uint32_t) / 4; | ||
47 | - src_bytes = (uint8_t *)(((uint32_t *)src_bits) + src_stride * (src_y) + (src_x)); | ||
48 | - dst_bytes = (uint8_t *)(((uint32_t *)dst_bits) + dst_stride * (dst_y) + (dst_x)); | ||
49 | - byte_width = 4 * width; | ||
50 | - src_stride *= 4; | ||
51 | - dst_stride *= 4; | ||
52 | + pixman_blt_helper (src_bytes, dst_bytes, src_stride, dst_stride, | ||
53 | + width, height); | ||
54 | + return TRUE; | ||
55 | } | ||
56 | - else | ||
57 | + | ||
58 | + if (src_bytes < dst_bytes && src_bytes + src_stride * height > dst_bytes) | ||
59 | { | ||
60 | - return FALSE; | ||
61 | + src_bytes += src_stride * height - src_stride; | ||
62 | + dst_bytes += dst_stride * height - dst_stride; | ||
63 | + dst_stride = -dst_stride; | ||
64 | + src_stride = -src_stride; | ||
65 | + | ||
66 | + if (src_bytes + width > dst_bytes) | ||
67 | + { | ||
68 | + /* TODO: reverse scanline copy using SSE2 */ | ||
69 | + while (--height >= 0) | ||
70 | + { | ||
71 | + memmove (dst_bytes, src_bytes, width); | ||
72 | + dst_bytes += dst_stride; | ||
73 | + src_bytes += src_stride; | ||
74 | + } | ||
75 | + return TRUE; | ||
76 | + } | ||
77 | } | ||
78 | |||
79 | while (height--) | ||
80 | @@ -5064,7 +5073,7 @@ pixman_blt_sse2 (uint32_t *src_bits, | ||
81 | uint8_t *d = dst_bytes; | ||
82 | src_bytes += src_stride; | ||
83 | dst_bytes += dst_stride; | ||
84 | - w = byte_width; | ||
85 | + w = width; | ||
86 | |||
87 | while (w >= 2 && ((unsigned long)d & 3)) | ||
88 | { | ||
89 | -- | ||
90 | 1.6.6.1 | ||
91 | |||
diff --git a/recipes-graphics/xorg-lib/pixman-0.20.0/0004-Support-of-overlapping-src-dst-for-pixman_blt_neon.patch b/recipes-graphics/xorg-lib/pixman-0.20.0/0004-Support-of-overlapping-src-dst-for-pixman_blt_neon.patch new file mode 100644 index 0000000000..f6aa9792b8 --- /dev/null +++ b/recipes-graphics/xorg-lib/pixman-0.20.0/0004-Support-of-overlapping-src-dst-for-pixman_blt_neon.patch | |||
@@ -0,0 +1,94 @@ | |||
1 | From a913cc05a1a1c5a813cf06d248334edede9caab7 Mon Sep 17 00:00:00 2001 | ||
2 | From: Siarhei Siamashka <siarhei.siamashka@nokia.com> | ||
3 | Date: Wed, 18 Nov 2009 06:08:48 +0200 | ||
4 | Subject: [PATCH 4/8] Support of overlapping src/dst for pixman_blt_neon | ||
5 | |||
6 | --- | ||
7 | pixman/pixman-arm-neon.c | 62 +++++++++++++++++++++++++++++++++++++-------- | ||
8 | 1 files changed, 51 insertions(+), 11 deletions(-) | ||
9 | |||
10 | diff --git a/pixman/pixman-arm-neon.c b/pixman/pixman-arm-neon.c | ||
11 | index be5d403..cbfd7cf 100644 | ||
12 | --- a/pixman/pixman-arm-neon.c | ||
13 | +++ b/pixman/pixman-arm-neon.c | ||
14 | @@ -176,26 +176,66 @@ pixman_blt_neon (uint32_t *src_bits, | ||
15 | int width, | ||
16 | int height) | ||
17 | { | ||
18 | - if (src_bpp != dst_bpp) | ||
19 | + uint8_t * src_bytes; | ||
20 | + uint8_t * dst_bytes; | ||
21 | + int bpp; | ||
22 | + | ||
23 | + if (src_bpp != dst_bpp || src_bpp & 7) | ||
24 | return FALSE; | ||
25 | |||
26 | + bpp = src_bpp >> 3; | ||
27 | + width *= bpp; | ||
28 | + src_stride *= 4; | ||
29 | + dst_stride *= 4; | ||
30 | + src_bytes = (uint8_t *)src_bits + src_y * src_stride + src_x * bpp; | ||
31 | + dst_bytes = (uint8_t *)dst_bits + dst_y * dst_stride + dst_x * bpp; | ||
32 | + | ||
33 | + if (src_bpp != 16 && src_bpp != 32) | ||
34 | + { | ||
35 | + pixman_blt_helper (src_bytes, dst_bytes, src_stride, dst_stride, | ||
36 | + width, height); | ||
37 | + return TRUE; | ||
38 | + } | ||
39 | + | ||
40 | + if (src_bytes < dst_bytes && src_bytes + src_stride * height > dst_bytes) | ||
41 | + { | ||
42 | + src_bytes += src_stride * height - src_stride; | ||
43 | + dst_bytes += dst_stride * height - dst_stride; | ||
44 | + dst_stride = -dst_stride; | ||
45 | + src_stride = -src_stride; | ||
46 | + | ||
47 | + if (src_bytes + width > dst_bytes) | ||
48 | + { | ||
49 | + /* TODO: reverse scanline copy using NEON */ | ||
50 | + while (--height >= 0) | ||
51 | + { | ||
52 | + memmove (dst_bytes, src_bytes, width); | ||
53 | + dst_bytes += dst_stride; | ||
54 | + src_bytes += src_stride; | ||
55 | + } | ||
56 | + return TRUE; | ||
57 | + } | ||
58 | + } | ||
59 | + | ||
60 | switch (src_bpp) | ||
61 | { | ||
62 | case 16: | ||
63 | pixman_composite_src_0565_0565_asm_neon ( | ||
64 | - width, height, | ||
65 | - (uint16_t *)(((char *) dst_bits) + | ||
66 | - dst_y * dst_stride * 4 + dst_x * 2), dst_stride * 2, | ||
67 | - (uint16_t *)(((char *) src_bits) + | ||
68 | - src_y * src_stride * 4 + src_x * 2), src_stride * 2); | ||
69 | + width >> 1, | ||
70 | + height, | ||
71 | + (uint16_t *) dst_bytes, | ||
72 | + dst_stride >> 1, | ||
73 | + (uint16_t *) src_bytes, | ||
74 | + src_stride >> 1); | ||
75 | return TRUE; | ||
76 | case 32: | ||
77 | pixman_composite_src_8888_8888_asm_neon ( | ||
78 | - width, height, | ||
79 | - (uint32_t *)(((char *) dst_bits) + | ||
80 | - dst_y * dst_stride * 4 + dst_x * 4), dst_stride, | ||
81 | - (uint32_t *)(((char *) src_bits) + | ||
82 | - src_y * src_stride * 4 + src_x * 4), src_stride); | ||
83 | + width >> 2, | ||
84 | + height, | ||
85 | + (uint32_t *) dst_bytes, | ||
86 | + dst_stride >> 2, | ||
87 | + (uint32_t *) src_bytes, | ||
88 | + src_stride >> 2); | ||
89 | return TRUE; | ||
90 | default: | ||
91 | return FALSE; | ||
92 | -- | ||
93 | 1.6.6.1 | ||
94 | |||
diff --git a/recipes-graphics/xorg-lib/pixman-0.20.0/0005-ARM-added-NEON-optimizations-for-fetch-store-r5g6b5-.patch b/recipes-graphics/xorg-lib/pixman-0.20.0/0005-ARM-added-NEON-optimizations-for-fetch-store-r5g6b5-.patch new file mode 100644 index 0000000000..dbe98b38ce --- /dev/null +++ b/recipes-graphics/xorg-lib/pixman-0.20.0/0005-ARM-added-NEON-optimizations-for-fetch-store-r5g6b5-.patch | |||
@@ -0,0 +1,109 @@ | |||
1 | From f75e9d1868e21dd75ff3a2ca3561546d23877ddb Mon Sep 17 00:00:00 2001 | ||
2 | From: Siarhei Siamashka <siarhei.siamashka@nokia.com> | ||
3 | Date: Thu, 10 Dec 2009 00:51:50 +0200 | ||
4 | Subject: [PATCH 5/8] ARM: added NEON optimizations for fetch/store r5g6b5 scanline | ||
5 | |||
6 | --- | ||
7 | pixman/pixman-arm-neon-asm.S | 20 ++++++++++++++++++++ | ||
8 | pixman/pixman-arm-neon.c | 40 ++++++++++++++++++++++++++++++++++++++++ | ||
9 | 2 files changed, 60 insertions(+), 0 deletions(-) | ||
10 | |||
11 | diff --git a/pixman/pixman-arm-neon-asm.S b/pixman/pixman-arm-neon-asm.S | ||
12 | index e4db5cd..c79ba81 100644 | ||
13 | --- a/pixman/pixman-arm-neon-asm.S | ||
14 | +++ b/pixman/pixman-arm-neon-asm.S | ||
15 | @@ -459,6 +459,16 @@ generate_composite_function \ | ||
16 | pixman_composite_src_8888_0565_process_pixblock_tail, \ | ||
17 | pixman_composite_src_8888_0565_process_pixblock_tail_head | ||
18 | |||
19 | +generate_composite_function_single_scanline \ | ||
20 | + pixman_store_scanline_r5g6b5_asm_neon, 32, 0, 16, \ | ||
21 | + FLAG_DST_WRITEONLY | FLAG_DEINTERLEAVE_32BPP, \ | ||
22 | + 8, /* number of pixels, processed in a single block */ \ | ||
23 | + default_init, \ | ||
24 | + default_cleanup, \ | ||
25 | + pixman_composite_src_8888_0565_process_pixblock_head, \ | ||
26 | + pixman_composite_src_8888_0565_process_pixblock_tail, \ | ||
27 | + pixman_composite_src_8888_0565_process_pixblock_tail_head | ||
28 | + | ||
29 | /******************************************************************************/ | ||
30 | |||
31 | .macro pixman_composite_src_0565_8888_process_pixblock_head | ||
32 | @@ -494,6 +504,16 @@ generate_composite_function \ | ||
33 | pixman_composite_src_0565_8888_process_pixblock_tail, \ | ||
34 | pixman_composite_src_0565_8888_process_pixblock_tail_head | ||
35 | |||
36 | +generate_composite_function_single_scanline \ | ||
37 | + pixman_fetch_scanline_r5g6b5_asm_neon, 16, 0, 32, \ | ||
38 | + FLAG_DST_WRITEONLY | FLAG_DEINTERLEAVE_32BPP, \ | ||
39 | + 8, /* number of pixels, processed in a single block */ \ | ||
40 | + default_init, \ | ||
41 | + default_cleanup, \ | ||
42 | + pixman_composite_src_0565_8888_process_pixblock_head, \ | ||
43 | + pixman_composite_src_0565_8888_process_pixblock_tail, \ | ||
44 | + pixman_composite_src_0565_8888_process_pixblock_tail_head | ||
45 | + | ||
46 | /******************************************************************************/ | ||
47 | |||
48 | .macro pixman_composite_add_8_8_process_pixblock_head | ||
49 | diff --git a/pixman/pixman-arm-neon.c b/pixman/pixman-arm-neon.c | ||
50 | index cbfd7cf..f88c8f8 100644 | ||
51 | --- a/pixman/pixman-arm-neon.c | ||
52 | +++ b/pixman/pixman-arm-neon.c | ||
53 | @@ -392,6 +392,42 @@ BIND_COMBINE_U (over) | ||
54 | BIND_COMBINE_U (add) | ||
55 | BIND_COMBINE_U (out_reverse) | ||
56 | |||
57 | +void | ||
58 | +pixman_fetch_scanline_r5g6b5_asm_neon (int width, | ||
59 | + uint32_t *buffer, | ||
60 | + const uint16_t *pixel); | ||
61 | +void | ||
62 | +pixman_store_scanline_r5g6b5_asm_neon (int width, | ||
63 | + uint16_t *pixel, | ||
64 | + const uint32_t *values); | ||
65 | + | ||
66 | +static void | ||
67 | +neon_fetch_scanline_r5g6b5 (pixman_image_t *image, | ||
68 | + int x, | ||
69 | + int y, | ||
70 | + int width, | ||
71 | + uint32_t * buffer, | ||
72 | + const uint32_t *mask) | ||
73 | +{ | ||
74 | + const uint32_t *bits = image->bits.bits + y * image->bits.rowstride; | ||
75 | + const uint16_t *pixel = (const uint16_t *)bits + x; | ||
76 | + | ||
77 | + pixman_fetch_scanline_r5g6b5_asm_neon (width, buffer, pixel); | ||
78 | +} | ||
79 | + | ||
80 | +static void | ||
81 | +neon_store_scanline_r5g6b5 (bits_image_t * image, | ||
82 | + int x, | ||
83 | + int y, | ||
84 | + int width, | ||
85 | + const uint32_t *values) | ||
86 | +{ | ||
87 | + uint32_t *bits = image->bits + image->rowstride * y; | ||
88 | + uint16_t *pixel = ((uint16_t *) bits) + x; | ||
89 | + | ||
90 | + pixman_store_scanline_r5g6b5_asm_neon (width, pixel, values); | ||
91 | +} | ||
92 | + | ||
93 | pixman_implementation_t * | ||
94 | _pixman_implementation_create_arm_neon (void) | ||
95 | { | ||
96 | @@ -407,6 +443,10 @@ _pixman_implementation_create_arm_neon (void) | ||
97 | imp->combine_32[PIXMAN_OP_ADD] = neon_combine_add_u; | ||
98 | imp->combine_32[PIXMAN_OP_OUT_REVERSE] = neon_combine_out_reverse_u; | ||
99 | |||
100 | + _pixman_bits_override_accessors (PIXMAN_r5g6b5, | ||
101 | + neon_fetch_scanline_r5g6b5, | ||
102 | + neon_store_scanline_r5g6b5); | ||
103 | + | ||
104 | imp->blt = arm_neon_blt; | ||
105 | imp->fill = arm_neon_fill; | ||
106 | |||
107 | -- | ||
108 | 1.6.6.1 | ||
109 | |||
diff --git a/recipes-graphics/xorg-lib/pixman-0.20.0/0006-ARM-added-NEON-optimizations-for-fetch-store-a8-scan.patch b/recipes-graphics/xorg-lib/pixman-0.20.0/0006-ARM-added-NEON-optimizations-for-fetch-store-a8-scan.patch new file mode 100644 index 0000000000..d050646fa7 --- /dev/null +++ b/recipes-graphics/xorg-lib/pixman-0.20.0/0006-ARM-added-NEON-optimizations-for-fetch-store-a8-scan.patch | |||
@@ -0,0 +1,148 @@ | |||
1 | From a1cd695c5e22f0f4a2b7272fab675a3cc510bacb Mon Sep 17 00:00:00 2001 | ||
2 | From: Siarhei Siamashka <siarhei.siamashka@nokia.com> | ||
3 | Date: Thu, 23 Sep 2010 21:10:56 +0300 | ||
4 | Subject: [PATCH 6/8] ARM: added NEON optimizations for fetch/store a8 scanline | ||
5 | |||
6 | --- | ||
7 | pixman/pixman-arm-neon-asm.S | 64 ++++++++++++++++++++++++++++++++++++++++++ | ||
8 | pixman/pixman-arm-neon.c | 42 +++++++++++++++++++++++++++ | ||
9 | 2 files changed, 106 insertions(+), 0 deletions(-) | ||
10 | |||
11 | diff --git a/pixman/pixman-arm-neon-asm.S b/pixman/pixman-arm-neon-asm.S | ||
12 | index c79ba81..ca0825c 100644 | ||
13 | --- a/pixman/pixman-arm-neon-asm.S | ||
14 | +++ b/pixman/pixman-arm-neon-asm.S | ||
15 | @@ -418,6 +418,70 @@ generate_composite_function \ | ||
16 | |||
17 | /******************************************************************************/ | ||
18 | |||
19 | +.macro pixman_composite_src_8_8888_process_pixblock_head | ||
20 | + /* This is tricky part: we can't set these values just once in 'init' macro | ||
21 | + * because leading/trailing pixels handling part uses VZIP.8 instructions, | ||
22 | + * and they operate on values in-place and destroy original registers | ||
23 | + * content. Think about it like VST4.8 instruction corrupting NEON | ||
24 | + * registers after write in 'tail_head' macro. Except that 'tail_head' | ||
25 | + * macro itself actually does not need these extra VMOVs because it uses | ||
26 | + * real VST4.8 instruction. | ||
27 | + */ | ||
28 | + vmov.u8 q0, #0 | ||
29 | + vmov.u8 d2, #0 | ||
30 | +.endm | ||
31 | + | ||
32 | +.macro pixman_composite_src_8_8888_process_pixblock_tail | ||
33 | +.endm | ||
34 | + | ||
35 | +.macro pixman_composite_src_8_8888_process_pixblock_tail_head | ||
36 | + vst4.8 {d0, d1, d2, d3}, [DST_W, :128]! | ||
37 | + vld1.8 {d3}, [SRC]! | ||
38 | +.endm | ||
39 | + | ||
40 | +generate_composite_function_single_scanline \ | ||
41 | + pixman_fetch_scanline_a8_asm_neon, 8, 0, 32, \ | ||
42 | + FLAG_DST_WRITEONLY | FLAG_DEINTERLEAVE_32BPP, \ | ||
43 | + 8, /* number of pixels, processed in a single block */ \ | ||
44 | + default_init, \ | ||
45 | + default_cleanup, \ | ||
46 | + pixman_composite_src_8_8888_process_pixblock_head, \ | ||
47 | + pixman_composite_src_8_8888_process_pixblock_tail, \ | ||
48 | + pixman_composite_src_8_8888_process_pixblock_tail_head, \ | ||
49 | + 0, /* dst_w_basereg */ \ | ||
50 | + 0, /* dst_r_basereg */ \ | ||
51 | + 3, /* src_basereg */ \ | ||
52 | + 0 /* mask_basereg */ | ||
53 | + | ||
54 | +/******************************************************************************/ | ||
55 | + | ||
56 | +.macro pixman_composite_src_8888_8_process_pixblock_head | ||
57 | +.endm | ||
58 | + | ||
59 | +.macro pixman_composite_src_8888_8_process_pixblock_tail | ||
60 | +.endm | ||
61 | + | ||
62 | +.macro pixman_composite_src_8888_8_process_pixblock_tail_head | ||
63 | + vst1.8 {d3}, [DST_W, :64]! | ||
64 | + vld4.8 {d0, d1, d2, d3}, [SRC]! | ||
65 | +.endm | ||
66 | + | ||
67 | +generate_composite_function_single_scanline \ | ||
68 | + pixman_store_scanline_a8_asm_neon, 32, 0, 8, \ | ||
69 | + FLAG_DST_WRITEONLY | FLAG_DEINTERLEAVE_32BPP, \ | ||
70 | + 8, /* number of pixels, processed in a single block */ \ | ||
71 | + default_init, \ | ||
72 | + default_cleanup, \ | ||
73 | + pixman_composite_src_8888_8_process_pixblock_head, \ | ||
74 | + pixman_composite_src_8888_8_process_pixblock_tail, \ | ||
75 | + pixman_composite_src_8888_8_process_pixblock_tail_head, \ | ||
76 | + 3, /* dst_w_basereg */ \ | ||
77 | + 0, /* dst_r_basereg */ \ | ||
78 | + 0, /* src_basereg */ \ | ||
79 | + 0 /* mask_basereg */ | ||
80 | + | ||
81 | +/******************************************************************************/ | ||
82 | + | ||
83 | .macro pixman_composite_src_8888_0565_process_pixblock_head | ||
84 | vshll.u8 q8, d1, #8 | ||
85 | vshll.u8 q14, d2, #8 | ||
86 | diff --git a/pixman/pixman-arm-neon.c b/pixman/pixman-arm-neon.c | ||
87 | index f88c8f8..43091d2 100644 | ||
88 | --- a/pixman/pixman-arm-neon.c | ||
89 | +++ b/pixman/pixman-arm-neon.c | ||
90 | @@ -428,6 +428,45 @@ neon_store_scanline_r5g6b5 (bits_image_t * image, | ||
91 | pixman_store_scanline_r5g6b5_asm_neon (width, pixel, values); | ||
92 | } | ||
93 | |||
94 | +void | ||
95 | +pixman_fetch_scanline_a8_asm_neon (int width, | ||
96 | + uint32_t *buffer, | ||
97 | + const uint8_t *pixel); | ||
98 | + | ||
99 | + | ||
100 | +void | ||
101 | +pixman_store_scanline_a8_asm_neon (int width, | ||
102 | + uint8_t *pixel, | ||
103 | + const uint32_t *values); | ||
104 | + | ||
105 | +static void | ||
106 | +neon_fetch_scanline_a8 (pixman_image_t *image, | ||
107 | + int x, | ||
108 | + int y, | ||
109 | + int width, | ||
110 | + uint32_t * buffer, | ||
111 | + const uint32_t *mask) | ||
112 | +{ | ||
113 | + const uint32_t *bits = image->bits.bits + y * image->bits.rowstride; | ||
114 | + const uint8_t *pixel = (const uint8_t *) bits + x; | ||
115 | + | ||
116 | + pixman_fetch_scanline_a8_asm_neon (width, buffer, pixel); | ||
117 | +} | ||
118 | + | ||
119 | +static void | ||
120 | +neon_store_scanline_a8 (bits_image_t * image, | ||
121 | + int x, | ||
122 | + int y, | ||
123 | + int width, | ||
124 | + const uint32_t *values) | ||
125 | +{ | ||
126 | + uint32_t *bits = image->bits + image->rowstride * y; | ||
127 | + uint8_t *pixel = (uint8_t *) bits + x; | ||
128 | + | ||
129 | + pixman_store_scanline_a8_asm_neon (width, pixel, values); | ||
130 | +} | ||
131 | + | ||
132 | + | ||
133 | pixman_implementation_t * | ||
134 | _pixman_implementation_create_arm_neon (void) | ||
135 | { | ||
136 | @@ -446,6 +485,9 @@ _pixman_implementation_create_arm_neon (void) | ||
137 | _pixman_bits_override_accessors (PIXMAN_r5g6b5, | ||
138 | neon_fetch_scanline_r5g6b5, | ||
139 | neon_store_scanline_r5g6b5); | ||
140 | + _pixman_bits_override_accessors (PIXMAN_a8, | ||
141 | + neon_fetch_scanline_a8, | ||
142 | + neon_store_scanline_a8); | ||
143 | |||
144 | imp->blt = arm_neon_blt; | ||
145 | imp->fill = arm_neon_fill; | ||
146 | -- | ||
147 | 1.6.6.1 | ||
148 | |||
diff --git a/recipes-graphics/xorg-lib/pixman-0.20.0/0007-ARM-added-NEON-optimizations-for-fetching-x8r8g8b8-s.patch b/recipes-graphics/xorg-lib/pixman-0.20.0/0007-ARM-added-NEON-optimizations-for-fetching-x8r8g8b8-s.patch new file mode 100644 index 0000000000..7f28f47cff --- /dev/null +++ b/recipes-graphics/xorg-lib/pixman-0.20.0/0007-ARM-added-NEON-optimizations-for-fetching-x8r8g8b8-s.patch | |||
@@ -0,0 +1,77 @@ | |||
1 | From d6ae7da60cc797900b5eff0786536c4a11ab0f50 Mon Sep 17 00:00:00 2001 | ||
2 | From: Siarhei Siamashka <siarhei.siamashka@nokia.com> | ||
3 | Date: Fri, 24 Sep 2010 18:22:44 +0300 | ||
4 | Subject: [PATCH 7/8] ARM: added NEON optimizations for fetching x8r8g8b8 scanline | ||
5 | |||
6 | --- | ||
7 | pixman/pixman-arm-neon-asm.S | 14 ++++++++++++++ | ||
8 | pixman/pixman-arm-neon.c | 21 +++++++++++++++++++++ | ||
9 | 2 files changed, 35 insertions(+), 0 deletions(-) | ||
10 | |||
11 | diff --git a/pixman/pixman-arm-neon-asm.S b/pixman/pixman-arm-neon-asm.S | ||
12 | index ca0825c..ffd0b83 100644 | ||
13 | --- a/pixman/pixman-arm-neon-asm.S | ||
14 | +++ b/pixman/pixman-arm-neon-asm.S | ||
15 | @@ -1206,6 +1206,20 @@ generate_composite_function \ | ||
16 | 0, /* src_basereg */ \ | ||
17 | 0 /* mask_basereg */ | ||
18 | |||
19 | +generate_composite_function_single_scanline \ | ||
20 | + pixman_fetch_scanline_x888_asm_neon, 32, 0, 32, \ | ||
21 | + FLAG_DST_WRITEONLY, \ | ||
22 | + 8, /* number of pixels, processed in a single block */ \ | ||
23 | + pixman_composite_src_x888_8888_init, \ | ||
24 | + default_cleanup, \ | ||
25 | + pixman_composite_src_x888_8888_process_pixblock_head, \ | ||
26 | + pixman_composite_src_x888_8888_process_pixblock_tail, \ | ||
27 | + pixman_composite_src_x888_8888_process_pixblock_tail_head, \ | ||
28 | + 0, /* dst_w_basereg */ \ | ||
29 | + 0, /* dst_r_basereg */ \ | ||
30 | + 0, /* src_basereg */ \ | ||
31 | + 0 /* mask_basereg */ | ||
32 | + | ||
33 | /******************************************************************************/ | ||
34 | |||
35 | .macro pixman_composite_over_n_8_8888_process_pixblock_head | ||
36 | diff --git a/pixman/pixman-arm-neon.c b/pixman/pixman-arm-neon.c | ||
37 | index 43091d2..f84b5e6 100644 | ||
38 | --- a/pixman/pixman-arm-neon.c | ||
39 | +++ b/pixman/pixman-arm-neon.c | ||
40 | @@ -466,6 +466,24 @@ neon_store_scanline_a8 (bits_image_t * image, | ||
41 | pixman_store_scanline_a8_asm_neon (width, pixel, values); | ||
42 | } | ||
43 | |||
44 | +void | ||
45 | +pixman_fetch_scanline_x888_asm_neon (int width, | ||
46 | + uint32_t *buffer, | ||
47 | + const uint32_t *pixel); | ||
48 | + | ||
49 | +static void | ||
50 | +neon_fetch_scanline_x888 (pixman_image_t *image, | ||
51 | + int x, | ||
52 | + int y, | ||
53 | + int width, | ||
54 | + uint32_t * buffer, | ||
55 | + const uint32_t *mask) | ||
56 | +{ | ||
57 | + const uint32_t *bits = image->bits.bits + y * image->bits.rowstride; | ||
58 | + const uint32_t *pixel = (const uint32_t *) bits + x; | ||
59 | + | ||
60 | + pixman_fetch_scanline_x888_asm_neon (width, buffer, pixel); | ||
61 | +} | ||
62 | |||
63 | pixman_implementation_t * | ||
64 | _pixman_implementation_create_arm_neon (void) | ||
65 | @@ -488,6 +506,9 @@ _pixman_implementation_create_arm_neon (void) | ||
66 | _pixman_bits_override_accessors (PIXMAN_a8, | ||
67 | neon_fetch_scanline_a8, | ||
68 | neon_store_scanline_a8); | ||
69 | + _pixman_bits_override_accessors (PIXMAN_x8r8g8b8, | ||
70 | + neon_fetch_scanline_x888, | ||
71 | + NULL); | ||
72 | |||
73 | imp->blt = arm_neon_blt; | ||
74 | imp->fill = arm_neon_fill; | ||
75 | -- | ||
76 | 1.6.6.1 | ||
77 | |||
diff --git a/recipes-graphics/xorg-lib/pixman-0.20.0/0008-ARM-optimization-for-scaled-src_0565_0565-operation-.patch b/recipes-graphics/xorg-lib/pixman-0.20.0/0008-ARM-optimization-for-scaled-src_0565_0565-operation-.patch new file mode 100644 index 0000000000..6efdb621ad --- /dev/null +++ b/recipes-graphics/xorg-lib/pixman-0.20.0/0008-ARM-optimization-for-scaled-src_0565_0565-operation-.patch | |||
@@ -0,0 +1,172 @@ | |||
1 | From e1191ad6563a1fb02a45982b1c4d7fed3c655e97 Mon Sep 17 00:00:00 2001 | ||
2 | From: Siarhei Siamashka <siarhei.siamashka@nokia.com> | ||
3 | Date: Mon, 4 Oct 2010 01:56:59 +0300 | ||
4 | Subject: [PATCH 8/8] ARM optimization for scaled src_0565_0565 operation with nearest filter | ||
5 | |||
6 | The code actually uses only armv4t instructions. | ||
7 | |||
8 | Benchmark from ARM11: | ||
9 | |||
10 | == before == | ||
11 | op=1, src_fmt=10020565, dst_fmt=10020565, speed=34.86 MPix/s | ||
12 | |||
13 | == after == | ||
14 | op=1, src_fmt=10020565, dst_fmt=10020565, speed=36.62 MPix/s | ||
15 | |||
16 | Benchmark from ARM Cortex-A8: | ||
17 | |||
18 | == before == | ||
19 | op=1, src_fmt=10020565, dst_fmt=10020565, speed=89.55 MPix/s | ||
20 | |||
21 | == after == | ||
22 | op=1, src_fmt=10020565, dst_fmt=10020565, speed=94.91 MPix/s | ||
23 | --- | ||
24 | pixman/pixman-arm-simd-asm.S | 66 ++++++++++++++++++++++++++++++++++++++++++ | ||
25 | pixman/pixman-arm-simd.c | 37 +++++++++++++++++++++++ | ||
26 | 2 files changed, 103 insertions(+), 0 deletions(-) | ||
27 | |||
28 | diff --git a/pixman/pixman-arm-simd-asm.S b/pixman/pixman-arm-simd-asm.S | ||
29 | index a3d2d40..b6f69db 100644 | ||
30 | --- a/pixman/pixman-arm-simd-asm.S | ||
31 | +++ b/pixman/pixman-arm-simd-asm.S | ||
32 | @@ -1,5 +1,6 @@ | ||
33 | /* | ||
34 | * Copyright © 2008 Mozilla Corporation | ||
35 | + * Copyright © 2010 Nokia Corporation | ||
36 | * | ||
37 | * Permission to use, copy, modify, distribute, and sell this software and its | ||
38 | * documentation for any purpose is hereby granted without fee, provided that | ||
39 | @@ -328,3 +329,68 @@ pixman_asm_function pixman_composite_over_n_8_8888_asm_armv6 | ||
40 | pop {r4, r5, r6, r7, r8, r9, r10, r11} | ||
41 | bx lr | ||
42 | .endfunc | ||
43 | + | ||
44 | +/* | ||
45 | + * Note: This function is actually primarily optimized for ARM Cortex-A8 | ||
46 | + * pipeline. In order to get good performance on ARM9/ARM11 cores (which | ||
47 | + * don't have efficient write combining), it needs to be changed to use | ||
48 | + * 16-byte aligned writes using STM instruction. | ||
49 | + */ | ||
50 | +pixman_asm_function pixman_scaled_nearest_scanline_565_565_SRC_asm_armv6 | ||
51 | + DST .req r0 | ||
52 | + SRC .req r1 | ||
53 | + W .req r2 | ||
54 | + VX .req r3 | ||
55 | + UNIT_X .req r12 | ||
56 | + TMP1 .req r4 | ||
57 | + TMP2 .req r5 | ||
58 | + MASK .req r6 | ||
59 | + ldr UNIT_X, [sp] | ||
60 | + push {r4, r5, r6, r7} | ||
61 | + mvn MASK, #1 | ||
62 | + | ||
63 | + /* define helper macro */ | ||
64 | + .macro scale_2_pixels | ||
65 | + ldrh TMP1, [SRC, TMP1] | ||
66 | + and TMP2, MASK, VX, lsr #15 | ||
67 | + add VX, VX, UNIT_X | ||
68 | + strh TMP1, [DST], #2 | ||
69 | + | ||
70 | + ldrh TMP2, [SRC, TMP2] | ||
71 | + and TMP1, MASK, VX, lsr #15 | ||
72 | + add VX, VX, UNIT_X | ||
73 | + strh TMP2, [DST], #2 | ||
74 | + .endm | ||
75 | + | ||
76 | + /* now do the scaling */ | ||
77 | + and TMP1, MASK, VX, lsr #15 | ||
78 | + add VX, VX, UNIT_X | ||
79 | + subs W, #4 | ||
80 | + blt 2f | ||
81 | +1: /* main loop, process 4 pixels per iteration */ | ||
82 | + scale_2_pixels | ||
83 | + scale_2_pixels | ||
84 | + subs W, W, #4 | ||
85 | + bge 1b | ||
86 | +2: | ||
87 | + tst W, #2 | ||
88 | + beq 2f | ||
89 | + scale_2_pixels | ||
90 | +2: | ||
91 | + tst W, #1 | ||
92 | + ldrneh TMP1, [SRC, TMP1] | ||
93 | + strneh TMP1, [DST], #2 | ||
94 | + /* cleanup helper macro */ | ||
95 | + .purgem scale_2_pixels | ||
96 | + .unreq DST | ||
97 | + .unreq SRC | ||
98 | + .unreq W | ||
99 | + .unreq VX | ||
100 | + .unreq UNIT_X | ||
101 | + .unreq TMP1 | ||
102 | + .unreq TMP2 | ||
103 | + .unreq MASK | ||
104 | + /* return */ | ||
105 | + pop {r4, r5, r6, r7} | ||
106 | + bx lr | ||
107 | +.endfunc | ||
108 | diff --git a/pixman/pixman-arm-simd.c b/pixman/pixman-arm-simd.c | ||
109 | index d466a31..f6f464c 100644 | ||
110 | --- a/pixman/pixman-arm-simd.c | ||
111 | +++ b/pixman/pixman-arm-simd.c | ||
112 | @@ -29,6 +29,7 @@ | ||
113 | |||
114 | #include "pixman-private.h" | ||
115 | #include "pixman-arm-common.h" | ||
116 | +#include "pixman-fast-path.h" | ||
117 | |||
118 | #if 0 /* This code was moved to 'pixman-arm-simd-asm.S' */ | ||
119 | |||
120 | @@ -375,6 +376,35 @@ pixman_composite_over_n_8_8888_asm_armv6 (int32_t width, | ||
121 | |||
122 | #endif | ||
123 | |||
124 | +void | ||
125 | +pixman_scaled_nearest_scanline_565_565_SRC_asm_armv6 (uint16_t * dst, | ||
126 | + uint16_t * src, | ||
127 | + int32_t w, | ||
128 | + pixman_fixed_t vx, | ||
129 | + pixman_fixed_t unit_x); | ||
130 | + | ||
131 | +static force_inline void | ||
132 | +scaled_nearest_scanline_armv6_565_565_SRC (uint16_t * dst, | ||
133 | + uint16_t * src, | ||
134 | + int32_t w, | ||
135 | + pixman_fixed_t vx, | ||
136 | + pixman_fixed_t unit_x, | ||
137 | + pixman_fixed_t max_vx) | ||
138 | +{ | ||
139 | + pixman_scaled_nearest_scanline_565_565_SRC_asm_armv6 (dst, src, w, | ||
140 | + vx, unit_x); | ||
141 | +} | ||
142 | + | ||
143 | +FAST_NEAREST_MAINLOOP (armv6_565_565_cover_SRC, | ||
144 | + scaled_nearest_scanline_armv6_565_565_SRC, | ||
145 | + uint16_t, uint16_t, COVER); | ||
146 | +FAST_NEAREST_MAINLOOP (armv6_565_565_none_SRC, | ||
147 | + scaled_nearest_scanline_armv6_565_565_SRC, | ||
148 | + uint16_t, uint16_t, NONE); | ||
149 | +FAST_NEAREST_MAINLOOP (armv6_565_565_pad_SRC, | ||
150 | + scaled_nearest_scanline_armv6_565_565_SRC, | ||
151 | + uint16_t, uint16_t, PAD); | ||
152 | + | ||
153 | PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (armv6, add_8_8, | ||
154 | uint8_t, 1, uint8_t, 1) | ||
155 | PIXMAN_ARM_BIND_FAST_PATH_SRC_DST (armv6, over_8888_8888, | ||
156 | @@ -404,6 +434,13 @@ static const pixman_fast_path_t arm_simd_fast_paths[] = | ||
157 | PIXMAN_STD_FAST_PATH (OVER, solid, a8, a8b8g8r8, armv6_composite_over_n_8_8888), | ||
158 | PIXMAN_STD_FAST_PATH (OVER, solid, a8, x8b8g8r8, armv6_composite_over_n_8_8888), | ||
159 | |||
160 | + SIMPLE_NEAREST_FAST_PATH_COVER (SRC, r5g6b5, r5g6b5, armv6_565_565), | ||
161 | + SIMPLE_NEAREST_FAST_PATH_COVER (SRC, b5g6r5, b5g6r5, armv6_565_565), | ||
162 | + SIMPLE_NEAREST_FAST_PATH_NONE (SRC, r5g6b5, r5g6b5, armv6_565_565), | ||
163 | + SIMPLE_NEAREST_FAST_PATH_NONE (SRC, b5g6r5, b5g6r5, armv6_565_565), | ||
164 | + SIMPLE_NEAREST_FAST_PATH_PAD (SRC, r5g6b5, r5g6b5, armv6_565_565), | ||
165 | + SIMPLE_NEAREST_FAST_PATH_PAD (SRC, b5g6r5, b5g6r5, armv6_565_565), | ||
166 | + | ||
167 | { PIXMAN_OP_NONE }, | ||
168 | }; | ||
169 | |||
170 | -- | ||
171 | 1.6.6.1 | ||
172 | |||
diff --git a/recipes-graphics/xorg-lib/pixman.inc b/recipes-graphics/xorg-lib/pixman.inc new file mode 100644 index 0000000000..539a33a888 --- /dev/null +++ b/recipes-graphics/xorg-lib/pixman.inc | |||
@@ -0,0 +1,14 @@ | |||
1 | SECTION = "libs" | ||
2 | PRIORITY = "optional" | ||
3 | DESCRIPTION = "Low-level pixel manipulation library." | ||
4 | LICENSE = "X11" | ||
5 | |||
6 | DEPENDS = "perl-native" | ||
7 | |||
8 | BBCLASSEXTEND = "native" | ||
9 | |||
10 | SRC_URI = "http://cairographics.org/releases/${BPN}-${PV}.tar.gz;name=archive " | ||
11 | |||
12 | INC_PR = "r5" | ||
13 | |||
14 | inherit autotools pkgconfig | ||
diff --git a/recipes-graphics/xorg-lib/pixman_0.20.0.bb b/recipes-graphics/xorg-lib/pixman_0.20.0.bb new file mode 100644 index 0000000000..b3fbd4f155 --- /dev/null +++ b/recipes-graphics/xorg-lib/pixman_0.20.0.bb | |||
@@ -0,0 +1,23 @@ | |||
1 | require pixman.inc | ||
2 | |||
3 | SRC_URI[archive.md5sum] = "c1a31d5cedfa97c5af7148a2d1fd4356" | ||
4 | SRC_URI[archive.sha256sum] = "9c02c22c6cc3f28f3633d02ef6f0cac130518f621edb011ebbbf08cd1a81251a" | ||
5 | |||
6 | PR = "${INC_PR}.0" | ||
7 | |||
8 | SRC_URI += "\ | ||
9 | file://0000-Add-pixman_bits_override_accessors.patch \ | ||
10 | file://0001-Generic-C-implementation-of-pixman_blt-with-overlapp.patch \ | ||
11 | file://0002-Support-of-overlapping-src-dst-for-pixman_blt_mmx.patch \ | ||
12 | file://0003-Support-of-overlapping-src-dst-for-pixman_blt_sse2.patch \ | ||
13 | file://0004-Support-of-overlapping-src-dst-for-pixman_blt_neon.patch \ | ||
14 | file://0005-ARM-added-NEON-optimizations-for-fetch-store-r5g6b5-.patch \ | ||
15 | file://0006-ARM-added-NEON-optimizations-for-fetch-store-a8-scan.patch \ | ||
16 | file://0007-ARM-added-NEON-optimizations-for-fetching-x8r8g8b8-s.patch \ | ||
17 | file://0008-ARM-optimization-for-scaled-src_0565_0565-operation-.patch \ | ||
18 | " | ||
19 | |||
20 | NEON = " --disable-arm-neon " | ||
21 | NEON_armv7a = " " | ||
22 | |||
23 | EXTRA_OECONF = "${NEON} --disable-gtk" | ||