diff options
author | Chris Robinson <[email protected]> | 2016-09-07 09:57:40 -0700 |
---|---|---|
committer | Chris Robinson <[email protected]> | 2016-09-07 09:57:40 -0700 |
commit | a52cfc804813aef8e4b304e20cf843fa6907af6c (patch) | |
tree | 751b81671a8cdbd43a4a6294d70e90624832b6dc | |
parent | ef67d17a842a315eac3ef863edc8682a5c033032 (diff) |
Check for run-time NEON support by reading /proc/cpuinfo
Less than ideal since documentations warn it may not list 'neon' even if it's
really supported. However, the "proper" APIs to check for NEON extensions don't
seem to exist in my toolchain.
-rw-r--r-- | Alc/helpers.c | 34 |
1 files changed, 32 insertions, 2 deletions
diff --git a/Alc/helpers.c b/Alc/helpers.c index 9b6c7894..4ffda46c 100644 --- a/Alc/helpers.c +++ b/Alc/helpers.c @@ -32,6 +32,7 @@ #include <time.h> #include <errno.h> #include <stdarg.h> +#include <ctype.h> #ifdef HAVE_MALLOC_H #include <malloc.h> #endif @@ -232,8 +233,37 @@ void FillCPUCaps(ALuint capfilter) #endif #endif #ifdef HAVE_NEON - /* Assume Neon support if compiled with it */ - caps |= CPU_CAP_NEON; + FILE *file = fopen("/proc/cpuinfo", "rt"); + if(file) + ERR("Failed to open /proc/cpuinfo, cannot check for NEON support\n"); + else + { + char buf[256]; + while(fgets(buf, sizeof(buf), file) != NULL) + { + char *str; + + if(strncmp(buf, "Features\t:", 10) != 0) + continue; + + TRACE("Got features string:%s\n", buf+10); + + str = buf; + while((str=strstr(str, "neon")) != NULL) + { + if(isspace(*(str-1)) && (str[4] == 0 || isspace(str[4]))) + { + caps |= CPU_CAP_NEON; + break; + } + str++; + } + break; + } + + fclose(file); + file = NULL; + } #endif TRACE("Extensions:%s%s%s%s%s%s\n", |