From 6c48eb3d5c9cab2eaf9e242dc56b6a5db1c67174 Mon Sep 17 00:00:00 2001 From: Colby Klein Date: Tue, 23 Jun 2020 16:58:00 -0700 Subject: [PATCH] Fix compile on raspberry pi 4/A72 Game runs pretty close to fine, needed to use system libpng and haven't attempted to use ffmpeg, however. I'm seeing in the 50fps range in gameplay with no performance tweaks but having set -mtune=cortex-a72. There's a lot of perf opportunities, so consistent 60 is certainly within reason without too much pain. --- src/CMakeData-arch.cmake | 6 ++---- src/CMakeLists.txt | 22 +++++++++++++++++----- src/archutils/Common/PthreadHelpers.cpp | 3 +++ src/archutils/Unix/Backtrace.cpp | 11 +++++++++++ 4 files changed, 33 insertions(+), 9 deletions(-) diff --git a/src/CMakeData-arch.cmake b/src/CMakeData-arch.cmake index 896506fb50..b8bd4682d6 100644 --- a/src/CMakeData-arch.cmake +++ b/src/CMakeData-arch.cmake @@ -231,14 +231,12 @@ if(NOT APPLE) "arch/Lights/LightsDriver_Linux_PIUIO.cpp" "arch/Lights/LightsDriver_Linux_PIUIO_Leds.cpp" "arch/Lights/LightsDriver_Linux_ITGIO.cpp" - "arch/Lights/LightsDriver_LinuxWeedTech.cpp" - "arch/Lights/LightsDriver_LinuxParallel.cpp") + "arch/Lights/LightsDriver_LinuxWeedTech.cpp") list(APPEND SMDATA_ARCH_LIGHTS_HPP "arch/Lights/LightsDriver_Linux_PIUIO.h" "arch/Lights/LightsDriver_Linux_PIUIO_Leds.h" "arch/Lights/LightsDriver_Linux_ITGIO.h" - "arch/Lights/LightsDriver_LinuxWeedTech.h" - "arch/Lights/LightsDriver_LinuxParallel.h") + "arch/Lights/LightsDriver_LinuxWeedTech.h") if(WITH_PARALLEL_PORT) list(APPEND SMDATA_ARCH_LIGHTS_SRC "arch/Lights/LightsDriver_LinuxParallel.cpp") diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 398e3e78b1..97ed7617b4 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -142,8 +142,12 @@ if(WITH_SSE2) if(SM_WIN32_ARCH MATCHES "x86") set(SM_COMPILE_FLAGS "${SM_COMPILE_FLAGS} /arch:SSE2") endif() - else() + elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "x86") set(SM_COMPILE_FLAGS "${SM_COMPILE_FLAGS} -msse2") + elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64") + set(SM_COMPILE_FLAGS "${SM_COMPILE_FLAGS} -mtune=cortex-a72") + else() + message("Unrecognized host processor type") endif() endif() @@ -332,9 +336,14 @@ else() # Linux sm_add_compile_definition("${SM_EXE_NAME}" CRASH_HANDLER) if(LINUX) # used only in the ArchHooks_Unix.cpp file - sm_add_compile_definition("${SM_EXE_NAME}" BACKTRACE_METHOD_X86_LINUX) - sm_add_compile_definition("${SM_EXE_NAME}" + if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86" OR CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64") + sm_add_compile_definition("${SM_EXE_NAME}" BACKTRACE_METHOD_X86_LINUX) + sm_add_compile_definition("${SM_EXE_NAME}" BACKTRACE_METHOD_TEXT="x86 custom backtrace") + else() + sm_add_compile_definition("${SM_EXE_NAME}" + BACKTRACE_METHOD_TEXT="no backtrace") + endif() sm_add_compile_definition( "${SM_EXE_NAME}" BACKTRACE_LOOKUP_METHOD_TEXT="backtrace_symbols") if(${DL_FOUND}) @@ -351,12 +360,15 @@ else() # Linux message("Host processor is ${CMAKE_SYSTEM_PROCESSOR}") if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64") - message("Host processor is 64bit") + message("Host processor is 64bit X86") sm_add_compile_definition("${SM_EXE_NAME}" CPU_X86_64) elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "x86" OR CMAKE_SYSTEM_PROCESSOR MATCHES "i686") - message("Host processor is 32bit") + message("Host processor is 32bit X86") sm_add_compile_definition("${SM_EXE_NAME}" CPU_X86) + elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64") + message("Host processor is 64bit ARM") + sm_add_compile_definition("${SM_EXE_NAME}" CPU_AARCH64) else() message("Unrecognized host processor type") endif() diff --git a/src/archutils/Common/PthreadHelpers.cpp b/src/archutils/Common/PthreadHelpers.cpp index 543f70c55a..05eec07045 100644 --- a/src/archutils/Common/PthreadHelpers.cpp +++ b/src/archutils/Common/PthreadHelpers.cpp @@ -244,6 +244,9 @@ bool GetThreadBacktraceContext( uint64_t ThreadID, BacktraceContext *ctx ) ctx->PC = (void *)ptrace( PTRACE_PEEKUSER, pid_t(ThreadID), (void *)(PT_NIP<<2), 0 ); if( errno ) return false; +#elif defined(CPU_AARCH64) + // NYI + return false; #else #error GetThreadBacktraceContext: which arch? #endif diff --git a/src/archutils/Unix/Backtrace.cpp b/src/archutils/Unix/Backtrace.cpp index fbf9a1c4d3..b650e3b415 100644 --- a/src/archutils/Unix/Backtrace.cpp +++ b/src/archutils/Unix/Backtrace.cpp @@ -398,6 +398,12 @@ void GetSignalBacktraceContext( BacktraceContext *ctx, const ucontext_t *uc ) ctx->sp = (void *) uc->uc_mcontext.gregs[REG_RSP]; ctx->pid = GetCurrentThreadId(); } +#elif defined(CPU_AARCH64) +void GetSignalBacktraceContext( BacktraceContext *ctx, const ucontext_t *uc ) +{ + // NYI +} + #else #error #endif @@ -740,6 +746,11 @@ void GetBacktrace( const void **buf, size_t size, const BacktraceContext *ctx ) #warning Undefined BACKTRACE_METHOD_* void InitializeBacktrace() { } +void GetSignalBacktraceContext( BacktraceContext *ctx, const ucontext_t *uc ) +{ + // NYI +} + void GetBacktrace( const void **buf, size_t size, const BacktraceContext *ctx ) { buf[0] = BACKTRACE_METHOD_NOT_AVAILABLE;