All of lore.kernel.org
 help / color / mirror / Atom feed
From: Saul Wold <sgw@linux.intel.com>
To: Martin Jansa <martin.jansa@gmail.com>
Cc: openembedded-core@lists.openembedded.org
Subject: Re: [PATCH 1/2] pixman: merge meta-oe append into oe-core
Date: Mon, 10 Sep 2012 08:42:57 -0700	[thread overview]
Message-ID: <504E0A81.9060006@linux.intel.com> (raw)
In-Reply-To: <1346807137-4231-1-git-send-email-Martin.Jansa@gmail.com>

On 09/04/2012 06:05 PM, Martin Jansa wrote:
> From: Andreas Müller <schnitzeltony@googlemail.com>
>
> * neon configuration settings included
> * patches were aligned to 0.27.2.
>
> Signed-off-by: Andreas Müller <schnitzeltony@googlemail.com>
> Signed-off-by: Martin Jansa <Martin.Jansa@gmail.com>
> ---
>   ...lated-workarounds-in-cpu-features-detecti.patch | 144 +++++++++++++++++++++
>   ...mplementation-of-pixman_blt-with-overlapp.patch | 127 ++++++++++++++++++
>   meta/recipes-graphics/xorg-lib/pixman_0.27.2.bb    |  11 +-
>   3 files changed, 280 insertions(+), 2 deletions(-)
>   create mode 100644 meta/recipes-graphics/xorg-lib/pixman/0001-ARM-qemu-related-workarounds-in-cpu-features-detecti.patch
>   create mode 100644 meta/recipes-graphics/xorg-lib/pixman/0002-Generic-C-implementation-of-pixman_blt-with-overlapp.patch
>

Merged both pixman patches into OE-Core

Thanks
	Sau!


