Skip to content

Commit

Permalink
android: use cpufeatures to support SDL_HasNEON() (thanks, Sylvain!).
Browse files Browse the repository at this point in the history
Fixes Bugzilla #4406.
  • Loading branch information
icculus committed Dec 1, 2018
1 parent 1e4acca commit 3323b35
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 3 deletions.
5 changes: 5 additions & 0 deletions Android.mk
Expand Up @@ -75,6 +75,8 @@ ifeq ($(NDK_DEBUG),1)
cmd-strip :=
endif

LOCAL_STATIC_LIBRARIES := cpufeatures

include $(BUILD_SHARED_LIBRARY)

###########################
Expand Down Expand Up @@ -124,3 +126,6 @@ LOCAL_MODULE := libhidapi
LOCAL_LDLIBS := -llog

include $(BUILD_SHARED_LIBRARY)

$(call import-module,android/cpufeatures)

24 changes: 21 additions & 3 deletions src/cpuinfo/SDL_cpuinfo.c
Expand Up @@ -78,6 +78,12 @@
#endif
#endif

#if defined(__ANDROID__) && defined(__ARM_ARCH) && !defined(HAVE_GETAUXVAL)
#if __ARM_ARCH < 8
#include <cpu-features.h>
#endif
#endif

#define CPU_HAS_RDTSC (1 << 0)
#define CPU_HAS_ALTIVEC (1 << 1)
#define CPU_HAS_MMX (1 << 2)
Expand Down Expand Up @@ -320,7 +326,7 @@ CPU_haveAltiVec(void)
return altivec;
}

#if (defined(__LINUX__) || defined(__ANDROID__)) && defined(__ARM_ARCH) && !defined(HAVE_GETAUXVAL)
#if defined(__LINUX__) && defined(__ARM_ARCH) && !defined(HAVE_GETAUXVAL)
static int
readProcAuxvForNeon(void)
{
Expand Down Expand Up @@ -359,8 +365,20 @@ CPU_haveNEON(void)
return SYSPAGE_ENTRY(cpuinfo)->flags & ARM_CPU_FLAG_NEON;
#elif (defined(__LINUX__) || defined(__ANDROID__)) && defined(HAVE_GETAUXVAL)
return ((getauxval(AT_HWCAP) & HWCAP_NEON) == HWCAP_NEON);
#elif (defined(__LINUX__) || defined(__ANDROID__))
return readProcAuxvForNeon(); /* Android offers a static library for this, but it just parses /proc/self/auxv */
#elif defined(__LINUX__)
return readProcAuxvForNeon();
#elif defined(__ANDROID__)
/* Use NDK cpufeatures to read either /proc/self/auxv or /proc/cpuinfo */
{
AndroidCpuFamily cpu_family = android_getCpuFamily();
if (cpu_family == ANDROID_CPU_FAMILY_ARM) {
uint64_t cpu_features = android_getCpuFeatures();
if ((cpu_features & ANDROID_CPU_ARM_FEATURE_NEON) != 0) {
return 1;
}
}
return 0;
}
#elif (defined(__WINDOWS__) || defined(__WINRT__)) && defined(_M_ARM)
/* All WinRT ARM devices are required to support NEON, but just in case. */
return IsProcessorFeaturePresent(PF_ARM_NEON_INSTRUCTIONS_AVAILABLE) != 0;
Expand Down

0 comments on commit 3323b35

Please sign in to comment.