From 28f266302fbeea2d75d5a62de651d464ab380798 Mon Sep 17 00:00:00 2001 From: Adrian Graber Date: Sun, 4 Jul 2021 18:52:48 +0200 Subject: [PATCH] Add Nintendo Switch initial support --- .github/workflows/build-switch.yml | 28 ++++++ .vscode/c_cpp_properties.json | 19 ++++ .vscode/settings.json | 10 +- CMakeLists.txt | 6 ++ cmake/nx/NXFunctions.cmake | 7 ++ logo_switch.jpg | Bin 0 -> 18096 bytes src/CMakeLists.txt | 40 +++++++- src/core/common.h | 4 + src/core/config.h | 9 +- src/core/re3.cpp | 2 - src/skel/crossplatform.cpp | 146 ++++++++++++++++++++++++++++- src/skel/events.cpp | 2 + src/skel/glfw/glfw.cpp | 12 ++- 13 files changed, 273 insertions(+), 12 deletions(-) create mode 100644 .github/workflows/build-switch.yml create mode 100644 cmake/nx/NXFunctions.cmake create mode 100644 logo_switch.jpg diff --git a/.github/workflows/build-switch.yml b/.github/workflows/build-switch.yml new file mode 100644 index 00000000..46e1d501 --- /dev/null +++ b/.github/workflows/build-switch.yml @@ -0,0 +1,28 @@ +name: re3 cmake devkitA64 (Nintendo Switch) +on: + pull_request: + push: + release: + types: published +jobs: + build-nintendo-switch: + runs-on: ubuntu-latest + container: devkitpro/devkita64:latest + steps: + - uses: actions/checkout@v2 + with: + submodules: 'true' + - name: "Build files" + run: | + /opt/devkitpro/portlibs/switch/bin/aarch64-none-elf-cmake -S. -Bbuild -DRE3_AUDIO=OAL -DLIBRW_PLATFORM=GL3 -DLIBRW_GL3_GFXLIB=GLFW -DRE3_WITH_OPUS=False -DRE3_VENDORED_LIBRW=True -DRE3_INSTALL=True + cmake --build build --parallel + - name: "Create binary package (cpack)" + working-directory: ./build + run: | + cpack + - name: "Archive binary package (github artifacts)" + uses: actions/upload-artifact@v2 + with: + name: "switch-gl3" + path: build/*.zip + if-no-files-found: error diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json index 327d8cc7..a214042a 100644 --- a/.vscode/c_cpp_properties.json +++ b/.vscode/c_cpp_properties.json @@ -26,6 +26,25 @@ "compilerArgs": ["-ggdb"], "cStandard": "gnu11", "cppStandard": "gnu++14" + }, + { + "name": "devkitPro aarch64 (Nintendo Switch)", + "compilerPath": "${env:DEVKITPRO}/devkitA64/bin/aarch64-none-elf-g++", + "includePath": [ + "${default}", + "${env:DEVKITPRO}/portlibs/switch/include", + "${env:DEVKITPRO}/libnx/include" + ], + "intelliSenseMode": "gcc-arm64", + "cStandard": "gnu11", + "cppStandard": "gnu++11", + "defines": [ + "__SWITCH__", + "GTA_SWITCH", + "LIBRW", + "RW_GL3", + "AUDIO_OAL" + ] } ], "version": 4 diff --git a/.vscode/settings.json b/.vscode/settings.json index 10cb5627..ee8362c1 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -2,8 +2,13 @@ "C_Cpp.default.cStandard": "gnu11", "C_Cpp.default.cppStandard": "gnu++14", "C_Cpp.default.includePath": [ + "src", "src/animation", "src/audio", + "src/audio/eax", + "src/audio/oal", + "src/buildings", + "src/collision", "src/control", "src/core", "src/entities", @@ -15,8 +20,9 @@ "src/peds", "src/render", "src/rw", - "src/save", - "src/skel", + "src/save/", + "src/skel/", + "src/skel/glfw", "src/text", "src/vehicles", "src/weapons", diff --git a/CMakeLists.txt b/CMakeLists.txt index 5396d3b4..b687124a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -12,6 +12,10 @@ message(STATUS "Building ${CMAKE_PROJECT_NAME} GIT SHA1: ${GIT_SHA1}") if(WIN32) set(${PROJECT}_AUDIOS "OAL" "MSS") +elseif(NINTENDO_SWITCH) + list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake/nx") + include(NXFunctions) + set(${PROJECT}_AUDIOS "OAL") else() set(${PROJECT}_AUDIOS "OAL") endif() @@ -66,6 +70,8 @@ if(${PROJECT}_INSTALL) set(os "-apple") elseif(UNIX) set(os "-linux") + elseif(NINTENDO_SWITCH) + set(os "-switch") else() set(compiler "-UNK") message(WARNING "Unknown os. Created cpack package will be wrong. (override using cpack -P)") diff --git a/cmake/nx/NXFunctions.cmake b/cmake/nx/NXFunctions.cmake new file mode 100644 index 00000000..8fa23fae --- /dev/null +++ b/cmake/nx/NXFunctions.cmake @@ -0,0 +1,7 @@ +if(NOT COMMAND nx_generate_nacp) + message(FATAL_ERROR "The `nx_generate_nacp` cmake command is not available. Please use an appropriate Nintendo Switch toolchain.") +endif() + +if(NOT COMMAND nx_create_nro) + message(FATAL_ERROR "The `nx_create_nro` cmake command is not available. Please use an appropriate Nintendo Switch toolchain.") +endif() diff --git a/logo_switch.jpg b/logo_switch.jpg new file mode 100644 index 0000000000000000000000000000000000000000..595d2c3b8d03cbaf72a213c73f84fa02f2b157cc GIT binary patch literal 18096 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

wCE@ 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 XM4b%Jcj)POR0*C!ipqf{|NkZcxLqhK literal 0 HcmV?d00001 diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 28090d7e..67dfb325 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -120,13 +120,19 @@ elseif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") ) endif() +if(NINTENDO_SWITCH) + set(${PROJECT}_C_CXX_EXTENSIONS ON) +else() + set(${PROJECT}_C_CXX_EXTENSIONS OFF) +endif() + set_target_properties(${EXECUTABLE} PROPERTIES C_STANDARD 11 - C_EXTENSIONS OFF + C_EXTENSIONS ${${PROJECT}_C_CXX_EXTENSIONS} C_STANDARD_REQUIRED ON CXX_STANDARD 11 - CXX_EXTENSIONS OFF + CXX_EXTENSIONS ${${PROJECT}_C_CXX_EXTENSIONS} CXX_STANDARD_REQUIRED ON ) @@ -140,3 +146,33 @@ if(${PROJECT}_INSTALL) install(FILES $ DESTINATION "." OPTIONAL) endif() endif() + +# Build Nintendo Switch binaries +if(NINTENDO_SWITCH) + target_compile_definitions(${EXECUTABLE} PRIVATE + GTA_SWITCH + ) + + # Needed for OpenAL-Soft + target_link_libraries(${EXECUTABLE} PRIVATE + openal # HACK - something broke with latest cmake + SDL2 + ) + + nx_generate_nacp (${EXECUTABLE}.nacp + NAME "${EXECUTABLE}" + AUTHOR "${EXECUTABLE} Team" + VERSION "1.0.0-${GIT_SHA1}" + ) + + nx_create_nro(${EXECUTABLE} + NACP ${EXECUTABLE}.nacp + ICON "${PROJECT_SOURCE_DIR}/logo_switch.jpg" + ) + + if(${PROJECT}_INSTALL) + install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${EXECUTABLE}.nro" + DESTINATION "." + ) + endif() +endif() diff --git a/src/core/common.h b/src/core/common.h index da162762..99aafc5a 100644 --- a/src/core/common.h +++ b/src/core/common.h @@ -11,6 +11,10 @@ #define __STDC_LIMIT_MACROS // so we get UINT32_MAX etc #endif +#ifdef GTA_SWITCH +#include +#endif + #include #include #include diff --git a/src/core/config.h b/src/core/config.h index 885f98b8..edb5fb5a 100644 --- a/src/core/config.h +++ b/src/core/config.h @@ -319,7 +319,7 @@ enum Config { #if !defined(RW_GL3) && defined(_WIN32) #define XINPUT #endif -#if defined XINPUT || (defined RW_GL3 && !defined LIBRW_SDL2 && !defined __SWITCH__) +#if defined XINPUT || (defined RW_GL3 && !defined LIBRW_SDL2 && !defined GTA_SWITCH) #define DETECT_JOYSTICK_MENU // Then we'll expect user to enter Controller->Detect joysticks if his joystick isn't detected at the start. #endif #define DETECT_PAD_INPUT_SWITCH // Adds automatic switch of pad related stuff between controller and kb/m @@ -439,7 +439,7 @@ enum Config { #endif // Streaming -#if !defined(_WIN32) && !defined(__SWITCH__) +#if !defined(_WIN32) && !defined(GTA_SWITCH) //#define ONE_THREAD_PER_CHANNEL // Don't use if you're not on SSD/Flash - also not utilized too much right now(see commented LoadAllRequestedModels in Streaming.cpp) #define FLUSHABLE_STREAMING // Make it possible to interrupt reading when processing file isn't needed anymore. #endif @@ -461,4 +461,9 @@ enum Config { #undef PEDS_REPORT_CRIMES_ON_PHONE #endif +#ifdef GTA_SWITCH + #define IGNORE_MOUSE_KEYBOARD // ignore mouse & keyboard input + #define USE_UNNAMED_SEM // named semaphores are unsupported on the switch +#endif + #endif // VANILLA_DEFINES diff --git a/src/core/re3.cpp b/src/core/re3.cpp index b7d89363..40be153a 100644 --- a/src/core/re3.cpp +++ b/src/core/re3.cpp @@ -45,9 +45,7 @@ #include "Population.h" #include "IniFile.h" -#ifdef DETECT_JOYSTICK_MENU #include "crossplatform.h" -#endif #ifndef _WIN32 #include "assert.h" diff --git a/src/skel/crossplatform.cpp b/src/skel/crossplatform.cpp index 577983b6..758125e9 100644 --- a/src/skel/crossplatform.cpp +++ b/src/skel/crossplatform.cpp @@ -198,6 +198,20 @@ char* casepath(char const* path, bool checkPathFirst) size_t rl = 0; DIR* d; + char* c; + + #if defined(GTA_SWITCH) || defined(GTA_VITA) + if( (c = strstr(p, ":/")) != NULL) // scheme used by some environments, eg. switch, vita + { + size_t deviceNameOffset = c - p + 3; + char* deviceNamePath = (char*)alloca(deviceNameOffset + 1); + strlcpy(deviceNamePath, p, deviceNameOffset); + deviceNamePath[deviceNameOffset] = 0; + d = opendir(deviceNamePath); + p = c + 1; + } + else + #endif if (p[0] == '/' || p[0] == '\\') { d = opendir("/"); @@ -212,7 +226,7 @@ char* casepath(char const* path, bool checkPathFirst) bool cantProceed = false; // just convert slashes in what's left in string, don't correct case of letters(because we can't) bool mayBeTrailingSlash = false; - char* c; + while (c = strsep(&p, "/\\")) { // May be trailing slash(allow), slash at the start(avoid), or multiple slashes(avoid) @@ -279,3 +293,133 @@ char* casepath(char const* path, bool checkPathFirst) return out; } #endif + +#ifdef GTA_SWITCH +/* Taken from glibc */ +char *realpath(const char *name, char *resolved) +{ + char *rpath, *dest = NULL; + const char *start, *end, *rpath_limit; + long int path_max; + + /* As per Single Unix Specification V2 we must return an error if + either parameter is a null pointer. We extend this to allow + the RESOLVED parameter to be NULL in case the we are expected to + allocate the room for the return value. */ + if (!name) + return NULL; + + /* As per Single Unix Specification V2 we must return an error if + the name argument points to an empty string. */ + if (name[0] == '\0') + return NULL; + +#ifdef PATH_MAX + path_max = PATH_MAX; +#else + path_max = pathconf(name, _PC_PATH_MAX); + if (path_max <= 0) + path_max = 1024; +#endif + + if (!resolved) + { + rpath = (char*)malloc(path_max); + if (!rpath) + return NULL; + } + else + rpath = resolved; + rpath_limit = rpath + path_max; + + if (name[0] != '/') + { + if (!getcwd(rpath, path_max)) + { + rpath[0] = '\0'; + goto error; + } + dest = (char*)memchr(rpath, '\0', path_max); + } + else + { + rpath[0] = '/'; + dest = rpath + 1; + } + + for (start = end = name; *start; start = end) + { + /* Skip sequence of multiple path-separators. */ + while (*start == '/') + ++start; + + /* Find end of path component. */ + for (end = start; *end && *end != '/'; ++end) + /* Nothing. */; + + if (end - start == 0) + break; + else if (end - start == 1 && start[0] == '.') + /* nothing */; + else if (end - start == 2 && start[0] == '.' && start[1] == '.') + { + /* Back up to previous component, ignore if at root already. */ + if (dest > rpath + 1) + while ((--dest)[-1] != '/') + ; + } + else + { + size_t new_size; + + if (dest[-1] != '/') + *dest++ = '/'; + + if (dest + (end - start) >= rpath_limit) + { + ptrdiff_t dest_offset = dest - rpath; + char *new_rpath; + + if (resolved) + { + if (dest > rpath + 1) + dest--; + *dest = '\0'; + goto error; + } + new_size = rpath_limit - rpath; + if (end - start + 1 > path_max) + new_size += end - start + 1; + else + new_size += path_max; + new_rpath = (char *)realloc(rpath, new_size); + if (!new_rpath) + goto error; + rpath = new_rpath; + rpath_limit = rpath + new_size; + + dest = rpath + dest_offset; + } + + dest = (char*)memcpy(dest, start, end - start); + *dest = '\0'; + } + } + if (dest > rpath + 1 && dest[-1] == '/') + --dest; + *dest = '\0'; + + return rpath; + +error: + if (!resolved) + free(rpath); + return NULL; +} + +ssize_t readlink (const char * __path, char * __buf, size_t __buflen) +{ + errno = ENOSYS; + return -1; +} +#endif diff --git a/src/skel/events.cpp b/src/skel/events.cpp index 3e1e95b3..87447819 100644 --- a/src/skel/events.cpp +++ b/src/skel/events.cpp @@ -821,7 +821,9 @@ PadHandler(RsEvent event, void *param) RwBool AttachInputDevices(void) { +#ifndef IGNORE_MOUSE_KEYBOARD RsInputDeviceAttach(rsKEYBOARD, KeyboardHandler); +#endif RsInputDeviceAttach(rsPAD, PadHandler); diff --git a/src/skel/glfw/glfw.cpp b/src/skel/glfw/glfw.cpp index 8d3fc7d7..c7f92d34 100644 --- a/src/skel/glfw/glfw.cpp +++ b/src/skel/glfw/glfw.cpp @@ -12,12 +12,14 @@ DWORD _dwOperatingSystemVersion; #include "resource.h" #else long _dwOperatingSystemVersion; +#ifndef GTA_SWITCH #ifndef __APPLE__ #include #else #include #include #endif +#endif #include #include #include @@ -51,7 +53,7 @@ long _dwOperatingSystemVersion; #include "MemoryMgr.h" // We found out that GLFW's keyboard input handling is still pretty delayed/not stable, so now we fetch input from X11 directly on Linux. -#if !defined _WIN32 && !defined __APPLE__ && !defined __SWITCH__ // && !defined WAYLAND +#if !defined _WIN32 && !defined __APPLE__ && !defined GTA_SWITCH // && !defined WAYLAND #define GET_KEYBOARD_INPUT_FROM_X11 #endif @@ -485,11 +487,13 @@ psInitialize(void) debug("Physical memory size %llu\n", _dwMemAvailPhys); debug("Available physical memory %llu\n", size); #else +#ifndef GTA_SWITCH struct sysinfo systemInfo; sysinfo(&systemInfo); _dwMemAvailPhys = systemInfo.freeram; debug("Physical memory size %u\n", systemInfo.totalram); debug("Available physical memory %u\n", systemInfo.freeram); +#endif #endif TheText.Unload(); @@ -949,13 +953,15 @@ void psPostRWinit(void) RwVideoMode vm; RwEngineGetVideoModeInfo(&vm, GcurSelVM); + glfwSetFramebufferSizeCallback(PSGLOBAL(window), resizeCB); +#ifndef IGNORE_MOUSE_KEYBOARD #ifndef GET_KEYBOARD_INPUT_FROM_X11 glfwSetKeyCallback(PSGLOBAL(window), keypressCB); #endif - glfwSetFramebufferSizeCallback(PSGLOBAL(window), resizeCB); glfwSetScrollCallback(PSGLOBAL(window), scrollCB); glfwSetCursorPosCallback(PSGLOBAL(window), cursorCB); glfwSetCursorEnterCallback(PSGLOBAL(window), cursorEnterCB); +#endif glfwSetWindowIconifyCallback(PSGLOBAL(window), windowIconifyCB); glfwSetWindowFocusCallback(PSGLOBAL(window), windowFocusCB); glfwSetJoystickCallback(joysChangeCB); @@ -1791,7 +1797,7 @@ main(int argc, char *argv[]) InitMemoryMgr(); #endif -#ifndef _WIN32 +#if !defined(_WIN32) && !defined(GTA_SWITCH) struct sigaction act; act.sa_sigaction = terminateHandler; act.sa_flags = SA_SIGINFO;