> diff --git a/meta/recipes-graphics/xorg-lib/pixman/0001-ARM-qemu-related-workarounds-in-cpu-features-detecti.patch b/meta/recipes-graphics/xorg-lib/pixman/0001-ARM-qemu-related-workarounds-in-cpu-features-detecti.patch
> new file mode 100644
> index 0000000..4569dca
> --- /dev/null
> +++ b/meta/recipes-graphics/xorg-lib/pixman/0001-ARM-qemu-related-workarounds-in-cpu-features-detecti.patch
> @@ -0,0 +1,144 @@
> +From a0f53e1dbb3851bb0f0efcfdbd565b05e4be9cac Mon Sep 17 00:00:00 2001
> +From: =?UTF-8?q?Andreas=20M=C3=BCller?= <schnitzeltony@googlemail.com>
> +Date: Thu, 23 Aug 2012 18:10:57 +0200
> +Subject: [PATCH 1/2] ARM: qemu related workarounds in cpu features detection
> + code
> +MIME-Version: 1.0
> +Content-Type: text/plain; charset=UTF-8
> +Content-Transfer-Encoding: 8bit
> +
> +This was ported from meta-oe's patch [1]. The original pixman patch is found
> +at [2].
> +
> +[1] http://cgit.openembedded.org/meta-openembedded/tree/meta-oe/recipes-graphics/xorg-lib/pixman-0.26.2/0001-ARM-qemu-related-workarounds-in-cpu-features-detecti.patch
> +[2] http://lists.freedesktop.org/archives/pixman/2011-January/000906.html
> +
> +Upstream-Status: Inappropriate [other] qemu fix
> +
> +Signed-off-by: Andreas Müller <schnitzeltony@googlemail.com>
> +---
> + pixman/pixman-arm.c |   82 ++++++++++++++++++++++++++++++++++++++++----------
> + 1 files changed, 65 insertions(+), 17 deletions(-)
> +
> +diff --git a/pixman/pixman-arm.c b/pixman/pixman-arm.c
> +index 23374e4..d98bda6 100644
> +--- a/pixman/pixman-arm.c
> ++++ b/pixman/pixman-arm.c
> +@@ -129,16 +129,35 @@ detect_cpu_features (void)
> + #include <sys/types.h>
> + #include <sys/stat.h>
> + #include <sys/mman.h>
> ++#include <sys/utsname.h>
> + #include <fcntl.h>
> + #include <string.h>
> + #include <elf.h>
> +
> ++/*
> ++ * The whole CPU capabilities detection is a bit ugly: when running in
> ++ * userspace qemu, we see /proc/self/auxv from the host system. To make
> ++ * everything even worse, the size of each value is 64-bit when running
> ++ * on a 64-bit host system. So the data is totally bogus because we expect
> ++ * 32-bit values. As AT_PLATFORM value is used as a pointer, it may cause
> ++ * segfault (null pointer dereference on x86-64 host). So in order to be
> ++ * on a safe side, we require that AT_PLATFORM value is found only once,
> ++ * and it has non-zero value (this is still not totally reliable for a big
> ++ * endian 64-bit host system running qemu and may theoretically fail).
> ++ */
> ++#define ARM_HWCAP_VFP 64
> ++#define ARM_HWCAP_IWMMXT 512
> ++#define ARM_HWCAP_NEON 4096
> ++
> + static arm_cpu_features_t
> + detect_cpu_features (void)
> + {
> +     arm_cpu_features_t features = 0;
> +     Elf32_auxv_t aux;
> +     int fd;
> ++    uint32_t hwcap = 0;
> ++    const char *plat = NULL;
> ++    int plat_cnt = 0;
> +
> +     fd = open ("/proc/self/auxv", O_RDONLY);
> +     if (fd >= 0)
> +@@ -147,32 +166,61 @@ detect_cpu_features (void)
> + 	{
> + 	    if (aux.a_type == AT_HWCAP)
> + 	    {
> +-		uint32_t hwcap = aux.a_un.a_val;
> +-
> +-		/* hardcode these values to avoid depending on specific
> +-		 * versions of the hwcap header, e.g. HWCAP_NEON
> +-		 */
> +-		if ((hwcap & 64) != 0)
> +-		    features |= ARM_VFP;
> +-		if ((hwcap & 512) != 0)
> +-		    features |= ARM_IWMMXT;
> +-		/* this flag is only present on kernel 2.6.29 */
> +-		if ((hwcap & 4096) != 0)
> +-		    features |= ARM_NEON;
> ++		hwcap = aux.a_un.a_val;
> + 	    }
> + 	    else if (aux.a_type == AT_PLATFORM)
> + 	    {
> +-		const char *plat = (const char*) aux.a_un.a_val;
> +-
> +-		if (strncmp (plat, "v7l", 3) == 0)
> ++		plat = (const char*) aux.a_un.a_val;
> ++		plat_cnt++;
> ++	    }
> ++	}
> ++	close (fd);
> ++	if (plat == NULL || plat_cnt != 1 || *plat != 'v')
> ++	{
> ++	    /*
> ++	     * Something seems to be really wrong, most likely we are
> ++	     * running under qemu. Let's use machine type from "uname" for
> ++	     * CPU capabilities detection:
> ++	     * http://www.mail-archive.com/qemu-devel at nongnu.org/msg22212.html
> ++	     */
> ++	    struct utsname u;
> ++	    hwcap = 0; /* clear hwcap, because it is bogus */
> ++	    if (uname (&u) == 0)
> ++	    {
> ++		if (strcmp (u.machine, "armv7l") == 0)
> ++		{
> + 		    features |= (ARM_V7 | ARM_V6);
> +-		else if (strncmp (plat, "v6l", 3) == 0)
> ++		    hwcap |= ARM_HWCAP_VFP;  /* qemu is supposed to emulate vfp */
> ++		    hwcap |= ARM_HWCAP_NEON; /* qemu is supposed to emulate neon */
> ++		}
> ++		else if (strcmp (u.machine, "armv6l") == 0)
> ++		{
> + 		    features |= ARM_V6;
> ++		    hwcap |= ARM_HWCAP_VFP;  /* qemu is supposed to emulate vfp */
> ++		}
> + 	    }
> + 	}
> +-	close (fd);
> ++	else if (strncmp (plat, "v7l", 3) == 0)
> ++	{
> ++	    features |= (ARM_V7 | ARM_V6);
> ++	}
> ++	else if (strncmp (plat, "v6l", 3) == 0)
> ++	{
> ++	    features |= ARM_V6;
> ++	}
> +     }
> +
> ++    /* hardcode these values to avoid depending on specific
> ++     * versions of the hwcap header, e.g. HWCAP_NEON
> ++     */
> ++    if ((hwcap & ARM_HWCAP_VFP) != 0)
> ++        features |= ARM_VFP;
> ++    if ((hwcap & ARM_HWCAP_IWMMXT) != 0)
> ++        features |= ARM_IWMMXT;
> ++    /* this flag is only present on kernel 2.6.29 */
> ++    if ((hwcap & ARM_HWCAP_NEON) != 0)
> ++        features |= ARM_NEON;
> ++
> +     return features;
> + }
> +
> +--
> +1.7.6.5
> +
> diff --git a/meta/recipes-graphics/xorg-lib/pixman/0002-Generic-C-implementation-of-pixman_blt-with-overlapp.patch b/meta/recipes-graphics/xorg-lib/pixman/0002-Generic-C-implementation-of-pixman_blt-with-overlapp.patch
> new file mode 100644
> index 0000000..abd501a
> --- /dev/null
> +++ b/meta/recipes-graphics/xorg-lib/pixman/0002-Generic-C-implementation-of-pixman_blt-with-overlapp.patch
> @@ -0,0 +1,127 @@
> +From 211b2bcdb19f86f3868a18520df7dcb4fd122f05 Mon Sep 17 00:00:00 2001
> +From: =?UTF-8?q?Andreas=20M=C3=BCller?= <schnitzeltony@googlemail.com>
> +Date: Sun, 19 Aug 2012 14:48:00 +0200
> +Subject: [PATCH 2/2] Generic C implementation of pixman_blt with overlapping
> + support
> +MIME-Version: 1.0
> +Content-Type: text/plain; charset=UTF-8
> +Content-Transfer-Encoding: 8bit
> +
> +This was ported from meta-oe's patch [1]:
> +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).
> +
> +[1] http://cgit.openembedded.org/meta-openembedded/tree/meta-oe/recipes-graphics/xorg-lib/pixman-0.26.2/0008-Generic-C-implementation-of-pixman_blt-with-overlapp.patch
> +
> +Upstream-Status: Unknown - this patch is in meta-oe for a while
> +
> +Signed-off-by: Andreas Müller <schnitzeltony@googlemail.com>
> +---
> + 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 d4b2daa..a86b206 100644
> +--- a/pixman/pixman-general.c
> ++++ b/pixman/pixman-general.c
> +@@ -215,9 +215,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 + dest_y * dst_stride + dest_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 d5e6a72..c77d256 100644
> +--- a/pixman/pixman-private.h
> ++++ b/pixman/pixman-private.h
> +@@ -24,6 +24,7 @@
> +
> + #include "pixman.h"
> + #include <time.h>
> ++#include <string.h>
> + #include <assert.h>
> + #include <stdio.h>
> + #include <string.h>
> +@@ -1096,6 +1097,48 @@ void pixman_timer_register (pixman_timer_t *timer);
> + extern const uint8_t linear_to_srgb[4096];
> + extern const uint16_t srgb_to_linear[256];
> +
> ++/* 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 /* __ASSEMBLER__ */
> +
> + #endif /* PIXMAN_PRIVATE_H */
> +--
> +1.7.4.4
> +
> diff --git a/meta/recipes-graphics/xorg-lib/pixman_0.27.2.bb b/meta/recipes-graphics/xorg-lib/pixman_0.27.2.bb
> index e55276e..35a2def 100644
> --- a/meta/recipes-graphics/xorg-lib/pixman_0.27.2.bb
> +++ b/meta/recipes-graphics/xorg-lib/pixman_0.27.2.bb
> @@ -15,14 +15,21 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=14096c769ae0cbb5fcb94ec468be11b3 \
>   DEPENDS += "zlib libpng"
>   BBCLASSEXTEND = "native"
>
> -PR = "r0"
> +PR = "r1"
>
>   PE = "1"
>
>   IWMMXT = "--disable-arm-iwmmxt"
>   LOONGSON_MMI = "--disable-loongson-mmi"
> +NEON = " --disable-arm-neon "
> +NEON_armv7a = " "
> +NEON_armv7a-vfp-neon = " "
>
> -EXTRA_OECONF="--disable-gtk ${IWMMXT} ${LOONGSON_MMI}"
> +EXTRA_OECONF="--disable-gtk ${IWMMXT} ${LOONGSON_MMI} ${NEON}"
>
> +SRC_URI += "\
> +            file://0001-ARM-qemu-related-workarounds-in-cpu-features-detecti.patch \
> +            file://0002-Generic-C-implementation-of-pixman_blt-with-overlapp.patch \
> +"
>   SRC_URI[md5sum] = "dd67154b23d88e6a75ad3a83f3052198"
>   SRC_URI[sha256sum] = "cae9dc13727a84f11beb150c88d3a06ba114f82c52d68073c663c027e099123b"
>



      parent reply	other threads:[~2012-09-10 15:55 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-09-05  1:05 [PATCH 1/2] pixman: merge meta-oe append into oe-core Martin Jansa
2012-09-05  1:05 ` [PATCH 2/2] pixman: ignore NEON, IWMMXT, LOONGSON_MMI variables for class-native Martin Jansa
2012-09-05  6:11   ` Robert Yang
2012-09-05  8:01     ` Paul Eggleton
2012-09-05  8:19     ` Martin Jansa
2012-09-05  8:26       ` Robert Yang
2012-09-05 20:29         ` Richard Purdie
2012-09-10 15:42 ` Saul Wold [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=504E0A81.9060006@linux.intel.com \
    --to=sgw@linux.intel.com \
    --cc=martin.jansa@gmail.com \
    --cc=openembedded-core@lists.openembedded.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.