On Fri, Apr 14, 2017 at 12:08 AM, Eric Anholt <e...@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. > But now you have to worry about running out of file descriptors and forking. Mesa already does checks like #if defined(__GLIBC__) && ((__GLIBC__ > 2) || ((__GLIBC__ == 2) && (__GLIBC_MINOR__ >= 19))) but it's up to you I guess. > 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) > --- > src/gallium/auxiliary/util/u_cpu_detect.c | 46 > +++++++++++++++++++++++++++++++ > src/gallium/auxiliary/util/u_cpu_detect.h | 2 ++ > 2 files changed, 48 insertions(+) > > diff --git a/src/gallium/auxiliary/util/u_cpu_detect.c > b/src/gallium/auxiliary/util/u_cpu_detect.c > index 845fc6b34d5c..c9083fed63af 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,40 @@ 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) { > + if (cpu_features & ANDROID_CPU_ARM_FEATURE_VFPv3) > + util_cpu_caps.has_vfp = 1; > + if (cpu_features & ANDROID_CPU_ARM_FEATURE_NEON) > + util_cpu_caps.has_neon = 1; > + } > +#elif defined(PIPE_OS_LINUX) > + Elf32_auxv_t aux; > + int fd; > + > + fd = open("/proc/self/auxv", O_RDONLY); > O_CLOEXEC? > + if (fd >= 0) { > + while (read(fd, &aux, sizeof(Elf32_auxv_t)) == > sizeof(Elf32_auxv_t)) { > + if (aux.a_type == AT_HWCAP) { > + uint32_t hwcap = aux.a_un.a_val; > + > + util_cpu_caps.has_vfp = (hwcap >> 6) & 1; > + util_cpu_caps.has_neon = (hwcap >> 12) & 1; > break; > + } > + } > + close (fd); > + } > +#endif /* PIPE_OS_LINUX */ > +} > +#endif /* PIPE_ARCH_ARM */ > + > GraÅžvydas
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev