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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 n0L%=}BjvI1_J5yy|65!A@6i0O?)NvR`` 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;