[Pixman] [PATCH 1/1] Android Runtime Detection Support For ARM NEON
Bobby Salazar
bobby8934 at gmail.com
Mon Dec 12 14:59:44 PST 2011
Here is a new path. Please let me know what you think.
Index: pixman-cpu.c
===================================================================
--- pixman-cpu.c
+++ pixman-cpu.c
@@ -244,6 +244,43 @@
#endif /* USE_ARM_NEON */
+#elif defined (__linux__) || defined(__ANDROID__) || defined(ANDROID)
/* linux ELF or ANDROID */
+
+static pixman_bool_t arm_has_v7 = FALSE;
+static pixman_bool_t arm_has_v6 = FALSE;
+static pixman_bool_t arm_has_vfp = FALSE;
+static pixman_bool_t arm_has_neon = FALSE;
+static pixman_bool_t arm_has_iwmmxt = FALSE;
+static pixman_bool_t arm_tests_initialized = FALSE;
+
+#if defined(__ANDROID__) || defined(ANDROID) /* Android device support */
+
+#include <cpu-features.h>
+
+static void
+pixman_arm_read_auxv_or_cpu_features ()
+{
+ AndroidCpuFamily cpu_family;
+ uint64_t cpu_features;
+
+ cpu_family = android_getCpuFamily();
+ cpu_features = android_getCpuFeatures();
+
+ if (cpu_family == ANDROID_CPU_FAMILY_ARM)
+ {
+ if (cpu_features & ANDROID_CPU_ARM_FEATURE_ARMv7)
+ arm_has_v7 = TRUE;
+
+ if (cpu_features & ANDROID_CPU_ARM_FEATURE_VFPv3)
+ arm_has_vfp = TRUE;
+
+ if (cpu_features & ANDROID_CPU_ARM_FEATURE_NEON)
+ arm_has_neon = TRUE;
+ }
+
+ arm_tests_initialized = TRUE;
+}
+
#elif defined (__linux__) /* linux ELF */
#include <stdlib.h>
@@ -255,15 +292,8 @@
#include <string.h>
#include <elf.h>
-static pixman_bool_t arm_has_v7 = FALSE;
-static pixman_bool_t arm_has_v6 = FALSE;
-static pixman_bool_t arm_has_vfp = FALSE;
-static pixman_bool_t arm_has_neon = FALSE;
-static pixman_bool_t arm_has_iwmmxt = FALSE;
-static pixman_bool_t arm_tests_initialized = FALSE;
-
static void
-pixman_arm_read_auxv ()
+pixman_arm_read_auxv_or_cpu_features ()
{
int fd;
Elf32_auxv_t aux;
@@ -304,12 +334,14 @@
arm_tests_initialized = TRUE;
}
+#endif /* Linux elf */
+
#if defined(USE_ARM_SIMD)
pixman_bool_t
pixman_have_arm_simd (void)
{
if (!arm_tests_initialized)
- pixman_arm_read_auxv ();
+ pixman_arm_read_auxv_or_cpu_features ();
return arm_has_v6;
}
@@ -321,7 +353,7 @@
pixman_have_arm_neon (void)
{
if (!arm_tests_initialized)
- pixman_arm_read_auxv ();
+ pixman_arm_read_auxv_or_cpu_features ();
return arm_has_neon;
}
@@ -333,14 +365,14 @@
pixman_have_arm_iwmmxt (void)
{
if (!arm_tests_initialized)
- pixman_arm_read_auxv ();
+ pixman_arm_read_auxv_or_cpu_features ();
return arm_has_iwmmxt;
}
#endif /* USE_ARM_IWMMXT */
-#else /* linux ELF */
+#else /* !_MSC_VER && !Linux elf && !Android */
#define pixman_have_arm_simd() FALSE
#define pixman_have_arm_neon() FALSE
More information about the Pixman
mailing list