From e981fd2cc3d92c4e818f008225ec266e47c51292 Mon Sep 17 00:00:00 2001 From: Jeff Hutchinson Date: Sat, 8 May 2021 22:18:45 -0400 Subject: [PATCH 1/2] Add support for aarch64 / apple silicon --- Engine/lib/convexDecomp/NvThreadConfig.cpp | 2 ++ Engine/source/console/codeBlock.cpp | 2 +- Engine/source/console/compiler.cpp | 2 +- Engine/source/console/compiler.h | 2 +- Engine/source/core/util/uuid.cpp | 2 +- Engine/source/platform/types.gcc.h | 5 +++++ Engine/source/platform/types.h | 2 +- Engine/source/platformMac/macMath.mm | 8 ++++++++ 8 files changed, 20 insertions(+), 5 deletions(-) diff --git a/Engine/lib/convexDecomp/NvThreadConfig.cpp b/Engine/lib/convexDecomp/NvThreadConfig.cpp index 5756bafa8..7a1b08750 100644 --- a/Engine/lib/convexDecomp/NvThreadConfig.cpp +++ b/Engine/lib/convexDecomp/NvThreadConfig.cpp @@ -135,6 +135,8 @@ void tc_spinloop() // Pause would do nothing on the Xbox. Threads are not scheduled. #elif defined( _WIN64 ) YieldProcessor( ); + #elif (defined( __arm64__ ) && defined( __APPLE__ )) || defined( __arch64__ ) + asm( "yield" ); #else __asm { pause }; #endif diff --git a/Engine/source/console/codeBlock.cpp b/Engine/source/console/codeBlock.cpp index b4dd6b2c6..ad363dc17 100644 --- a/Engine/source/console/codeBlock.cpp +++ b/Engine/source/console/codeBlock.cpp @@ -447,7 +447,7 @@ bool CodeBlock::read(StringTableEntry fileName, Stream &st) { U32 ip; st.read(&ip); -#ifdef TORQUE_CPU_X64 +#if defined(TORQUE_CPU_X64) || defined(TORQUE_CPU_ARM64) *(U64*)(code + ip) = (U64)ste; #else code[ip] = *((U32 *)&ste); diff --git a/Engine/source/console/compiler.cpp b/Engine/source/console/compiler.cpp index 073e33ed7..8b1e15a8f 100644 --- a/Engine/source/console/compiler.cpp +++ b/Engine/source/console/compiler.cpp @@ -65,7 +65,7 @@ namespace Compiler void evalSTEtoCode(StringTableEntry ste, U32 ip, U32 *ptr) { -#ifdef TORQUE_CPU_X64 +#if defined(TORQUE_CPU_X64) || defined(TORQUE_CPU_ARM64) *(U64*)(ptr) = (U64)ste; #else *ptr = (U32)ste; diff --git a/Engine/source/console/compiler.h b/Engine/source/console/compiler.h index 26dc93c13..74dd6d2a0 100644 --- a/Engine/source/console/compiler.h +++ b/Engine/source/console/compiler.h @@ -254,7 +254,7 @@ namespace Compiler inline StringTableEntry CodeToSTE(U32 *code, U32 ip) { -#ifdef TORQUE_CPU_X64 +#if defined(TORQUE_CPU_X64) || defined(TORQUE_CPU_ARM64) return (StringTableEntry)(*((U64*)(code + ip))); #else return (StringTableEntry)(*(code + ip)); diff --git a/Engine/source/core/util/uuid.cpp b/Engine/source/core/util/uuid.cpp index 6eb5c2fda..795a5a7f2 100644 --- a/Engine/source/core/util/uuid.cpp +++ b/Engine/source/core/util/uuid.cpp @@ -70,7 +70,7 @@ #include "core/util/md5.h" #include "console/enginePrimitives.h" -#if defined (TORQUE_OS_MAC) && defined(TORQUE_CPU_X64) +#if defined (TORQUE_OS_MAC) && (defined(TORQUE_CPU_X64) || defined(TORQUE_CPU_ARM64)) typedef unsigned int unsigned32; #else typedef unsigned long unsigned32; diff --git a/Engine/source/platform/types.gcc.h b/Engine/source/platform/types.gcc.h index 6f7ad9f08..53538dd8d 100644 --- a/Engine/source/platform/types.gcc.h +++ b/Engine/source/platform/types.gcc.h @@ -120,6 +120,11 @@ typedef unsigned long U64; # define TORQUE_CPU_X64 # define TORQUE_LITTLE_ENDIAN +#elif (defined( __arm64__ ) && defined( __APPLE__ )) || defined( __arch64__ ) +# define TORQUE_CPU_STRING "Arm 64" +# define TORQUE_CPU_ARM64 +# define TORQUE_LITTLE_ENDIAN + #else # error "GCC: Unsupported Target CPU" #endif diff --git a/Engine/source/platform/types.h b/Engine/source/platform/types.h index 96ceb12f0..9acdefae0 100644 --- a/Engine/source/platform/types.h +++ b/Engine/source/platform/types.h @@ -128,7 +128,7 @@ static const F32 F32_MAX = F32(3.402823466e+38F); ///< Constant #endif /// Integral type matching the host's memory address width. -#ifdef TORQUE_CPU_X64 +#if defined(TORQUE_CPU_X64) || defined(TORQUE_CPU_ARM64) typedef U64 MEM_ADDRESS; #else typedef U32 MEM_ADDRESS; diff --git a/Engine/source/platformMac/macMath.mm b/Engine/source/platformMac/macMath.mm index a59bf6609..542fa27c8 100644 --- a/Engine/source/platformMac/macMath.mm +++ b/Engine/source/platformMac/macMath.mm @@ -34,21 +34,29 @@ static MRandomLCG sgPlatRandom; U32 Platform::getMathControlState() { +#ifdef TORQUE_CPU_X86 U16 cw; asm("fstcw %0" : "=m" (cw) :); return cw; +#else + return 0; +#endif } void Platform::setMathControlState(U32 state) { +#ifdef TORQUE_CPU_X86 U16 cw = state; asm("fldcw %0" : : "m" (cw)); +#endif } void Platform::setMathControlStateKnown() { +#ifdef TORQUE_CPU_X86 U16 cw = 0x27F; asm("fldcw %0" : : "m" (cw)); +#endif } //-------------------------------------- From 61fef8080b6446672f3f0f400a3f9ddb631a9380 Mon Sep 17 00:00:00 2001 From: Jeff Hutchinson Date: Mon, 10 May 2021 16:15:45 -0400 Subject: [PATCH 2/2] mend --- Engine/lib/convexDecomp/NvThreadConfig.cpp | 2 +- Tools/CMake/libraries/lpng.cmake | 5 ++++ Tools/CMake/torque3d.cmake | 30 ++++++++++++++++++---- 3 files changed, 31 insertions(+), 6 deletions(-) diff --git a/Engine/lib/convexDecomp/NvThreadConfig.cpp b/Engine/lib/convexDecomp/NvThreadConfig.cpp index 7a1b08750..75d604a84 100644 --- a/Engine/lib/convexDecomp/NvThreadConfig.cpp +++ b/Engine/lib/convexDecomp/NvThreadConfig.cpp @@ -136,7 +136,7 @@ void tc_spinloop() #elif defined( _WIN64 ) YieldProcessor( ); #elif (defined( __arm64__ ) && defined( __APPLE__ )) || defined( __arch64__ ) - asm( "yield" ); + pthread_yield_np(); #else __asm { pause }; #endif diff --git a/Tools/CMake/libraries/lpng.cmake b/Tools/CMake/libraries/lpng.cmake index 44271904a..93a32a406 100644 --- a/Tools/CMake/libraries/lpng.cmake +++ b/Tools/CMake/libraries/lpng.cmake @@ -24,6 +24,11 @@ project(lpng) # addDef(PNG_NO_ASSEMBLER_CODE) +# Issues with Neon at the moment (Arm support) +# https://sourceforge.net/p/libpng/bugs/281/ +set(PNG_ARM_NEON off CACHE STRING "") +add_definitions(-DPNG_ARM_NEON_OPT=0) + addInclude(${libDir}/zlib) finishLibrary("${libDir}/${PROJECT_NAME}") diff --git a/Tools/CMake/torque3d.cmake b/Tools/CMake/torque3d.cmake index c64a18986..afff2d5c8 100644 --- a/Tools/CMake/torque3d.cmake +++ b/Tools/CMake/torque3d.cmake @@ -692,8 +692,8 @@ if(WIN32) endif() if (APPLE) - addFramework("Cocoa") - addFramework("OpenGL") + addFramework("Cocoa") + addFramework("OpenGL") #These are needed by sdl2 static lib addFramework("CoreAudio") addFramework("AudioUnit") @@ -704,9 +704,29 @@ if (APPLE) addFramework("Carbon") addFramework("AudioToolbox") addLib("iconv") - #set a few arch defaults - set(CMAKE_OSX_ARCHITECTURES "x86_64" CACHE STRING "OSX Architecture" FORCE) - set(CMAKE_OSX_DEPLOYMENT_TARGET "10.9" CACHE STRING "OSX Deployment target" FORCE) +endif() + +#detect Architecture +if (APPLE AND NOT IOS) + option(TORQUE_MACOS_UNIVERSAL_BINARY OFF) + + # Detect architecture if not using universal + if (TORQUE_MACOS_UNIVERSAL_BINARY) + set(ARCHITECTURE_STRING_APPLE "x86_64;arm64") + set(DEPLOYMENT_TARGET_APPLE "10.13") + else() + check_c_compiler_flag("-arch arm64" armSupportedApple) + if(armSupportedApple) + set(ARCHITECTURE_STRING_APPLE "arm64") + set(DEPLOYMENT_TARGET_APPLE "11.0") + else() + set(ARCHITECTURE_STRING_APPLE "x86_64") + set(DEPLOYMENT_TARGET_APPLE "10.9") + endif() + endif() + + set(CMAKE_OSX_ARCHITECTURES ${ARCHITECTURE_STRING_APPLE} CACHE STRING "OSX Architecture" FORCE) + set(CMAKE_OSX_DEPLOYMENT_TARGET ${DEPLOYMENT_TARGET_APPLE} CACHE STRING "OSX Deployment target" FORCE) endif() if(UNIX AND NOT APPLE)