diff --git a/Makefile.libnx b/Makefile.libnx index 547f8d3060..e6b53a9c45 100644 --- a/Makefile.libnx +++ b/Makefile.libnx @@ -100,19 +100,24 @@ EXEFS_SRC := exefs_src #ROMFS := switch/romfs APP_TITLE := RetroArch -APP_VERSION := 1.0.0 +APP_VERSION := 1.7.5 APP_AUTHOR := libretro Team -NO_ICON := 1 +APP_ICON := pkg/libnx/retroarch.jpg #--------------------------------------------------------------------------------- # options for code generation #--------------------------------------------------------------------------------- ARCH := -march=armv8-a -mtune=cortex-a57 -mtp=soft -fPIE -mcpu=cortex-a57+crc+fp+simd -CFLAGS := -g -Wall -O3 -ffast-math -ffunction-sections \ - $(ARCH) $(DEFINES) -Ideps -Ideps/libz -Ilibretro-common/include -Ideps/stb -I$(LIBNX)/include -I$(PORTLIBS)/include/ -include $(LIBNX)/include/switch.h $(shell $(DEVKITPRO)/portlibs/switch/bin/freetype-config --cflags) +CFLAGS := -g -Wall -O3 -ffast-math -ffunction-sections \ + $(ARCH) $(DEFINES) -Ideps -Ideps/libz -Ilibretro-common/include -Ideps/stb -I$(LIBNX)/include -I$(PORTLIBS)/include/ -include $(LIBNX)/include/switch.h $(shell $(PORTLIBS)/bin/freetype-config --cflags) -CFLAGS += $(INCLUDE) -DSWITCH=1 -DHAVE_LIBNX=1 -DNXLINK=1 -DHAVE_SHADERPIPELINE -DHAVE_FREETYPE +CFLAGS += $(INCLUDE) -DSWITCH=1 -DHAVE_LIBNX=1 -DNXLINK=1 -DHAVE_SHADERPIPELINE -DHAVE_UPDATE_ASSETS -DHAVE_FREETYPE + +ifeq ($(strip $(HAVE_STATIC_DUMMY)),1) + HAVE_STATIC_DUMMY = 1 + CFLAGS += -DHAVE_STATIC_DUMMY=1 +endif # The following line works around an issue in newlib that produces a compilation # error in glm. It will be removed as soon as this issue is resolved. @@ -169,7 +174,12 @@ else endif #--------------------------------------------------------------------------------- -export OFILES := $(OBJ) libretro_libnx.a +export OFILES := $(OBJ) + +ifeq ($(strip $(HAVE_STATIC_DUMMY)),) + OFILES += libretro_libnx.a +endif + export HFILES_BIN := $(addsuffix .h,$(subst .,_,$(BINFILES))) export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \ diff --git a/configuration.c b/configuration.c index fae1a05383..d8c8018b8d 100644 --- a/configuration.c +++ b/configuration.c @@ -1879,7 +1879,11 @@ static void config_set_defaults(void) for (i = 0; i < MAX_USERS; i++) { settings->uints.input_joypad_map[i] = i; +#ifdef SWITCH // Switch prefered default dpad mode + settings->uints.input_analog_dpad_mode[i] = ANALOG_DPAD_LSTICK; +#else settings->uints.input_analog_dpad_mode[i] = ANALOG_DPAD_NONE; +#endif input_config_set_device(i, RETRO_DEVICE_JOYPAD); settings->uints.input_mouse_index[i] = 0; } diff --git a/cores/dynamic_dummy.c b/cores/dynamic_dummy.c index ad61faff97..21b8014a85 100644 --- a/cores/dynamic_dummy.c +++ b/cores/dynamic_dummy.c @@ -25,6 +25,34 @@ static uint16_t *dummy_frame_buf; +#if defined(HAVE_LIBNX) && defined(HAVE_STATIC_DUMMY) +void retro_init(void) { libretro_dummy_retro_init(); } +void retro_deinit(void) { libretro_dummy_retro_deinit(); } +unsigned retro_api_version(void) { return libretro_dummy_retro_api_version(); } +void retro_set_controller_port_device(unsigned port, unsigned device) { libretro_dummy_retro_set_controller_port_device(port, device); } +void retro_get_system_info(struct retro_system_info *info) { libretro_dummy_retro_get_system_info(info); } +void retro_get_system_av_info(struct retro_system_av_info *info) { retro_get_system_av_info(info); } +void retro_set_environment(retro_environment_t cb) { libretro_dummy_retro_set_environment(cb); } +void retro_set_audio_sample(retro_audio_sample_t cb) { libretro_dummy_retro_set_audio_sample(cb); } +void retro_set_audio_sample_batch(retro_audio_sample_batch_t cb) { libretro_dummy_retro_set_audio_sample_batch(cb); } +void retro_set_input_poll(retro_input_poll_t cb) { libretro_dummy_retro_set_input_poll(cb); } +void retro_set_input_state(retro_input_state_t cb) { libretro_dummy_retro_set_input_state(cb); } +void retro_set_video_refresh(retro_video_refresh_t cb) { libretro_dummy_retro_set_video_refresh(cb); } +void retro_reset(void) { libretro_dummy_retro_reset(); } +void retro_run(void) { libretro_dummy_retro_run(); } +bool retro_load_game(const struct retro_game_info *info) { return libretro_dummy_retro_load_game(info); } +void retro_unload_game(void) { libretro_dummy_retro_unload_game(); } +unsigned retro_get_region(void) { return libretro_dummy_retro_get_region(); } +bool retro_load_game_special(unsigned type, const struct retro_game_info *info, size_t num) { return libretro_dummy_retro_load_game_special(type, info, num); } +size_t retro_serialize_size(void) { return libretro_dummy_retro_serialize_size(); } +bool retro_serialize(void *data, size_t size) { return libretro_dummy_retro_serialize(data, size); } +bool retro_unserialize(const void *data, size_t size) { return libretro_dummy_retro_unserialize(data, size); } +void *retro_get_memory_data(unsigned id) { return libretro_dummy_retro_get_memory_data(id); } +size_t retro_get_memory_size(unsigned id) { return libretro_dummy_retro_get_memory_size(id); } +void retro_cheat_reset(void) { libretro_dummy_retro_cheat_reset(); } +void retro_cheat_set(unsigned idx, bool enabled, const char *code) { libretro_dummy_retro_cheat_set(idx, enabled, code); } +#endif + void libretro_dummy_retro_init(void) { unsigned i; diff --git a/dist-scripts/dist-cores.sh b/dist-scripts/dist-cores.sh index 16264dee8f..19cfee87c8 100755 --- a/dist-scripts/dist-cores.sh +++ b/dist-scripts/dist-cores.sh @@ -40,7 +40,6 @@ mkdir -p ../pkg/vita/vpk elif [ $PLATFORM = "libnx" ] ; then platform=libnx EXT=a -mkdir -p ../pkg/${platform}/build/romfs # CTR/3DS elif [ $PLATFORM = "ctr" ] ; then @@ -269,7 +268,7 @@ for f in `ls -v *_${platform}.${EXT}`; do mv -f ../retroarch_3ds.3ds ../pkg/${platform}/build/rom/${name}_libretro.3ds elif [ $PLATFORM = "libnx" ] ; then mkdir -p ../pkg/${platform}/retroarch/cores/ - mv -f ../retroarch_switch.nro ../pkg/${platform}/retroarch/cores/${name}_libretro.nro + mv -f ../retroarch_switch.nro ../pkg/${platform}/retroarch/cores/${name}_libretro_${platform}.nro elif [ $PLATFORM = "unix" ] ; then mv -f ../retroarch ../pkg/${platform}/${name}_libretro.elf elif [ $PLATFORM = "ngc" ] ; then diff --git a/frontend/drivers/platform_switch.c b/frontend/drivers/platform_switch.c index 9157f71366..171d05d8ac 100644 --- a/frontend/drivers/platform_switch.c +++ b/frontend/drivers/platform_switch.c @@ -35,6 +35,7 @@ #include "../../retroarch.h" #include "../../file_path_special.h" #include "../../audio/audio_driver.h" +#include #ifndef IS_SALAMANDER #ifdef HAVE_MENU @@ -105,18 +106,18 @@ static void frontend_switch_get_environment_settings(int *argc, char *argv[], vo fill_pathname_basedir(g_defaults.dirs[DEFAULT_DIR_PORT], SD_PREFIX "/retroarch/retroarch_switch.nro", sizeof(g_defaults.dirs[DEFAULT_DIR_PORT])); RARCH_LOG("port dir: [%s]\n", g_defaults.dirs[DEFAULT_DIR_PORT]); - fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_CORE_ASSETS], g_defaults.dirs[DEFAULT_DIR_PORT], - "downloads", sizeof(g_defaults.dirs[DEFAULT_DIR_CORE_ASSETS])); - - fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_ASSETS], g_defaults.dirs[DEFAULT_DIR_PORT], - "media", sizeof(g_defaults.dirs[DEFAULT_DIR_ASSETS])); - fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_CORE], g_defaults.dirs[DEFAULT_DIR_PORT], "cores", sizeof(g_defaults.dirs[DEFAULT_DIR_CORE])); - fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_CORE_INFO], g_defaults.dirs[DEFAULT_DIR_CORE], + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_CORE_INFO], g_defaults.dirs[DEFAULT_DIR_PORT], "info", sizeof(g_defaults.dirs[DEFAULT_DIR_CORE_INFO])); + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_AUTOCONFIG], g_defaults.dirs[DEFAULT_DIR_PORT], + "autoconfig", sizeof(g_defaults.dirs[DEFAULT_DIR_AUTOCONFIG])); + + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_ASSETS], g_defaults.dirs[DEFAULT_DIR_PORT], + "assets", sizeof(g_defaults.dirs[DEFAULT_DIR_ASSETS])); + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_SAVESTATE], g_defaults.dirs[DEFAULT_DIR_CORE], "savestates", sizeof(g_defaults.dirs[DEFAULT_DIR_SAVESTATE])); @@ -126,24 +127,56 @@ static void frontend_switch_get_environment_settings(int *argc, char *argv[], vo fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_SYSTEM], g_defaults.dirs[DEFAULT_DIR_CORE], "system", sizeof(g_defaults.dirs[DEFAULT_DIR_SYSTEM])); - fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_PLAYLIST], g_defaults.dirs[DEFAULT_DIR_CORE], - "playlists", sizeof(g_defaults.dirs[DEFAULT_DIR_PLAYLIST])); - fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_MENU_CONFIG], g_defaults.dirs[DEFAULT_DIR_PORT], "config", sizeof(g_defaults.dirs[DEFAULT_DIR_MENU_CONFIG])); - fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_REMAP], g_defaults.dirs[DEFAULT_DIR_PORT], - "config/remaps", sizeof(g_defaults.dirs[DEFAULT_DIR_REMAP])); + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_REMAP], g_defaults.dirs[DEFAULT_DIR_MENU_CONFIG], + "remaps", sizeof(g_defaults.dirs[DEFAULT_DIR_REMAP])); - fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_VIDEO_FILTER], g_defaults.dirs[DEFAULT_DIR_PORT], - "filters", sizeof(g_defaults.dirs[DEFAULT_DIR_REMAP])); + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_PLAYLIST], g_defaults.dirs[DEFAULT_DIR_PORT], + "playlists", sizeof(g_defaults.dirs[DEFAULT_DIR_PLAYLIST])); - fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_DATABASE], g_defaults.dirs[DEFAULT_DIR_PORT], - "database/rdb", sizeof(g_defaults.dirs[DEFAULT_DIR_DATABASE])); + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_RECORD_CONFIG], g_defaults.dirs[DEFAULT_DIR_PORT], + "records_config", sizeof(g_defaults.dirs[DEFAULT_DIR_RECORD_CONFIG])); + + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_RECORD_OUTPUT], g_defaults.dirs[DEFAULT_DIR_PORT], + "records", sizeof(g_defaults.dirs[DEFAULT_DIR_RECORD_OUTPUT])); fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_CURSOR], g_defaults.dirs[DEFAULT_DIR_PORT], "database/cursors", sizeof(g_defaults.dirs[DEFAULT_DIR_CURSOR])); + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_DATABASE], g_defaults.dirs[DEFAULT_DIR_PORT], + "database/rdb", sizeof(g_defaults.dirs[DEFAULT_DIR_DATABASE])); + + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_VIDEO_FILTER], g_defaults.dirs[DEFAULT_DIR_PORT], + "filters", sizeof(g_defaults.dirs[DEFAULT_DIR_REMAP])); + + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_SHADER], g_defaults.dirs[DEFAULT_DIR_PORT], + "shaders", sizeof(g_defaults.dirs[DEFAULT_DIR_SHADER])); + + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_CHEATS], g_defaults.dirs[DEFAULT_DIR_PORT], + "cheats", sizeof(g_defaults.dirs[DEFAULT_DIR_CHEATS])); + + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_OVERLAY], g_defaults.dirs[DEFAULT_DIR_PORT], + "overlay", sizeof(g_defaults.dirs[DEFAULT_DIR_OVERLAY])); + + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_CORE_ASSETS], g_defaults.dirs[DEFAULT_DIR_PORT], + "downloads", sizeof(g_defaults.dirs[DEFAULT_DIR_CORE_ASSETS])); + + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_SCREENSHOT], g_defaults.dirs[DEFAULT_DIR_PORT], + "screenshots", sizeof(g_defaults.dirs[DEFAULT_DIR_SCREENSHOT])); + + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_THUMBNAILS], g_defaults.dirs[DEFAULT_DIR_PORT], + "thumbnails", sizeof(g_defaults.dirs[DEFAULT_DIR_THUMBNAILS])); + + int i = 0; + for (i; i < DEFAULT_DIR_LAST; i++) + { + const char *dir_path = g_defaults.dirs[i]; + if (!string_is_empty(dir_path)) + path_mkdir(dir_path); + } + fill_pathname_join(g_defaults.path.config, g_defaults.dirs[DEFAULT_DIR_PORT], file_path_str(FILE_PATH_MAIN_CONFIG), sizeof(g_defaults.path.config)); } diff --git a/pkg/libnx/retroarch.jpg b/pkg/libnx/retroarch.jpg new file mode 100644 index 0000000000..30b51136e8 Binary files /dev/null and b/pkg/libnx/retroarch.jpg differ diff --git a/tasks/task_autodetect.c b/tasks/task_autodetect.c index 5da349b32b..4f8ac88943 100644 --- a/tasks/task_autodetect.c +++ b/tasks/task_autodetect.c @@ -843,12 +843,8 @@ static void input_autoconfigure_connect_handler(retro_task_t *task) if (!params || string_is_empty(params->name)) goto end; -#ifndef HAVE_LIBNX // This seems to be problematic on switch with threading if ( !input_autoconfigure_joypad_from_conf_dir(params, task) && !input_autoconfigure_joypad_from_conf_internal(params, task)) -#else - if ( !input_autoconfigure_joypad_from_conf_internal(params, task)) -#endif { char msg[255];