[Mesa-dev] [PATCH 2/4] gallium: Enable ARM NEON CPU detection.

Erik Faye-Lund kusmabite at gmail.com
Mon May 1 22:53:16 UTC 2017


On Mon, Apr 24, 2017 at 11:59 PM, Eric Anholt <eric at anholt.net> wrote:
> I wrote this code with reference to pixman, though I've only decided to
> cover Linux (what I'm testing) and Android (seems obvious enough).  Linux
> has getauxval() as a cleaner interface to the /proc entry, but it's more
> glibc-specific and I didn't want to add detection for that.
>
> This will be used to enable NEON at runtime on ARMv6 builds of vc4.
>
> v2: Actually initialize the temp vars in the Android path (noticed by
>     daniels)
> v3: Actually pull in the cpufeatures library (change by robher).
>     Use O_CLOEXEC.  Break out of the loop when we find our feature.
> v4: Drop VFP code, which was confused about what it was detecting and not
>     actually used yet.
> ---
>  src/gallium/auxiliary/Android.mk          |  2 ++
>  src/gallium/auxiliary/util/u_cpu_detect.c | 43 +++++++++++++++++++++++++++++++
>  src/gallium/auxiliary/util/u_cpu_detect.h |  1 +
>  3 files changed, 46 insertions(+)
>
> diff --git a/src/gallium/auxiliary/Android.mk b/src/gallium/auxiliary/Android.mk
> index e8628e43744a..4f6f71bbf6a9 100644
> --- a/src/gallium/auxiliary/Android.mk
> +++ b/src/gallium/auxiliary/Android.mk
> @@ -48,6 +48,8 @@ endif
>  LOCAL_MODULE := libmesa_gallium
>  LOCAL_STATIC_LIBRARIES += libmesa_nir
>
> +LOCAL_WHOLE_STATIC_LIBRARIES += cpufeatures
> +
>  # generate sources
>  LOCAL_MODULE_CLASS := STATIC_LIBRARIES
>  intermediates := $(call local-generated-sources-dir)
> diff --git a/src/gallium/auxiliary/util/u_cpu_detect.c b/src/gallium/auxiliary/util/u_cpu_detect.c
> index 845fc6b34d5c..76115bf8d55d 100644
> --- a/src/gallium/auxiliary/util/u_cpu_detect.c
> +++ b/src/gallium/auxiliary/util/u_cpu_detect.c
> @@ -59,12 +59,18 @@
>
>  #if defined(PIPE_OS_LINUX)
>  #include <signal.h>
> +#include <fcntl.h>
> +#include <elf.h>
>  #endif
>
>  #ifdef PIPE_OS_UNIX
>  #include <unistd.h>
>  #endif
>
> +#if defined(PIPE_OS_ANDROID)
> +#include <cpu-features.h>
> +#endif
> +
>  #if defined(PIPE_OS_WINDOWS)
>  #include <windows.h>
>  #if defined(PIPE_CC_MSVC)
> @@ -294,6 +300,38 @@ PIPE_ALIGN_STACK static inline boolean sse2_has_daz(void)
>
>  #endif /* X86 or X86_64 */
>
> +#if defined(PIPE_ARCH_ARM)
> +static void
> +check_os_arm_support(void)
> +{
> +#if defined(PIPE_OS_ANDROID)
> +   AndroidCpuFamily cpu_family = android_getCpuFamily();
> +   uint64_t cpu_features = android_getCpuFeatures();
> +
> +   if (cpu_family == ANDROID_CPU_FAMILY_ARM) {

I don't think this is strictly speaking necessary... this function is
already guarded by PIPE_ARCH_ARM, which shouldn't be set on AArch64
(or other architectures for that matter)...


More information about the mesa-dev mailing list