All of lore.kernel.org
 help / color / mirror / Atom feed
From: Yann E. MORIN <yann.morin.1998@free.fr>
To: buildroot@busybox.net
Subject: [Buildroot] [PATCH v8 20/28] xbmc: Allow compilation with uClibc
Date: Sat, 17 May 2014 22:40:50 +0200	[thread overview]
Message-ID: <20140517204050.GK3459@free.fr> (raw)
In-Reply-To: <1400342276-10303-21-git-send-email-bernd.kuhls@t-online.de>

Bernd, All,

On 2014-05-17 17:57 +0200, Bernd Kuhls spake thusly:
> - Add dependencies needed by xbmc on BR2_LARGEFILE, BR2_INET_IPV6 &
>   BR2_USE_WCHAR after the removal of BR2_TOOLCHAIN_USES_GLIBC
> - Add xbmc-0002-mathutil.patch to fix ARM compilation

I was just wondering how important building on uClibc would be.

XBMC is already a large chunk of a beast, so the benefit of switching to
uClibc would be minimal size-wise, no?

Remember that uClibc was initially made for systems with storage size
constrains, which is surely not the case for a device where XBMC is
expected to run in the first place.

That being said, I don't much care about XBMC+uClibc, but the small
runtime speed benefits alone might be worth the patch anyway.

Regards,
Yann E. MORIN.

