Browse Source

Build for 64-bit ARM by default when compiling or exporting for Android

All Android devices that support Vulkan support 64-bit ARM.

This also removes NEON opt-out code for ARMv7 as pretty much all
ARMv7 devices also support NEON.
Hugo Locurcio 3 years ago
parent
commit
b1b14e5fd7
3 changed files with 13 additions and 21 deletions
  1. 2 1
      drivers/png/SCsub
  2. 6 17
      platform/android/detect.py
  3. 5 3
      platform/android/export/export_plugin.cpp

+ 2 - 1
drivers/png/SCsub

@@ -36,7 +36,8 @@ if env["builtin_libpng"]:
     # Currently .ASM filter_neon.S does not compile on NT.
     import os
 
-    use_neon = "neon_enabled" in env and env["neon_enabled"] and os.name != "nt"
+    # Enable ARM NEON instructions on 32-bit Android to compile more optimized code.
+    use_neon = "android_arch" in env and env["android_arch"] == "armv7" and os.name != "nt"
     if use_neon:
         env_png.Append(CPPDEFINES=[("PNG_ARM_NEON_OPT", 2)])
     else:

+ 6 - 17
platform/android/detect.py

@@ -27,8 +27,7 @@ def get_opts():
         ("ANDROID_NDK_ROOT", "Path to the Android NDK", get_android_ndk_root()),
         ("ANDROID_SDK_ROOT", "Path to the Android SDK", get_android_sdk_root()),
         ("ndk_platform", 'Target platform (android-<api>, e.g. "android-24")', "android-24"),
-        EnumVariable("android_arch", "Target architecture", "armv7", ("armv7", "arm64v8", "x86", "x86_64")),
-        BoolVariable("android_neon", "Enable NEON support (armv7 only)", True),
+        EnumVariable("android_arch", "Target architecture", "arm64v8", ("armv7", "arm64v8", "x86", "x86_64")),
     ]
 
 
@@ -143,10 +142,7 @@ def configure(env):
     if env["android_arch"] not in ["armv7", "arm64v8", "x86", "x86_64"]:
         env["android_arch"] = "armv7"
 
-    neon_text = ""
-    if env["android_arch"] == "armv7" and env["android_neon"]:
-        neon_text = " (with NEON)"
-    print("Building for Android, platform " + env["ndk_platform"] + " (" + env["android_arch"] + ")" + neon_text)
+    print("Building for Android, platform " + env["ndk_platform"] + " (" + env["android_arch"] + ")")
 
     can_vectorize = True
     if env["android_arch"] == "x86":
@@ -174,10 +170,7 @@ def configure(env):
         target_subpath = "arm-linux-androideabi-4.9"
         abi_subpath = "arm-linux-androideabi"
         arch_subpath = "armeabi-v7a"
-        if env["android_neon"]:
-            env.extra_suffix = ".armv7.neon" + env.extra_suffix
-        else:
-            env.extra_suffix = ".armv7" + env.extra_suffix
+        env.extra_suffix = ".armv7" + env.extra_suffix
     elif env["android_arch"] == "arm64v8":
         if get_platform(env["ndk_platform"]) < 21:
             print(
@@ -288,7 +281,6 @@ def configure(env):
     if get_platform(env["ndk_platform"]) >= 24:
         env.Append(CPPDEFINES=[("_FILE_OFFSET_BITS", 64)])
 
-    env["neon_enabled"] = False
     if env["android_arch"] == "x86":
         target_opts = ["-target", "i686-none-linux-android"]
         # The NDK adds this if targeting API < 21, so we can drop it when Godot targets it at least
@@ -301,12 +293,9 @@ def configure(env):
         target_opts = ["-target", "armv7-none-linux-androideabi"]
         env.Append(CCFLAGS="-march=armv7-a -mfloat-abi=softfp".split())
         env.Append(CPPDEFINES=["__ARM_ARCH_7__", "__ARM_ARCH_7A__"])
-        if env["android_neon"]:
-            env["neon_enabled"] = True
-            env.Append(CCFLAGS=["-mfpu=neon"])
-            env.Append(CPPDEFINES=["__ARM_NEON__"])
-        else:
-            env.Append(CCFLAGS=["-mfpu=vfpv3-d16"])
+        # Enable ARM NEON instructions to compile more optimized code.
+        env.Append(CCFLAGS=["-mfpu=neon"])
+        env.Append(CPPDEFINES=["__ARM_NEON__"])
 
     elif env["android_arch"] == "arm64v8":
         target_opts = ["-target", "aarch64-none-linux-android"]

+ 5 - 3
platform/android/export/export_plugin.cpp

@@ -1644,10 +1644,12 @@ void EditorExportPlatformAndroid::get_export_options(List<ExportOption> *r_optio
 	}
 	plugins_changed.clear();
 
-	Vector<String> abis = get_abis();
+	const Vector<String> abis = get_abis();
 	for (int i = 0; i < abis.size(); ++i) {
-		String abi = abis[i];
-		bool is_default = (abi == "armeabi-v7a" || abi == "arm64-v8a");
+		const String abi = abis[i];
+		// All Android devices supporting Vulkan run 64-bit Android,
+		// so there is usually no point in exporting for 32-bit Android.
+		const bool is_default = abi == "arm64-v8a";
 		r_options->push_back(ExportOption(PropertyInfo(Variant::BOOL, "architectures/" + abi), is_default));
 	}