Commit b830aae4 authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

Check for ARM NEON at build-time if possible

parent 6def94fd
...@@ -1330,7 +1330,6 @@ asm volatile("ssat r0, #1, r0":::"r0"); /* assume ARMv6 */ ...@@ -1330,7 +1330,6 @@ asm volatile("ssat r0, #1, r0":::"r0"); /* assume ARMv6 */
VLC_RESTORE_FLAGS VLC_RESTORE_FLAGS
AS_IF([test "$ac_cv_neon_inline" != "no"], [ AS_IF([test "$ac_cv_neon_inline" != "no"], [
NEON_CFLAGS="$ac_cv_neon_inline" NEON_CFLAGS="$ac_cv_neon_inline"
AC_DEFINE([CAN_COMPILE_NEON], 1, [Define to 1 if NEON (and ARMv6) assembly is available with NEON_CFLAGS.])
]) ])
], [ ], [
ac_cv_neon_inline="no" ac_cv_neon_inline="no"
......
...@@ -67,7 +67,13 @@ VLC_API unsigned vlc_CPU(void); ...@@ -67,7 +67,13 @@ VLC_API unsigned vlc_CPU(void);
# else # else
# define HAVE_FPU 0 # define HAVE_FPU 0
# endif # endif
# define CPU_CAPABILITY_NEON (1<<24) # define VLC_CPU_ARM_NEON 2
# ifdef __ARM_NEON__
# define vlc_CPU_ARM_NEON() (1)
# else
# define vlc_CPU_ARM_NEON() ((vlc_CPU() & VLC_CPU_ARM_NEON) != 0)
# endif
# elif defined (__sparc__) # elif defined (__sparc__)
# define HAVE_FPU 1 # define HAVE_FPU 1
......
...@@ -45,7 +45,7 @@ static int Open (vlc_object_t *obj) ...@@ -45,7 +45,7 @@ static int Open (vlc_object_t *obj)
{ {
filter_t *filter = (filter_t *)obj; filter_t *filter = (filter_t *)obj;
if (!(vlc_CPU() & CPU_CAPABILITY_NEON)) if (!vlc_CPU_ARM_NEON())
return VLC_EGENERIC; return VLC_EGENERIC;
if (!AOUT_FMTS_SIMILAR (&filter->fmt_in.audio, &filter->fmt_out.audio)) if (!AOUT_FMTS_SIMILAR (&filter->fmt_in.audio, &filter->fmt_out.audio))
return VLC_EGENERIC; return VLC_EGENERIC;
......
...@@ -162,7 +162,7 @@ static int Open (vlc_object_t *obj) ...@@ -162,7 +162,7 @@ static int Open (vlc_object_t *obj)
{ {
filter_t *filter = (filter_t *)obj; filter_t *filter = (filter_t *)obj;
if (!(vlc_CPU() & CPU_CAPABILITY_NEON)) if (!vlc_CPU_ARM_NEON())
return VLC_EGENERIC; return VLC_EGENERIC;
if ((filter->fmt_in.video.i_width != filter->fmt_out.video.i_width) if ((filter->fmt_in.video.i_width != filter->fmt_out.video.i_width)
|| (filter->fmt_in.video.i_height != filter->fmt_out.video.i_height)) || (filter->fmt_in.video.i_height != filter->fmt_out.video.i_height))
......
...@@ -125,7 +125,7 @@ static int Open (vlc_object_t *obj) ...@@ -125,7 +125,7 @@ static int Open (vlc_object_t *obj)
{ {
filter_t *filter = (filter_t *)obj; filter_t *filter = (filter_t *)obj;
if (!(vlc_CPU() & CPU_CAPABILITY_NEON)) if (!vlc_CPU_ARM_NEON())
return VLC_EGENERIC; return VLC_EGENERIC;
if (((filter->fmt_in.video.i_width | filter->fmt_in.video.i_height) & 1) if (((filter->fmt_in.video.i_width | filter->fmt_in.video.i_height) & 1)
......
...@@ -208,7 +208,7 @@ static int OpenDecoder( vlc_object_t *p_this ) ...@@ -208,7 +208,7 @@ static int OpenDecoder( vlc_object_t *p_this )
i_accel |= MPEG2_ACCEL_ARM; i_accel |= MPEG2_ACCEL_ARM;
# endif # endif
# ifdef MPEG2_ACCEL_ARM_NEON # ifdef MPEG2_ACCEL_ARM_NEON
if( vlc_CPU() & CPU_CAPABILITY_NEON ) if( vlc_CPU_ARM_NEON() )
i_accel |= MPEG2_ACCEL_ARM_NEON; i_accel |= MPEG2_ACCEL_ARM_NEON;
# endif # endif
......
...@@ -660,7 +660,7 @@ int Open( vlc_object_t *p_this ) ...@@ -660,7 +660,7 @@ int Open( vlc_object_t *p_this )
else else
#endif #endif
#if defined __ARM_NEON__ // FIXME: runtime detect support #if defined __ARM_NEON__ // FIXME: runtime detect support
if( chroma->pixel_size == 1 && (vlc_CPU() & CPU_CAPABILITY_NEON) ) if( chroma->pixel_size == 1 && vlc_CPU_ARM_NEON() )
{ {
p_sys->pf_merge = MergeNEON; p_sys->pf_merge = MergeNEON;
p_sys->pf_end_merge = NULL; p_sys->pf_end_merge = NULL;
......
...@@ -317,14 +317,11 @@ out: ...@@ -317,14 +317,11 @@ out:
# endif # endif
#elif defined ( __arm__) #elif defined ( __arm__)
#ifdef __ARM_NEON__ # ifdef __ANDROID__
i_capabilities |= CPU_CAPABILITY_NEON; if (android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_NEON)
#elif defined (CAN_COMPILE_NEON) i_capabilities |= VLC_CPU_ARM_NEON;
#ifdef __ANDROID__ # endif
if (android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_NEON)
i_capabilities |= CPU_CAPABILITY_NEON;
#endif
#endif
#endif #endif
cpu_flags = i_capabilities; cpu_flags = i_capabilities;
...@@ -347,14 +344,14 @@ unsigned vlc_CPU (void) ...@@ -347,14 +344,14 @@ unsigned vlc_CPU (void)
void vlc_CPU_dump (vlc_object_t *obj) void vlc_CPU_dump (vlc_object_t *obj)
{ {
const unsigned flags = vlc_CPU();
char buf[200], *p = buf; char buf[200], *p = buf;
#if defined (__i386__) || defined (__x86_64__)
const unsigned flags = vlc_CPU();
#define PRINT_CAPABILITY( capability, string ) \ #define PRINT_CAPABILITY( capability, string ) \
if (flags & (capability)) \ if (flags & (capability)) \
p += sprintf (p, "%s ", (string) ) p += sprintf (p, "%s ", (string) )
#if defined (__i386__) || defined (__x86_64__)
PRINT_CAPABILITY(CPU_CAPABILITY_MMX, "MMX"); PRINT_CAPABILITY(CPU_CAPABILITY_MMX, "MMX");
PRINT_CAPABILITY(CPU_CAPABILITY_3DNOW, "3DNow!"); PRINT_CAPABILITY(CPU_CAPABILITY_3DNOW, "3DNow!");
PRINT_CAPABILITY(CPU_CAPABILITY_MMXEXT, "MMXEXT"); PRINT_CAPABILITY(CPU_CAPABILITY_MMXEXT, "MMXEXT");
...@@ -367,13 +364,11 @@ void vlc_CPU_dump (vlc_object_t *obj) ...@@ -367,13 +364,11 @@ void vlc_CPU_dump (vlc_object_t *obj)
PRINT_CAPABILITY(CPU_CAPABILITY_SSE4A, "SSE4A"); PRINT_CAPABILITY(CPU_CAPABILITY_SSE4A, "SSE4A");
#elif defined (__powerpc__) || defined (__ppc__) || defined (__ppc64__) #elif defined (__powerpc__) || defined (__ppc__) || defined (__ppc64__)
PRINT_CAPABILITY(CPU_CAPABILITY_ALTIVEC, "AltiVec"); if (vlc_CPU() & CPU_CAPABILITY_ALTIVEC)
p += sprintf (p, "AltiVec");
#elif defined (__arm__) #elif defined (__arm__)
PRINT_CAPABILITY(CPU_CAPABILITY_NEON, "NEONv1"); if (vlc_CPU_ARM_NEON()) p += sprintf (p, "ARM_NEON ");
#else
(void) flags;
#endif #endif
......
...@@ -63,10 +63,8 @@ static void vlc_CPU_init (void) ...@@ -63,10 +63,8 @@ static void vlc_CPU_init (void)
while ((cap = strsep (&p, " ")) != NULL) while ((cap = strsep (&p, " ")) != NULL)
{ {
#if defined (__arm__) #if defined (__arm__)
# ifndef __ARM_NEON__
if (!strcmp (cap, "neon")) if (!strcmp (cap, "neon"))
core_caps |= CPU_CAPABILITY_NEON; core_caps |= VLC_CPU_ARM_NEON;
# endif
#elif defined (__i386__) || defined (__x86_64__) #elif defined (__i386__) || defined (__x86_64__)
# ifndef __MMX__ # ifndef __MMX__
...@@ -122,12 +120,7 @@ static void vlc_CPU_init (void) ...@@ -122,12 +120,7 @@ static void vlc_CPU_init (void)
all_caps = 0; /* Do not assume any capability! */ all_caps = 0; /* Do not assume any capability! */
/* Always enable capabilities that were forced during compilation */ /* Always enable capabilities that were forced during compilation */
#if defined (__arm__) #if defined (__i386__) || defined (__x86_64__)
# ifdef __ARM_NEON__
all_caps |= CPU_CAPABILITY_NEON;
# endif
#elif defined (__i386__) || defined (__x86_64__)
# ifdef __MMX__ # ifdef __MMX__
all_caps |= CPU_CAPABILITY_MMX; all_caps |= CPU_CAPABILITY_MMX;
# endif # endif
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment