diff options
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/SkCpu.cpp | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/src/core/SkCpu.cpp b/src/core/SkCpu.cpp index 28bdf6936d..1ae6723983 100644 --- a/src/core/SkCpu.cpp +++ b/src/core/SkCpu.cpp @@ -8,6 +8,10 @@ #include "SkCpu.h" #include "SkOnce.h" +#if !defined(__has_include) + #define __has_include(x) 0 +#endif + #if defined(SK_CPU_X86) #if defined(SK_BUILD_FOR_WIN32) #include <intrin.h> @@ -69,6 +73,32 @@ return features; } +#elif defined(SK_CPU_ARM32) && defined(SK_BUILD_FOR_ANDROID) && \ + __has_include(<asm/hwcap.h>) && __has_include(<sys/auxv.h>) + // asm/hwcap.h and sys/auxv.h won't be present on builds targeting NDK APIs before 21. + #include <asm/hwcap.h> + #include <sys/auxv.h> + + static uint32_t read_cpu_features() { + uint32_t features = 0; + uint32_t hwcaps = getauxval(AT_HWCAP); + if (hwcaps & HWCAP_VFPv4) { features |= SkCpu::NEON|SkCpu::NEON_FMA|SkCpu::VFP_FP16; } + return features; + } + +#elif defined(SK_CPU_ARM32) && defined(SK_BUILD_FOR_ANDROID) && \ + !defined(SK_BUILD_FOR_ANDROID_FRAMEWORK) + #include <cpu-features.h> + + static uint32_t read_cpu_features() { + uint32_t features = 0; + uint64_t cpu_features = android_getCpuFeatures(); + if (cpu_features & ANDROID_CPU_ARM_FEATURE_NEON) { features |= SkCpu::NEON; } + if (cpu_features & ANDROID_CPU_ARM_FEATURE_NEON_FMA) { features |= SkCpu::NEON_FMA; } + if (cpu_features & ANDROID_CPU_ARM_FEATURE_VFP_FP16) { features |= SkCpu::VFP_FP16; } + return features; + } + #else static uint32_t read_cpu_features() { return 0; |