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" | ||
