[Pixman] [PATCH 1/1] Android Runtime Detection Support For ARM NEON

Bobby Salazar bobby8934 at gmail.com
Wed Dec 7 14:17:53 PST 2011


This patch adds runtime detection support for the ARM NEON fast paths
for code compiled with the Android NDK. This is the only code change
needed to enable the ARM NEON pixman fast paths for the ever growing
Android platform (200 million+ smartphones, tablets, etc.). Just make
sure to #define USE_ARM_NEON in your makefile.


Index: pixman-cpu.c
===================================================================
--- pixman-cpu.c
+++ pixman-cpu.c
@@ -340,8 +340,83 @@

 #endif /* USE_ARM_IWMMXT */

-#else /* linux ELF */
+#elif defined (ANDROID) /* Android device support */

+#include <cpu-features.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_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;
+}
+
+#if defined(USE_ARM_SIMD)
+pixman_bool_t
+pixman_have_arm_simd (void)
+{
+    if (!arm_tests_initialized)
+	pixman_arm_read_cpu_features ();
+
+    return arm_has_v6;
+}
+
+#endif /* USE_ARM_SIMD */
+
+#if defined(USE_ARM_NEON)
+pixman_bool_t
+pixman_have_arm_neon (void)
+{
+    if (!arm_tests_initialized)
+	pixman_arm_read_cpu_features ();
+
+    return arm_has_neon;
+}
+
+#endif /* USE_ARM_NEON */
+
+#if defined(USE_ARM_IWMMXT)
+pixman_bool_t
+pixman_have_arm_iwmmxt (void)
+{
+    if (!arm_tests_initialized)
+	pixman_arm_read_cpu_features ();
+
+    return arm_has_iwmmxt;
+}
+
+#endif /* USE_ARM_IWMMXT */
+
+#else /* Android device support */
+
 #define pixman_have_arm_simd() FALSE
 #define pixman_have_arm_neon() FALSE
 #define pixman_have_arm_iwmmxt() FALSE


More information about the Pixman mailing list