From 64752781ed56f026df0b7e9384846a3afdc4449b Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Tue, 21 Feb 2023 18:15:22 +0100 Subject: [PATCH] Add arm64 support for macOS --- Source/Editor/Cooker/CookingData.h | 6 ++++++ Source/Editor/Cooker/GameCooker.cpp | 7 ++++++- Source/Editor/Cooker/GameCooker.cs | 1 + .../Cooker/Platform/Mac/MacPlatformTools.cpp | 10 +++++++++- Source/Editor/Cooker/Steps/CompileScriptsStep.cpp | 4 ++++ Source/Editor/Cooker/Steps/CookAssetsStep.cpp | 1 + Source/Editor/Scripting/ScriptsBuilder.cpp | 2 ++ Source/Engine/Platform/Mac/MacDefines.h | 9 ++++++++- Source/FlaxEditor.Build.cs | 1 + Source/Tools/Flax.Build/Build/Platform.cs | 2 +- .../Flax.Build/Platforms/Mac/MacToolchain.cs | 15 ++++++++++++++- .../Flax.Build/Platforms/Unix/UnixToolchain.cs | 1 + 12 files changed, 54 insertions(+), 5 deletions(-) diff --git a/Source/Editor/Cooker/CookingData.h b/Source/Editor/Cooker/CookingData.h index bf6b0123a..d155380e6 100644 --- a/Source/Editor/Cooker/CookingData.h +++ b/Source/Editor/Cooker/CookingData.h @@ -115,6 +115,12 @@ API_ENUM() enum class BuildPlatform /// API_ENUM(Attributes="EditorDisplay(null, \"Mac x64\")") MacOSx64 = 12, + + /// + /// MacOS (ARM64 Apple Silicon) + /// + API_ENUM(Attributes="EditorDisplay(null, \"Mac ARM64\")") + MacOSARM64 = 13, }; extern FLAXENGINE_API const Char* ToString(const BuildPlatform platform); diff --git a/Source/Editor/Cooker/GameCooker.cpp b/Source/Editor/Cooker/GameCooker.cpp index 15ea13153..84b4333a9 100644 --- a/Source/Editor/Cooker/GameCooker.cpp +++ b/Source/Editor/Cooker/GameCooker.cpp @@ -139,6 +139,8 @@ const Char* ToString(const BuildPlatform platform) return TEXT("PlayStation 5"); case BuildPlatform::MacOSx64: return TEXT("Mac x64"); + case BuildPlatform::MacOSARM64: + return TEXT("Mac ARM64"); default: return TEXT("?"); } @@ -340,6 +342,9 @@ PlatformTools* GameCooker::GetTools(BuildPlatform platform) case BuildPlatform::MacOSx64: result = New(ArchitectureType::x64); break; + case BuildPlatform::MacOSARM64: + result = New(ArchitectureType::ARM64); + break; #endif } Tools.Add(platform, result); @@ -470,7 +475,7 @@ void GameCooker::GetCurrentPlatform(PlatformType& platform, BuildPlatform& build buildPlatform = BuildPlatform::PS5; break; case PlatformType::Mac: - buildPlatform = BuildPlatform::MacOSx64; + buildPlatform = PLATFORM_ARCH_ARM ? BuildPlatform::AndroidARM64 : BuildPlatform::MacOSx64; break; default: ; } diff --git a/Source/Editor/Cooker/GameCooker.cs b/Source/Editor/Cooker/GameCooker.cs index 5ffa5fd25..aa7a51f24 100644 --- a/Source/Editor/Cooker/GameCooker.cs +++ b/Source/Editor/Cooker/GameCooker.cs @@ -103,6 +103,7 @@ namespace FlaxEditor case BuildPlatform.AndroidARM64: return PlatformType.Android; case BuildPlatform.XboxScarlett: return PlatformType.XboxScarlett; case BuildPlatform.Switch: return PlatformType.Switch; + case BuildPlatform.MacOSARM64: case BuildPlatform.MacOSx64: return PlatformType.Mac; default: throw new ArgumentOutOfRangeException(nameof(buildPlatform), buildPlatform, null); } diff --git a/Source/Editor/Cooker/Platform/Mac/MacPlatformTools.cpp b/Source/Editor/Cooker/Platform/Mac/MacPlatformTools.cpp index 56b1c8a4d..f6a4658a7 100644 --- a/Source/Editor/Cooker/Platform/Mac/MacPlatformTools.cpp +++ b/Source/Editor/Cooker/Platform/Mac/MacPlatformTools.cpp @@ -201,7 +201,15 @@ bool MacPlatformTools::OnPostProcess(CookingData& data) dict.append_child(PUGIXML_TEXT("key")).set_child_value(PUGIXML_TEXT("LSMinimumSystemVersionByArchitecture")); xml_node LSMinimumSystemVersionByArchitecture = dict.append_child(PUGIXML_TEXT("dict")); - LSMinimumSystemVersionByArchitecture.append_child(PUGIXML_TEXT("key")).set_child_value(PUGIXML_TEXT("x86_64")); + switch (_arch) + { + case ArchitectureType::x64: + LSMinimumSystemVersionByArchitecture.append_child(PUGIXML_TEXT("key")).set_child_value(PUGIXML_TEXT("x86_64")); + break; + case ArchitectureType::ARM64: + LSMinimumSystemVersionByArchitecture.append_child(PUGIXML_TEXT("key")).set_child_value(PUGIXML_TEXT("arm64")); + break; + } LSMinimumSystemVersionByArchitecture.append_child(PUGIXML_TEXT("string")).set_child_value(PUGIXML_TEXT("10.14")); #undef ADD_ENTRY diff --git a/Source/Editor/Cooker/Steps/CompileScriptsStep.cpp b/Source/Editor/Cooker/Steps/CompileScriptsStep.cpp index ae865e14a..10b7eebad 100644 --- a/Source/Editor/Cooker/Steps/CompileScriptsStep.cpp +++ b/Source/Editor/Cooker/Steps/CompileScriptsStep.cpp @@ -204,6 +204,10 @@ bool CompileScriptsStep::Perform(CookingData& data) platform = TEXT("Mac"); architecture = TEXT("x64"); break; + case BuildPlatform::MacOSARM64: + platform = TEXT("Mac"); + architecture = TEXT("ARM64"); + break; default: LOG(Error, "Unknown or unsupported build platform."); return true; diff --git a/Source/Editor/Cooker/Steps/CookAssetsStep.cpp b/Source/Editor/Cooker/Steps/CookAssetsStep.cpp index 92ebf39f6..e0b11963b 100644 --- a/Source/Editor/Cooker/Steps/CookAssetsStep.cpp +++ b/Source/Editor/Cooker/Steps/CookAssetsStep.cpp @@ -528,6 +528,7 @@ bool ProcessShaderBase(CookAssetsStep::AssetCookData& data, ShaderAssetBase* ass #endif #if PLATFORM_TOOLS_MAC case BuildPlatform::MacOSx64: + case BuildPlatform::MacOSARM64: { const char* platformDefineName = "PLATFORM_MAC"; COMPILE_PROFILE(Vulkan_SM5, SHADER_FILE_CHUNK_INTERNAL_VULKAN_SM5_CACHE); diff --git a/Source/Editor/Scripting/ScriptsBuilder.cpp b/Source/Editor/Scripting/ScriptsBuilder.cpp index 0ec002cc2..a9dda1ae1 100644 --- a/Source/Editor/Scripting/ScriptsBuilder.cpp +++ b/Source/Editor/Scripting/ScriptsBuilder.cpp @@ -387,6 +387,8 @@ void ScriptsBuilder::GetBinariesConfiguration(const Char*& target, const Char*& architecture = TEXT("x64"); #elif PLATFORM_ARCH_X86 architecture = TEXT("x86"); +#elif PLATFORM_ARCH_ARM64 + architecture = TEXT("arm64"); #else #error "Unknown architecture" #endif diff --git a/Source/Engine/Platform/Mac/MacDefines.h b/Source/Engine/Platform/Mac/MacDefines.h index e1f57b80b..a10dda524 100644 --- a/Source/Engine/Platform/Mac/MacDefines.h +++ b/Source/Engine/Platform/Mac/MacDefines.h @@ -7,10 +7,17 @@ #include "../Unix/UnixDefines.h" // Platform description +#define PLATFORM_TYPE PlatformType::Mac +#if __aarch64__ +#define PLATFORM_64BITS 1 +#define PLATFORM_ARCH_ARM64 1 +#define PLATFORM_ARCH ArchitectureType::ARM64 +#else +sss; #define PLATFORM_64BITS 1 #define PLATFORM_ARCH_X64 1 #define PLATFORM_ARCH ArchitectureType::x64 -#define PLATFORM_TYPE PlatformType::Mac +#endif #define PLATFORM_DESKTOP 1 #define PLATFORM_CACHE_LINE_SIZE 128 #define PLATFORM_HAS_HEADLESS_MODE 1 diff --git a/Source/FlaxEditor.Build.cs b/Source/FlaxEditor.Build.cs index ed2b0e960..85facb2a6 100644 --- a/Source/FlaxEditor.Build.cs +++ b/Source/FlaxEditor.Build.cs @@ -28,6 +28,7 @@ public class FlaxEditor : EngineTarget Architectures = new[] { TargetArchitecture.x64, + TargetArchitecture.ARM64, }; GlobalDefinitions.Add("USE_EDITOR"); Win32ResourceFile = Path.Combine(Globals.EngineRoot, "Source", "FlaxEditor.rc"); diff --git a/Source/Tools/Flax.Build/Build/Platform.cs b/Source/Tools/Flax.Build/Build/Platform.cs index 2bf388224..fd51d2802 100644 --- a/Source/Tools/Flax.Build/Build/Platform.cs +++ b/Source/Tools/Flax.Build/Build/Platform.cs @@ -314,7 +314,7 @@ namespace Flax.Build case TargetPlatform.PS5: return targetArchitecture == TargetArchitecture.x64; case TargetPlatform.Android: return targetArchitecture == TargetArchitecture.ARM64; case TargetPlatform.Switch: return targetArchitecture == TargetArchitecture.ARM64; - case TargetPlatform.Mac: return targetArchitecture == TargetArchitecture.x64; + case TargetPlatform.Mac: return targetArchitecture == TargetArchitecture.ARM64 || targetArchitecture == TargetArchitecture.x64; default: return false; } } diff --git a/Source/Tools/Flax.Build/Platforms/Mac/MacToolchain.cs b/Source/Tools/Flax.Build/Platforms/Mac/MacToolchain.cs index bc6482fff..41ddb2d60 100644 --- a/Source/Tools/Flax.Build/Platforms/Mac/MacToolchain.cs +++ b/Source/Tools/Flax.Build/Platforms/Mac/MacToolchain.cs @@ -131,10 +131,23 @@ namespace Flax.Build.Platforms commonArgs.Add("-pipe"); commonArgs.Add("-x"); commonArgs.Add("objective-c++"); - commonArgs.Add("-std=c++14"); commonArgs.Add("-stdlib=libc++"); AddArgsCommon(options, commonArgs); + switch (compileEnvironment.CppVersion) + { + case CppVersion.Cpp14: + commonArgs.Add("-std=c++14"); + break; + case CppVersion.Cpp17: + case CppVersion.Latest: + commonArgs.Add("-std=c++17"); + break; + case CppVersion.Cpp20: + commonArgs.Add("-std=c++20"); + break; + } + switch (Architecture) { case TargetArchitecture.x64: diff --git a/Source/Tools/Flax.Build/Platforms/Unix/UnixToolchain.cs b/Source/Tools/Flax.Build/Platforms/Unix/UnixToolchain.cs index 6bbb8707f..b137fb650 100644 --- a/Source/Tools/Flax.Build/Platforms/Unix/UnixToolchain.cs +++ b/Source/Tools/Flax.Build/Platforms/Unix/UnixToolchain.cs @@ -226,6 +226,7 @@ namespace Flax.Build.Platforms switch (architecture) { case TargetArchitecture.x64: return "x86_64-apple-macos" + Configuration.MacOSXMinVer; + case TargetArchitecture.ARM64: return "aarch64-apple-macos" + Configuration.MacOSXMinVer; default: throw new InvalidArchitectureException(architecture); } default: throw new InvalidPlatformException(platform);