From 55cc2d8e72265b3dcbd61c559b3f94456f9a6278 Mon Sep 17 00:00:00 2001 From: fgsfds Date: Wed, 13 Nov 2024 12:50:42 +0100 Subject: [PATCH] port: nswitch: basic Nintendo Switch port --- CMakeLists.txt | 34 ++++++- README.md | 30 ++++++- dist/nswitch/gamecontrollerdb.txt | 2 + dist/nswitch/icon.jpg | Bin 0 -> 32299 bytes port/fast3d/glad/glad.c | 144 ++---------------------------- port/fast3d/glad/glad.h | 11 +-- port/include/fs.h | 2 +- port/src/config.c | 4 +- port/src/fs.c | 2 +- port/src/libultra.c | 4 +- port/src/video.c | 20 ++++- src/include/platform.h | 3 + 12 files changed, 95 insertions(+), 161 deletions(-) create mode 100644 dist/nswitch/gamecontrollerdb.txt create mode 100644 dist/nswitch/icon.jpg diff --git a/CMakeLists.txt b/CMakeLists.txt index 330b411b7..0cf33b754 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -53,6 +53,9 @@ if(WIN32) elseif(APPLE) # OSX set(TARGET_OS "osx") +elseif(NINTENDO_SWITCH) + # Switch + set(TARGET_OS "nswitch") elseif(UNIX) # Generic *nix; assume Linux set(TARGET_OS "linux") @@ -184,19 +187,31 @@ set(LIBS ) # SDL2 find_package(SDL2 REQUIRED) +if(NINTENDO_SWITCH) + if(NOT SDL2_LIBRARY OR NOT SDL2_INCLUDE_DIR) + # sometimes FindSDL2 just wants us to suffer and does not set these + set(SDL2_LIBRARY "SDL2") + set(SDL2_INCLUDE_DIR "${DEVKITPRO}/portlibs/switch/include/SDL2") + endif() +endif() include_directories(SYSTEM "${SDL2_INCLUDE_DIR}") list(APPEND LIBS "${SDL2_LIBRARY}") # ZLib find_package(ZLIB REQUIRED) +if(ZLIB_INCLUDE_DIR) + include_directories(SYSTEM "${ZLIB_INCLUDE_DIR}") +endif() list(APPEND LIBS "${ZLIB_LIBRARY}") # GL if(NOT GL_LIBRARY) if(WIN32) - set(GL_LIBRARY "opengl32") + set(GL_LIBRARY opengl32) + elseif(NINTENDO_SWITCH) + set(GL_LIBRARY EGL glapi drm_nouveau) else() - set(GL_LIBRARY "GL") + set(GL_LIBRARY GL) endif() endif() list(APPEND LIBS "${GL_LIBRARY}") @@ -205,6 +220,8 @@ list(APPEND LIBS "${GL_LIBRARY}") if(NOT EXTRA_LIBRARIES) if(WIN32) set(EXTRA_LIBRARIES dbghelp -static-libstdc++) + elseif(NINTENDO_SWITCH) + set(EXTRA_LIBRARIES stdc++ pthread) else() set(EXTRA_LIBRARIES stdc++ m dl) endif() @@ -296,10 +313,21 @@ add_custom_target(pd_headers ALL DEPENDS ${JSON_HEADERS}) # Game target +set(BIN_NAME "pd${BIN_REGION}.${TARGET_ARCH}") add_executable(pd ${SRC}) add_dependencies(pd pd_headers) target_link_libraries(pd ${LIBS}) -set_target_properties(pd PROPERTIES OUTPUT_NAME "pd${BIN_REGION}.${TARGET_ARCH}") +set_target_properties(pd PROPERTIES OUTPUT_NAME "${BIN_NAME}") if(WIN32) set_target_properties(pd PROPERTIES WIN32_EXECUTABLE TRUE) endif() + +# Additional commands for specific platforms. + +if(NINTENDO_SWITCH) + add_custom_command(TARGET pd POST_BUILD + COMMAND nacptool --create "Perfect Dark" "fgsfds & contributors" "${VERSION_ROMID}/${VERSION_BRANCH}/${VERSION_HASH}" "${BIN_NAME}.nacp" + COMMAND aarch64-none-elf-strip -o ${CMAKE_BINARY_DIR}/${BIN_NAME}.stripped.elf ${CMAKE_BINARY_DIR}/${BIN_NAME}.elf + COMMAND elf2nro ${CMAKE_BINARY_DIR}/${BIN_NAME}.stripped.elf ${CMAKE_BINARY_DIR}/${BIN_NAME}.nro --icon=${CMAKE_SOURCE_DIR}/dist/nswitch/icon.jpg --nacp=${BIN_NAME}.nacp + ) +endif() diff --git a/README.md b/README.md index 8e508b465..42a3bd8d6 100644 --- a/README.md +++ b/README.md @@ -111,8 +111,8 @@ Controls can be rebound in `pd.ini`. Default control scheme is as follows: 5. Run `cmake -G"Unix Makefiles" -Bbuild .`. * Add ` -DROMID=pal-final` or ` -DROMID=jpn-final` at the end of the command if you want to build a PAL or JPN executable respectively.\ 6. Run `cmake --build build -j4 -- -O`. -6. The resulting executable will be at `build/pd.x86_64.exe` (or at `build/pd.i686.exe` if building for i686). -7. If you don't know where you downloaded the source to, you can run `explorer .` to open the current directory. +7. The resulting executable will be at `build/pd.x86_64.exe` (or at `build/pd.i686.exe` if building for i686). +8. If you don't know where you downloaded the source to, you can run `explorer .` to open the current directory. ### Linux @@ -125,7 +125,31 @@ Controls can be rebound in `pd.ini`. Default control scheme is as follows: * Add ` -DROMID=pal-final` or ` -DROMID=jpn-final` at the end of the command if you want to build a PAL or JPN executable respectively. * Add ` -DCMAKE_C_FLAGS=-m32 -DCMAKE_CXX_FLAGS=-m32` at the end of the command if you want to crosscompile from x86_64 to x86. 4. Run `cmake --build build -j4`. -4. The resulting executable will be at `build/pd.` (for example `build/pd.x86_64`). +5. The resulting executable will be at `build/pd.` (for example `build/pd.x86_64`). + +### Nintendo Switch + +1. Set up the [devkitA64 environment](https://devkitpro.org/wiki/Getting_Started). + * On Windows you can do it under MSYS2 or WSL, usually MSYS2 is recommended. + * If using MSYS2, make sure to use the **MSYS2** shell, **not** MINGW32 or MINGW64. +2. Install host dependencies: + * On MSYS2: `pacman -Syuu && pacman -S git make cmake python3` + * On Linux: use your package manager as normal to install the above dependencies. +3. Install Switch toolchain and dependencies: + * ``` + dkp-pacman -Syuu + dkp-pacman -S devkitA64 switch-libnx switch-zlib switch-sdl2 switch-cmake dkp-toolchain-vars + ``` + * If in MSYS2 or `dkp-pacman` doesn't work, replace it with just `pacman`. +4. Ensure devkitA64 environment variables are set: + * `source /opt/devkitpro/switchvars.sh` + * If your `$DEVKITPRO` path is different, substitute that instead or set the variables manually. +5. Configure: + * `aarch64-none-elf-cmake -G"Unix Makefiles" -Bbuild .` + * Add ` -DROMID=pal-final` or ` -DROMID=jpn-final` at the end of the command if you want to build a PAL or JPN executable respectively. +6. Build: + * `make -C build -j4` +7. The resulting executable will be at `build/pd.arm64.nro`. ### Notes diff --git a/dist/nswitch/gamecontrollerdb.txt b/dist/nswitch/gamecontrollerdb.txt new file mode 100644 index 000000000..7dcba6b02 --- /dev/null +++ b/dist/nswitch/gamecontrollerdb.txt @@ -0,0 +1,2 @@ +# Switch (SDL_GetPlatform is not changed in switch-sdl2) +000038f853776974636820436f6e7400,Switch Controller,a:b0,b:b1,back:b11,dpdown:b15,dpleft:b12,dpright:b14,dpup:b13,leftshoulder:b6,leftstick:b4,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b5,righttrigger:b9,rightx:a2,righty:a3,start:b10,x:b2,y:b3,platform:Unknown (see SDL_platform.h), diff --git a/dist/nswitch/icon.jpg b/dist/nswitch/icon.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2adc6f6c8543f6b11b226591c2210fcf98599eaf GIT binary patch literal 32299 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 @@ -33,138 +33,6 @@ #include #include "glad.h" -static void* get_proc(const char *namez); - -#if defined(_WIN32) || defined(__CYGWIN__) -#ifndef _WINDOWS_ -#undef APIENTRY -#endif -#include -static HMODULE libGL; - -typedef void* (APIENTRYP PFNWGLGETPROCADDRESSPROC_PRIVATE)(const char*); -static PFNWGLGETPROCADDRESSPROC_PRIVATE gladGetProcAddressPtr; - -#ifdef _MSC_VER -#ifdef __has_include - #if __has_include() - #define HAVE_WINAPIFAMILY 1 - #endif -#elif _MSC_VER >= 1700 && !_USING_V110_SDK71_ - #define HAVE_WINAPIFAMILY 1 -#endif -#endif - -#ifdef HAVE_WINAPIFAMILY - #include - #if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) - #define IS_UWP 1 - #endif -#endif - -static -int open_gl(void) { -#ifndef IS_UWP - libGL = LoadLibraryW(L"opengl32.dll"); - if(libGL != NULL) { - void (* tmp)(void); - tmp = (void(*)(void)) GetProcAddress(libGL, "wglGetProcAddress"); - gladGetProcAddressPtr = (PFNWGLGETPROCADDRESSPROC_PRIVATE) tmp; - return gladGetProcAddressPtr != NULL; - } -#endif - - return 0; -} - -static -void close_gl(void) { - if(libGL != NULL) { - FreeLibrary((HMODULE) libGL); - libGL = NULL; - } -} -#else -#include -static void* libGL; - -#if !defined(__APPLE__) && !defined(__HAIKU__) -typedef void* (APIENTRYP PFNGLXGETPROCADDRESSPROC_PRIVATE)(const char*); -static PFNGLXGETPROCADDRESSPROC_PRIVATE gladGetProcAddressPtr; -#endif - -static -int open_gl(void) { -#ifdef __APPLE__ - static const char *NAMES[] = { - "../Frameworks/OpenGL.framework/OpenGL", - "/Library/Frameworks/OpenGL.framework/OpenGL", - "/System/Library/Frameworks/OpenGL.framework/OpenGL", - "/System/Library/Frameworks/OpenGL.framework/Versions/Current/OpenGL" - }; -#else - static const char *NAMES[] = {"libGL.so.1", "libGL.so"}; -#endif - - unsigned int index = 0; - for(index = 0; index < (sizeof(NAMES) / sizeof(NAMES[0])); index++) { - libGL = dlopen(NAMES[index], RTLD_NOW | RTLD_GLOBAL); - - if(libGL != NULL) { -#if defined(__APPLE__) || defined(__HAIKU__) - return 1; -#else - gladGetProcAddressPtr = (PFNGLXGETPROCADDRESSPROC_PRIVATE)dlsym(libGL, - "glXGetProcAddressARB"); - return gladGetProcAddressPtr != NULL; -#endif - } - } - - return 0; -} - -static -void close_gl(void) { - if(libGL != NULL) { - dlclose(libGL); - libGL = NULL; - } -} -#endif - -static -void* get_proc(const char *namez) { - void* result = NULL; - if(libGL == NULL) return NULL; - -#if !defined(__APPLE__) && !defined(__HAIKU__) - if(gladGetProcAddressPtr != NULL) { - result = gladGetProcAddressPtr(namez); - } -#endif - if(result == NULL) { -#if defined(_WIN32) || defined(__CYGWIN__) - result = (void*)GetProcAddress((HMODULE) libGL, namez); -#else - result = dlsym(libGL, namez); -#endif - } - - return result; -} - -int gladLoadGL(void) { - int status = 0; - - if(open_gl()) { - status = gladLoadGLLoader(&get_proc); - close_gl(); - } - - return status; -} - struct gladGLversionStruct GLVersion = { 0, 0 }; #if defined(GL_ES_VERSION_3_0) || defined(GL_VERSION_3_0) @@ -185,7 +53,7 @@ static int get_exts(void) { exts = (const char *)glGetString(GL_EXTENSIONS); #ifdef _GLAD_IS_SOME_NEW_VERSION } else { - unsigned int index; + int index; num_exts_i = 0; glGetIntegerv(GL_NUM_EXTENSIONS, &num_exts_i); @@ -197,7 +65,7 @@ static int get_exts(void) { return 0; } - for(index = 0; index < (unsigned)num_exts_i; index++) { + for(index = 0; index < num_exts_i; index++) { const char *gl_str_tmp = (const char*)glGetStringi(GL_EXTENSIONS, index); size_t len = strlen(gl_str_tmp); diff --git a/port/fast3d/glad/glad.h b/port/fast3d/glad/glad.h index e096abac2..e0b55c5c2 100644 --- a/port/fast3d/glad/glad.h +++ b/port/fast3d/glad/glad.h @@ -1,6 +1,6 @@ /* - OpenGL loader generated by glad 0.1.36 on Thu Oct 5 16:07:54 2023. + OpenGL loader generated by glad 0.1.36 on Wed Nov 13 09:35:45 2024. Language/Generator: C/C++ Specification: gl @@ -17,15 +17,15 @@ GL_EXT_gpu_shader4, GL_KHR_debug, GL_NV_depth_clamp - Loader: True + Loader: False Local files: True Omit khrplatform: False Reproducible: False Commandline: - --profile="compatibility" --api="gl=3.2" --generator="c" --spec="gl" --local-files --extensions="GL_ARB_depth_clamp,GL_ARB_framebuffer_object,GL_ARB_texture_mirror_clamp_to_edge,GL_ARB_vertex_array_object,GL_EXT_framebuffer_blit,GL_EXT_framebuffer_multisample,GL_EXT_framebuffer_object,GL_EXT_gpu_shader4,GL_KHR_debug,GL_NV_depth_clamp" + --profile="compatibility" --api="gl=3.2" --generator="c" --spec="gl" --no-loader --local-files --extensions="GL_ARB_depth_clamp,GL_ARB_framebuffer_object,GL_ARB_texture_mirror_clamp_to_edge,GL_ARB_vertex_array_object,GL_EXT_framebuffer_blit,GL_EXT_framebuffer_multisample,GL_EXT_framebuffer_object,GL_EXT_gpu_shader4,GL_KHR_debug,GL_NV_depth_clamp" Online: - https://glad.dav1d.de/#profile=compatibility&language=c&specification=gl&loader=on&api=gl%3D3.2&extensions=GL_ARB_depth_clamp&extensions=GL_ARB_framebuffer_object&extensions=GL_ARB_texture_mirror_clamp_to_edge&extensions=GL_ARB_vertex_array_object&extensions=GL_EXT_framebuffer_blit&extensions=GL_EXT_framebuffer_multisample&extensions=GL_EXT_framebuffer_object&extensions=GL_EXT_gpu_shader4&extensions=GL_KHR_debug&extensions=GL_NV_depth_clamp + https://glad.dav1d.de/#profile=compatibility&language=c&specification=gl&api=gl%3D3.2&extensions=GL_ARB_depth_clamp&extensions=GL_ARB_framebuffer_object&extensions=GL_ARB_texture_mirror_clamp_to_edge&extensions=GL_ARB_vertex_array_object&extensions=GL_EXT_framebuffer_blit&extensions=GL_EXT_framebuffer_multisample&extensions=GL_EXT_framebuffer_object&extensions=GL_EXT_gpu_shader4&extensions=GL_KHR_debug&extensions=GL_NV_depth_clamp */ @@ -90,9 +90,6 @@ typedef void* (* GLADloadproc)(const char *name); #endif GLAPI struct gladGLversionStruct GLVersion; - -GLAPI int gladLoadGL(void); - GLAPI int gladLoadGLLoader(GLADloadproc); #include "khrplatform.h" diff --git a/port/include/fs.h b/port/include/fs.h index 24858460d..bfb21b3ec 100644 --- a/port/include/fs.h +++ b/port/include/fs.h @@ -19,7 +19,7 @@ s32 fsFileSize(const char *name); FILE *fsFileOpenWrite(const char *name); FILE *fsFileOpenRead(const char *name); -void fsFileClose(FILE *f); +void fsFileFree(FILE *f); const char *fsGetModDir(void); diff --git a/port/src/config.c b/port/src/config.c index b37c2e955..6be6f0d9f 100644 --- a/port/src/config.c +++ b/port/src/config.c @@ -228,7 +228,7 @@ s32 configSave(const char *fname) configSaveEntry(cfg, f); } - fsFileClose(f); + fsFileFree(f); return 1; } @@ -282,7 +282,7 @@ s32 configLoad(const char *fname) } } - fsFileClose(f); + fsFileFree(f); return 1; } diff --git a/port/src/fs.c b/port/src/fs.c index bb863af09..cbcec8782 100644 --- a/port/src/fs.c +++ b/port/src/fs.c @@ -276,7 +276,7 @@ FILE *fsFileOpenRead(const char *name) return fopen(fsFullPath(name), "rb"); } -void fsFileClose(FILE *f) +void fsFileFree(FILE *f) { fclose(f); } diff --git a/port/src/libultra.c b/port/src/libultra.c index 708f97bd5..465a1e62c 100644 --- a/port/src/libultra.c +++ b/port/src/libultra.c @@ -277,7 +277,7 @@ static inline void osEeepromLoad(const char *fname) FILE *fp = fsFileOpenRead(fname); if (fp) { fread(eeprom, 1, EEPROM_SIZE, fp); - fsFileClose(fp); + fsFileFree(fp); } else { sysLogPrintf(LOG_NOTE, "could not read EEPROM from `%s`: %s", fsFullPath(fname), strerror(errno)); } @@ -289,7 +289,7 @@ static inline void osEeepromSave(const char *fname) FILE* fp = fsFileOpenWrite(fname); if (fp) { fwrite(eeprom, 1, EEPROM_SIZE, fp); - fsFileClose(fp); + fsFileFree(fp); } else { sysLogPrintf(LOG_ERROR, "could not save EEPROM to `%s`: %s", fsFullPath(fname), strerror(errno)); } diff --git a/port/src/video.c b/port/src/video.c index 63be72f54..52eafc228 100644 --- a/port/src/video.c +++ b/port/src/video.c @@ -12,16 +12,28 @@ #include "../fast3d/gfx_sdl.h" #include "../fast3d/gfx_opengl.h" +#ifdef PLATFORM_NSWITCH +#define DEFAULT_VID_WIDTH 1280 +#define DEFAULT_VID_HEIGHT 720 +#define DEFAULT_VID_FULLSCREEN true +#define DEFAULT_VID_FULLSCREEN_EXCLUSIVE true +#else +#define DEFAULT_VID_WIDTH 640 +#define DEFAULT_VID_HEIGHT 480 +#define DEFAULT_VID_FULLSCREEN false +#define DEFAULT_VID_FULLSCREEN_EXCLUSIVE false +#endif + static struct GfxWindowManagerAPI *wmAPI; static struct GfxRenderingAPI *renderingAPI; static bool initDone = false; -static s32 vidWidth = 640; -static s32 vidHeight = 480; +static s32 vidWidth = DEFAULT_VID_WIDTH; +static s32 vidHeight = DEFAULT_VID_HEIGHT; static s32 vidFramebuffers = true; -static s32 vidFullscreen = false; -static s32 vidFullscreenExclusive = false; +static s32 vidFullscreen = DEFAULT_VID_FULLSCREEN; +static s32 vidFullscreenExclusive = DEFAULT_VID_FULLSCREEN_EXCLUSIVE; static s32 vidMaximize = false; static s32 vidAllowHiDpi = false; static s32 vidVsync = 1; diff --git a/src/include/platform.h b/src/include/platform.h index 949ff31a6..176fd83db 100644 --- a/src/include/platform.h +++ b/src/include/platform.h @@ -4,6 +4,9 @@ // detect OS #if defined(_WIN32) #define PLATFORM_WIN32 1 +#elif defined(__SWITCH__) + #define PLATFORM_POSIX 1 + #define PLATFORM_NSWITCH 1 #elif defined(__linux__) #define PLATFORM_POSIX 1 #define PLATFORM_LINUX 1