> Signed-off-by: Bernd Kuhls <bernd.kuhls@t-online.de>
> ---
>  package/xbmc/Config.in                |   15 ++-
>  package/xbmc/xbmc-0002-mathutil.patch |  213 +++++++++++++++++++++++++++++++++
>  2 files changed, 222 insertions(+), 6 deletions(-)
>  create mode 100644 package/xbmc/xbmc-0002-mathutil.patch
> 
> diff --git a/package/xbmc/Config.in b/package/xbmc/Config.in
> index 0f45f5c..f001209 100644
> --- a/package/xbmc/Config.in
> +++ b/package/xbmc/Config.in
> @@ -1,11 +1,10 @@
> -comment "xbmc needs an (e)glibc toolchain w/ C++, threads"
> -	depends on !BR2_TOOLCHAIN_USES_GLIBC || !BR2_INSTALL_LIBSTDCPP || !BR2_TOOLCHAIN_HAS_THREADS
> +comment "xbmc needs a toolchain w/ C++, IPv6, largefile, threads, wchar"
> +	depends on BR2_arm || BR2_i386 || BR2_x86_64
> +	depends on !BR2_INET_IPV6 || !BR2_INSTALL_LIBSTDCPP || !BR2_LARGEFILE || !BR2_TOOLCHAIN_HAS_THREADS || !BR2_USE_WCHAR
>  
>  comment "xbmc requires an OpenGL ES and EGL backend"
> +	depends on BR2_arm || BR2_i386 || BR2_x86_64
>  	depends on !BR2_PACKAGE_HAS_LIBEGL || !BR2_PACKAGE_HAS_LIBGLES
> -	depends on BR2_TOOLCHAIN_USES_GLIBC
> -	depends on BR2_INSTALL_LIBSTDCPP
> -	depends on BR2_TOOLCHAIN_HAS_THREADS
>  
>  menuconfig BR2_PACKAGE_XBMC
>  	bool "xbmc"
> @@ -57,10 +56,14 @@ menuconfig BR2_PACKAGE_XBMC
>  	select BR2_PACKAGE_TINYXML
>  	select BR2_PACKAGE_YAJL
>  	select BR2_PACKAGE_ZLIB
> -	depends on BR2_TOOLCHAIN_USES_GLIBC
> +	depends on BR2_INET_IPV6
>  	depends on BR2_INSTALL_LIBSTDCPP
> +	depends on BR2_LARGEFILE
>  	depends on BR2_TOOLCHAIN_HAS_THREADS
>  	depends on BR2_PACKAGE_HAS_LIBEGL && BR2_PACKAGE_HAS_LIBGLES
> +	depends on BR2_USE_MMU # python
> +	depends on BR2_USE_WCHAR
> +	depends on BR2_arm || BR2_i386 || BR2_x86_64
>  	help
>  	  XBMC is an award-winning free and open source (GPL) software
>  	  media player and entertainment hub for digital media.
> diff --git a/package/xbmc/xbmc-0002-mathutil.patch b/package/xbmc/xbmc-0002-mathutil.patch
> new file mode 100644
> index 0000000..33f91eb
> --- /dev/null
> +++ b/package/xbmc/xbmc-0002-mathutil.patch
> @@ -0,0 +1,213 @@
> +Taken from upstream PR: https://github.com/xbmc/xbmc/pull/3760
> +
> +Signed-off-by: Bernd Kuhls <bernd.kuhls@t-online.de>
> +
> +
> +From 7388e8be7cd5e78100532ebf0dba15dccb7b03f8 Mon Sep 17 00:00:00 2001
> +From: Ben Avison <bavison@riscosopen.org>
> +Date: Tue, 3 Dec 2013 15:51:39 +0000
> +Subject: [PATCH] Faster and simpler portable implementation of
> + MathUtils::round_int().
> +
> +Much as I like a bit of inline assembler, I have also removed the ARM versions
> +of MathUtils::truncate_int() and MathUtils::round_int(). The former was just
> +how any sane compiler should have assembled a cast from double to signed int
> +anyway. The latter was a much too complicated way to achieve the desired
> +effect, and was switched out in most ARM builds anyway in favour of the old
> +portable implementation that used floor().
> +
> +Verified that MathUtils::test() still passes, and that GCC is now able to
> +inline MathUtils::round_int(), where it didn't previously.
> +
> +I tested on a Raspberry Pi with the default theme, displaying the front page
> +with the RSS ticker enabled. This saturates the CPU, so I'm measuring the
> +improvement using the debug window's FPS figure. This patch improves this from
> +~50.8 FPS to ~52.6 FPS.
> +---
> + xbmc/utils/MathUtils.h | 129 +++++++++++++++++++++++--------------------------
> + 1 file changed, 61 insertions(+), 68 deletions(-)
> +
> +diff --git a/xbmc/utils/MathUtils.h b/xbmc/utils/MathUtils.h
> +index 96af9f4..0dae77d 100644
> +--- a/xbmc/utils/MathUtils.h
> ++++ b/xbmc/utils/MathUtils.h
> +@@ -34,17 +34,13 @@
> + 
> + #if defined(__ppc__) || \
> +     defined(__powerpc__) || \
> +-   (defined(TARGET_DARWIN_IOS) && defined(__llvm__)) || \
> +-   (defined(TARGET_ANDROID) && defined(__arm__)) || \
> +-    defined(TARGET_RASPBERRY_PI)
> ++    defined(__arm__)
> +   #define DISABLE_MATHUTILS_ASM_ROUND_INT
> + #endif
> + 
> + #if defined(__ppc__) || \
> +     defined(__powerpc__) || \
> +-   (defined(TARGET_DARWIN) && defined(__llvm__)) || \
> +-   (defined(TARGET_ANDROID) && defined(__arm__)) || \
> +-    defined(TARGET_RASPBERRY_PI)
> ++    defined(__arm__)
> +   #define DISABLE_MATHUTILS_ASM_TRUNCATE_INT
> + #endif
> + 
> +@@ -73,60 +69,63 @@
> +   {
> +     assert(x > static_cast<double>(INT_MIN / 2) - 1.0);
> +     assert(x < static_cast<double>(INT_MAX / 2) + 1.0);
> +-    const float round_to_nearest = 0.5f;
> +-    int i;
> + 
> + #if defined(DISABLE_MATHUTILS_ASM_ROUND_INT)
> +-    i = floor(x + round_to_nearest);
> +-
> +-#elif defined(__arm__)
> +-    // From 'ARM-v7-M Architecture Reference Manual' page A7-569:
> +-    //  "The floating-point to integer operation (vcvt) [normally] uses the Round towards Zero rounding mode"
> +-    // Because of this...we must use some less-than-straightforward logic to perform this operation without
> +-    //  changing the rounding mode flags
> +-
> +-    /* The assembly below implements the following logic:
> +-     if (x < 0)
> +-       inc = -0.5f
> +-     else
> +-       inc = 0.5f
> +-     int_val = trunc(x+inc);
> +-     err = x - int_val;
> +-     if (err == 0.5f)
> +-       int_val++;
> +-     return int_val;
> +-    */
> ++    /* This implementation warrants some further explanation.
> ++     *
> ++     * First, a couple of notes on rounding:
> ++     * 1) C casts from float/double to integer round towards zero.
> ++     * 2) Float/double additions are rounded according to the normal rules,
> ++     *    in other words: on some architectures, it's fixed at compile-time,
> ++     *    and on others it can be set using fesetround()). The following
> ++     *    analysis assumes round-to-nearest with ties rounding to even. This
> ++     *    is a fairly sensible choice, and is the default with ARM VFP.
> ++     *
> ++     * What this function wants is round-to-nearest with ties rounding to
> ++     * +infinity. This isn't an IEEE rounding mode, even if we could guarantee
> ++     * that all architectures supported fesetround(), which they don't. Instead,
> ++     * this adds an offset of 2147483648.5 (= 0x80000000.8p0), then casts to
> ++     * an unsigned int (crucially, all possible inputs are now in a range where
> ++     * round to zero acts the same as round to -infinity) and then subtracts
> ++     * 0x80000000 in the integer domain. The 0.5 component of the offset
> ++     * converts what is effectively a round down into a round to nearest, with
> ++     * ties rounding up, as desired.
> ++     *
> ++     * There is a catch, that because there is a double rounding, there is a
> ++     * small region where the input falls just *below* a tie, where the addition
> ++     * of the offset causes a round *up* to an exact integer, due to the finite
> ++     * level of precision available in floating point. You need to be aware of
> ++     * this when calling this function, although at present it is not believed
> ++     * that XBMC ever attempts to round numbers in this window.
> ++     *
> ++     * It is worth proving the size of the affected window. Recall that double
> ++     * precision employs a mantissa of 52 bits.
> ++     * 1) For all inputs -0.5 <= x <= INT_MAX
> ++     *    Once the offset is applied, the most significant binary digit in the
> ++     *    floating-point representation is +2^31.
> ++     *    At this magnitude, the smallest step representable in double precision
> ++     *    is 2^31 / 2^52 = 0.000000476837158203125
> ++     *    So the size of the range which is rounded up due to the addition is
> ++     *    half the size of this step, or 0.0000002384185791015625
> ++     *
> ++     * 2) For all inputs INT_MIN/2 < x < -0.5
> ++     *    Once the offset is applied, the most significant binary digit in the
> ++     *    floating-point representation is +2^30.
> ++     *    At this magnitude, the smallest step representable in double precision
> ++     *    is 2^30 / 2^52 = 0.0000002384185791015625
> ++     *    So the size of the range which is rounded up due to the addition is
> ++     *    half the size of this step, or 0.00000011920928955078125
> ++     *
> ++     * 3) For all inputs INT_MIN <= x <= INT_MIN/2
> ++     *    The representation once the offset is applied has equal or greater
> ++     *    precision than the input, so the addition does not cause rounding.
> ++     */
> ++    return ((unsigned int) (x + 0x80000000.8p0)) - 0x80000000;
> + 
> +-    __asm__ __volatile__ (
> +-#if defined(__ARM_PCS_VFP)
> +-      "fconstd d1,#%G[rnd_val]     \n\t" // Copy round_to_nearest into a working register (d1 = 0.5)
> + #else
> +-      "vmov.F64 d1,%[rnd_val]      \n\t"
> +-#endif
> +-      "fcmpezd %P[value]           \n\t" // Check value against zero (value == 0?)
> +-      "fmstat                      \n\t" // Copy the floating-point status flags into the general-purpose status flags
> +-      "it mi                       \n\t"
> +-      "vnegmi.F64 d1, d1           \n\t" // if N-flag is set, negate round_to_nearest (if (value < 0) d1 = -1 * d1)
> +-      "vadd.F64 d1,%P[value],d1    \n\t" // Add round_to_nearest to value, store result in working register (d1 += value)
> +-      "vcvt.S32.F64 s3,d1          \n\t" // Truncate(round towards zero) (s3 = (int)d1)
> +-      "vmov %[result],s3           \n\t" // Store the integer result in a general-purpose register (result = s3)
> +-      "vcvt.F64.S32 d1,s3          \n\t" // Convert back to floating-point (d1 = (double)s3)
> +-      "vsub.F64 d1,%P[value],d1    \n\t" // Calculate the error (d1 = value - d1)
> +-#if defined(__ARM_PCS_VFP)
> +-      "fconstd d2,#%G[rnd_val]     \n\t" // d2 = 0.5;
> +-#else
> +-      "vmov.F64 d2,%[rnd_val]      \n\t"
> +-#endif
> +-      "fcmped d1, d2               \n\t" // (d1 == 0.5?)
> +-      "fmstat                      \n\t" // Copy the floating-point status flags into the general-purpose status flags
> +-      "it eq                       \n\t"
> +-      "addeq %[result],#1          \n\t" // (if (d1 == d2) result++;)
> +-      : [result] "=r"(i)                                  // Outputs
> +-      : [rnd_val] "Dv" (round_to_nearest), [value] "w"(x) // Inputs
> +-      : "d1", "d2", "s3"                                  // Clobbers
> +-    );
> +-
> +-#elif defined(__SSE2__)
> ++    const float round_to_nearest = 0.5f;
> ++    int i;
> ++#if defined(__SSE2__)
> +     const float round_dn_to_nearest = 0.4999999f;
> +     i = (x > 0) ? _mm_cvttsd_si32(_mm_set_sd(x + round_to_nearest)) : _mm_cvttsd_si32(_mm_set_sd(x - round_dn_to_nearest));
> + 
> +@@ -150,8 +149,8 @@
> +     );
> + 
> + #endif
> +-
> +     return i;
> ++#endif
> +   }
> + 
> +   /*! \brief Truncate to nearest integer.
> +@@ -165,20 +164,13 @@
> +   {
> +     assert(x > static_cast<double>(INT_MIN / 2) - 1.0);
> +     assert(x < static_cast<double>(INT_MAX / 2) + 1.0);
> +-    int i;
> + 
> + #if defined(DISABLE_MATHUTILS_ASM_TRUNCATE_INT)
> +-    return i = (int)x;
> +-
> +-#elif defined(__arm__)
> +-    __asm__ __volatile__ (
> +-      "vcvt.S32.F64 %[result],%P[value]   \n\t" // Truncate(round towards zero) and store the result
> +-      : [result] "=w"(i)                        // Outputs
> +-      : [value] "w"(x)                          // Inputs
> +-    );
> +-    return i;
> ++    return x;
> + 
> +-#elif defined(TARGET_WINDOWS)
> ++#else
> ++    int i;
> ++#if defined(TARGET_WINDOWS)
> +     const float round_towards_m_i = -0.5f;
> +     __asm
> +     {
> +@@ -204,6 +196,7 @@
> +     if (x < 0)
> +       i = -i;
> +     return (i);
> ++#endif
> +   }
> + 
> +   inline int64_t abs(int64_t a)
> +-- 
> +1.9.1
> +
> -- 
> 1.7.10.4
> 
> _______________________________________________
> buildroot mailing list
> buildroot at busybox.net
> http://lists.busybox.net/mailman/listinfo/buildroot

-- 
.-----------------.--------------------.------------------.--------------------.
|  Yann E. MORIN  | Real-Time Embedded | /"\ ASCII RIBBON | Erics' conspiracy: |
| +33 662 376 056 | Software  Designer | \ / CAMPAIGN     |  ___               |
| +33 223 225 172 `------------.-------:  X  AGAINST      |  \e/  There is no  |
| http://ymorin.is-a-geek.org/ | _/*\_ | / \ HTML MAIL    |   v   conspiracy.  |
'------------------------------^-------^------------------^--------------------'

  reply	other threads:[~2014-05-17 20:40 UTC|newest]

Thread overview: 68+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-05-17 15:57 [Buildroot] [PATCH v8 00/28] xbmc: bump version to 13.0-Gotham Bernd Kuhls
2014-05-17 15:57 ` [Buildroot] [PATCH v8 01/28] xproto_dri3proto: New package Bernd Kuhls
2014-05-17 15:57 ` [Buildroot] [PATCH v8 02/28] mesa3d: Bump version to 10.2-rc3 Bernd Kuhls
2014-05-17 15:57 ` [Buildroot] [PATCH v8 03/28] mesa3d: Depend on xorg meta package instead of xserver_xorg-server Bernd Kuhls
2014-05-17 19:56   ` Yann E. MORIN
2014-05-17 20:50     ` Bernd Kuhls
2014-05-17 21:07       ` Yann E. MORIN
2014-05-17 15:57 ` [Buildroot] [PATCH v8 04/28] mesa3d: add dependency xproto_presentproto Bernd Kuhls
2014-05-17 15:57 ` [Buildroot] [PATCH v8 05/28] mesa3d: Remove dependency for the libxml2 module of host-python Bernd Kuhls
2014-05-17 15:57 ` [Buildroot] [PATCH v8 06/28] mesa3d: Add dri3 support Bernd Kuhls
2014-05-17 15:57 ` [Buildroot] [PATCH v8 07/28] mesa3d: dri2 does not need udev support Bernd Kuhls
2014-05-17 15:57 ` [Buildroot] [PATCH v8 08/28] libva: new package Bernd Kuhls
2014-05-17 15:57 ` [Buildroot] [PATCH v8 09/28] libva-intel-driver: " Bernd Kuhls
2014-05-17 15:57 ` [Buildroot] [PATCH v8 10/28] ffmpeg: Add libva support Bernd Kuhls
2014-05-17 15:57 ` [Buildroot] [PATCH v8 11/28] libglu: new package Bernd Kuhls
2014-05-17 15:57 ` [Buildroot] [PATCH v8 12/28] libglew: " Bernd Kuhls
2014-05-17 15:57 ` [Buildroot] [PATCH v8 13/28] sdl: Add new dependency libglu for opengl support Bernd Kuhls
2014-05-17 20:00   ` Yann E. MORIN
2014-05-17 15:57 ` [Buildroot] [PATCH v8 14/28] xdriver_xf86-video-intel: Bump version to 2.99.911 Bernd Kuhls
2014-05-17 20:06   ` Yann E. MORIN
2014-05-17 20:51     ` Bernd Kuhls
2014-05-17 21:09       ` Yann E. MORIN
2014-05-17 21:17         ` Bernd Kuhls
2014-05-17 15:57 ` [Buildroot] [PATCH v8 15/28] rtmpdump: Add KSV patch Bernd Kuhls
2014-05-17 20:11   ` Yann E. MORIN
2014-05-17 21:15     ` Bernd Kuhls
2014-05-17 15:57 ` [Buildroot] [PATCH v8 16/28] xbmc: bump version to 13.0 Bernd Kuhls
2014-05-18 16:54   ` Bernd Kuhls
2014-05-17 15:57 ` [Buildroot] [PATCH v8 17/28] xbmc-pvr-addons: Version bump to xbmc Gotham-compatible addon Bernd Kuhls
2014-05-17 20:15   ` Yann E. MORIN
2014-05-17 20:51     ` Bernd Kuhls
2014-05-17 15:57 ` [Buildroot] [PATCH v8 18/28] xbmc-addon-xvdr: " Bernd Kuhls
2014-05-17 20:16   ` Yann E. MORIN
2014-05-17 20:52     ` Bernd Kuhls
2014-05-17 15:57 ` [Buildroot] [PATCH v8 19/28] xbmc: Add host-gettext dependency Bernd Kuhls
2014-05-17 20:29   ` Yann E. MORIN
2014-05-17 20:52     ` Bernd Kuhls
2014-05-17 15:57 ` [Buildroot] [PATCH v8 20/28] xbmc: Allow compilation with uClibc Bernd Kuhls
2014-05-17 20:40   ` Yann E. MORIN [this message]
2014-05-17 20:47     ` Bernd Kuhls
2014-05-17 20:56       ` Yann E. MORIN
2014-05-17 15:57 ` [Buildroot] [PATCH v8 21/28] xbmc: Add X.org/OpenGL support Bernd Kuhls
2014-05-17 20:55   ` Yann E. MORIN
2014-05-17 21:01     ` Bernd Kuhls
2014-05-17 21:17       ` Yann E. MORIN
2014-05-18 11:58     ` Bernd Kuhls
2014-05-18 16:29       ` Yann E. MORIN
2014-05-18 16:52         ` Bernd Kuhls
2014-05-18 17:07           ` Yann E. MORIN
2014-05-18 16:58         ` Bernd Kuhls
2014-05-18 17:29           ` Yann E. MORIN
2014-05-18 17:40             ` Bernd Kuhls
2014-05-20 16:33             ` Arnout Vandecappelle
2014-05-20 16:49               ` Yann E. MORIN
2014-05-20 21:10                 ` Peter Korsgaard
2014-05-20 23:16                 ` Arnout Vandecappelle
2014-05-21  7:39                   ` Bernd Kuhls
2014-05-17 15:57 ` [Buildroot] [PATCH v8 22/28] xbmc: Add VA-API support Bernd Kuhls
2014-05-17 21:01   ` Yann E. MORIN
2014-05-17 15:57 ` [Buildroot] [PATCH v8 23/28] xbmc: Add alsa support Bernd Kuhls
2014-05-17 15:57 ` [Buildroot] [PATCH v8 24/28] xbmc: Add lame support Bernd Kuhls
2014-05-17 15:57 ` [Buildroot] [PATCH v8 25/28] xbmc: Disable broken rsxs screensaver Bernd Kuhls
2014-05-17 15:57 ` [Buildroot] [PATCH v8 26/28] xbmc: Add option for Goom screensaver Bernd Kuhls
2014-05-17 21:04   ` Yann E. MORIN
2014-05-17 15:57 ` [Buildroot] [PATCH v8 27/28] xbmc: add nasm/yasm dependency Bernd Kuhls
2014-05-17 21:06   ` Yann E. MORIN
2014-05-17 15:57 ` [Buildroot] [PATCH v8 28/28] xbmc: Fix TexturePacker compile Bernd Kuhls
2014-05-17 21:13   ` Yann E. MORIN

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=20140517204050.GK3459@free.fr \
    --to=yann.morin.1998@free.fr \
    --cc=buildroot@busybox.net \
    /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.