From 79f22a0d8c21aab6ca3c58d03a6df00a3105195b Mon Sep 17 00:00:00 2001 From: Pit64 Date: Tue, 22 Jul 2025 19:43:56 +0200 Subject: [PATCH] feat(emulator): add lr-ps2 --- Config.in | 1 + configs/recalbox-x86_64_defconfig | 1 + package/libretro-pcsx2/libretro-pcsx2.mk | 4 +- .../libretro-ps2/0001-recalbox-paths.patch | 61 +++++++++ .../0002-fix-multiarch-compilation.patch | 129 ++++++++++++++++++ package/libretro-ps2/Config.in | 13 ++ package/libretro-ps2/libretro-ps2.mk | 40 ++++++ .../recalbox-romfs2/systems/ps2/system.ini | 11 ++ .../generators/libretro/libretroRetroarch.py | 1 + 9 files changed, 259 insertions(+), 2 deletions(-) create mode 100644 package/libretro-ps2/0001-recalbox-paths.patch create mode 100644 package/libretro-ps2/0002-fix-multiarch-compilation.patch create mode 100644 package/libretro-ps2/Config.in create mode 100644 package/libretro-ps2/libretro-ps2.mk diff --git a/Config.in b/Config.in index 3601ea8cc1..c11c764474 100644 --- a/Config.in +++ b/Config.in @@ -279,6 +279,7 @@ menu "Libretro Cores" source "$BR2_EXTERNAL_RECALBOX_PATH/package/libretro-potator/Config.in" source "$BR2_EXTERNAL_RECALBOX_PATH/package/libretro-prboom/Config.in" source "$BR2_EXTERNAL_RECALBOX_PATH/package/libretro-prosystem/Config.in" + source "$BR2_EXTERNAL_RECALBOX_PATH/package/libretro-ps2/Config.in" source "$BR2_EXTERNAL_RECALBOX_PATH/package/libretro-px68k/Config.in" source "$BR2_EXTERNAL_RECALBOX_PATH/package/libretro-quasi88/Config.in" source "$BR2_EXTERNAL_RECALBOX_PATH/package/libretro-quicknes/Config.in" diff --git a/configs/recalbox-x86_64_defconfig b/configs/recalbox-x86_64_defconfig index d99a53dc44..4a6066a457 100644 --- a/configs/recalbox-x86_64_defconfig +++ b/configs/recalbox-x86_64_defconfig @@ -346,6 +346,7 @@ BR2_PACKAGE_LIBRETRO_POTATOR=y BR2_PACKAGE_LIBRETRO_PRBOOM=y BR2_PACKAGE_LIBRETRO_PROSYSTEM=y BR2_PACKAGE_LIBRETRO_PPSSPP=y +BR2_PACKAGE_LIBRETRO_PS2=y BR2_PACKAGE_LIBRETRO_PX68K=y BR2_PACKAGE_LIBRETRO_QUASI88=y BR2_PACKAGE_LIBRETRO_QUICKNES=y diff --git a/package/libretro-pcsx2/libretro-pcsx2.mk b/package/libretro-pcsx2/libretro-pcsx2.mk index 30f84593b1..0186e82bdb 100644 --- a/package/libretro-pcsx2/libretro-pcsx2.mk +++ b/package/libretro-pcsx2/libretro-pcsx2.mk @@ -4,9 +4,9 @@ # ################################################################################ -# Version: 2021-11-02 +# Commit of 2021/11/02 LIBRETRO_PCSX2_VERSION = 408e3b253847b25536ad77e4ab0c3aff6b8b896f -LIBRETRO_PCSX2_SITE = https://github.com/libretro/pcsx2.git +LIBRETRO_PCSX2_SITE = https://gitlab.com/recalbox/packages/libretro/libretro-pcsx2.git LIBRETRO_PCSX2_SITE_METHOD = git LIBRETRO_PCSX2_GIT_SUBMODULES = YES LIBRETRO_PCSX2_LICENSE = GPLv2 diff --git a/package/libretro-ps2/0001-recalbox-paths.patch b/package/libretro-ps2/0001-recalbox-paths.patch new file mode 100644 index 0000000000..54182f7b61 --- /dev/null +++ b/package/libretro-ps2/0001-recalbox-paths.patch @@ -0,0 +1,61 @@ +From 13c1ac9fcce0fc0899c0eda20dbe9a9d7b888673 Mon Sep 17 00:00:00 2001 +From: Pit64 +Date: Sat, 18 Oct 2025 20:22:04 +0200 +Subject: [PATCH 1/2] recalbox paths + +--- + libretro/main.cpp | 4 ++-- + pcsx2/Pcsx2Config.cpp | 8 ++++---- + 2 files changed, 6 insertions(+), 6 deletions(-) + +diff --git a/libretro/main.cpp b/libretro/main.cpp +index d6dd5ccad..b46fe0895 100644 +--- a/libretro/main.cpp ++++ b/libretro/main.cpp +@@ -1804,7 +1804,7 @@ void retro_init(void) + environ_cb(RETRO_ENVIRONMENT_GET_SYSTEM_DIRECTORY, &system_base); + + FileSystem::FindResultsArray results; +- if (FileSystem::FindFiles(Path::Combine(system_base, "/pcsx2/bios").c_str(), "*", FILESYSTEM_FIND_FILES, &results)) ++ if (FileSystem::FindFiles(Path::Combine(system_base, "/ps2").c_str(), "*", FILESYSTEM_FIND_FILES, &results)) + { + u32 version, region; + static constexpr u32 MIN_BIOS_SIZE = 4 * _1mb; +@@ -1908,7 +1908,7 @@ bool retro_load_game(const struct retro_game_info* game) + environ_cb(RETRO_ENVIRONMENT_SET_PIXEL_FORMAT, &format); + environ_cb(RETRO_ENVIRONMENT_GET_SYSTEM_DIRECTORY, &system_base); + +- EmuFolders::AppRoot = Path::Combine(system_base, "pcsx2"); ++ EmuFolders::AppRoot = Path::Combine(system_base, "ps2"); + EmuFolders::Resources = Path::Combine(EmuFolders::AppRoot, "resources"); + EmuFolders::DataRoot = EmuFolders::AppRoot; + +diff --git a/pcsx2/Pcsx2Config.cpp b/pcsx2/Pcsx2Config.cpp +index bec46bcbc..332c27e29 100644 +--- a/pcsx2/Pcsx2Config.cpp ++++ b/pcsx2/Pcsx2Config.cpp +@@ -1039,8 +1039,8 @@ void Pcsx2Config::CopyRuntimeConfig(Pcsx2Config& cfg) + + void EmuFolders::SetDefaults(SettingsInterface& si) + { +- si.SetStringValue("Folders", "Bios", "bios"); +- si.SetStringValue("Folders", "MemoryCards", "memcards"); ++ si.SetStringValue("Folders", "Bios", "/recalbox/share/bios/ps2"); ++ si.SetStringValue("Folders", "MemoryCards", "/recalbox/share/saves/ps2"); + si.SetStringValue("Folders", "Cheats", "cheats"); + si.SetStringValue("Folders", "CheatsWS", "cheats_ws"); + si.SetStringValue("Folders", "CheatsNI", "cheats_ni"); +@@ -1058,8 +1058,8 @@ static std::string LoadPathFromSettings(SettingsInterface& si, const std::string + + void EmuFolders::LoadConfig(SettingsInterface& si) + { +- Bios = LoadPathFromSettings(si, DataRoot, "Bios", "bios"); +- MemoryCards = LoadPathFromSettings(si, DataRoot, "MemoryCards", "memcards"); ++ Bios = LoadPathFromSettings(si, DataRoot, "Bios", "/recalbox/share/bios/ps2"); ++ MemoryCards = LoadPathFromSettings(si, DataRoot, "MemoryCards", "/recalbox/share/saves/ps2"); + Cheats = LoadPathFromSettings(si, DataRoot, "Cheats", "cheats"); + CheatsWS = LoadPathFromSettings(si, DataRoot, "CheatsWS", "cheats_ws"); + CheatsNI = LoadPathFromSettings(si, DataRoot, "CheatsNI", "cheats_ni"); +-- +2.51.1 + diff --git a/package/libretro-ps2/0002-fix-multiarch-compilation.patch b/package/libretro-ps2/0002-fix-multiarch-compilation.patch new file mode 100644 index 0000000000..5aeec9b234 --- /dev/null +++ b/package/libretro-ps2/0002-fix-multiarch-compilation.patch @@ -0,0 +1,129 @@ +From b44d5029518395b1ad4fd5c78497d016cd027c97 Mon Sep 17 00:00:00 2001 +From: Pit64 +Date: Sat, 18 Oct 2025 20:42:52 +0200 +Subject: [PATCH 2/2] fix multiarch compilation + +--- + pcsx2/CMakeLists.txt | 1 + + pcsx2/GS/MultiISA.h | 2 +- + pcsx2/SPU2/ReverbResample.cpp | 19 +++++++++++++++---- + pcsx2/SPU2/ReverbSIMP.cpp | 34 ++++++++++++++++++++++++++++++++++ + 4 files changed, 51 insertions(+), 5 deletions(-) + create mode 100644 pcsx2/SPU2/ReverbSIMP.cpp + +diff --git a/pcsx2/CMakeLists.txt b/pcsx2/CMakeLists.txt +index f3c0bcd1e..166bf4ee2 100644 +--- a/pcsx2/CMakeLists.txt ++++ b/pcsx2/CMakeLists.txt +@@ -230,6 +230,7 @@ set(pcsx2SPU2Sources + SPU2/RegTable.cpp + SPU2/Reverb.cpp + SPU2/ReverbResample.cpp ++ SPU2/ReverbSIMP.cpp + SPU2/spu2freeze.cpp + SPU2/spu2sys.cpp + ) +diff --git a/pcsx2/GS/MultiISA.h b/pcsx2/GS/MultiISA.h +index 97dbe4c8c..dc585a2ea 100644 +--- a/pcsx2/GS/MultiISA.h ++++ b/pcsx2/GS/MultiISA.h +@@ -52,7 +52,7 @@ + #define MULTI_ISA_UNSHARED_IMPL using namespace CURRENT_ISA + #else + #define MULTI_ISA_UNSHARED_START static_assert(0, "This file should not be included by multi-isa shared compilation!"); +- #define MULTI_ISA_UNSHARED_IMPL static_assert(0, "This file should be compiled unshared in multi-isa mode!"); ++ #define MULTI_ISA_UNSHARED_IMPL /* static_assert(0, "This file should be compiled unshared in multi-isa mode!"); */ + #define MULTI_ISA_UNSHARED_END + #endif + +diff --git a/pcsx2/SPU2/ReverbResample.cpp b/pcsx2/SPU2/ReverbResample.cpp +index 9bf223228..197fe9519 100644 +--- a/pcsx2/SPU2/ReverbResample.cpp ++++ b/pcsx2/SPU2/ReverbResample.cpp +@@ -1,7 +1,7 @@ + #include "../GS/GSVector.h" + #include "Global.h" + +-MULTI_ISA_UNSHARED_START ++// MULTI_ISA_UNSHARED_START + + static constexpr u32 NUM_TAPS = 39; + // 39 tap filter, the 0's could be optimized out +@@ -128,7 +128,7 @@ s32 __forceinline ReverbDownsample_sse(V_Core& core, bool right) + return acc.I16[0]; + } + +-s32 ReverbDownsample(V_Core& core, bool right) ++s32 Internal_ReverbDownsample(V_Core& core, bool right) + { + #if _M_SSE >= 0x501 + return ReverbDownsample_avx(core, right); +@@ -239,7 +239,7 @@ StereoOut32 __forceinline ReverbUpsample_sse(V_Core& core) + return {lacc.I16[0], racc.I16[0]}; + } + +-StereoOut32 ReverbUpsample(V_Core& core) ++StereoOut32 Internal_ReverbUpsample(V_Core& core) + { + #if _M_SSE >= 0x501 + return ReverbUpsample_avx(core); +@@ -248,4 +248,15 @@ StereoOut32 ReverbUpsample(V_Core& core) + #endif + } + +-MULTI_ISA_UNSHARED_END ++// MULTI_ISA_UNSHARED_END ++ ++// Add function pointer initialization ++namespace ++{ ++ struct FunctionInitializer ++ { ++ FunctionInitializer() { ReverbDownsample = Internal_ReverbDownsample; ReverbUpsample = Internal_ReverbUpsample; } ++ }; ++ ++ static FunctionInitializer initializer; ++} +diff --git a/pcsx2/SPU2/ReverbSIMP.cpp b/pcsx2/SPU2/ReverbSIMP.cpp +new file mode 100644 +index 000000000..525287de3 +--- /dev/null ++++ b/pcsx2/SPU2/ReverbSIMP.cpp +@@ -0,0 +1,34 @@ ++#include "Global.h" ++ ++extern s32 Internal_ReverbDownsample(V_Core& core, bool right); ++extern StereoOut32 Internal_ReverbUpsample(V_Core& core); ++ ++namespace isa_avx { ++ s32 ReverbDownsample(V_Core& core, bool right) { ++ return Internal_ReverbDownsample(core, right); ++ } ++ ++ StereoOut32 ReverbUpsample(V_Core& core) { ++ return Internal_ReverbUpsample(core); ++ } ++} ++ ++namespace isa_avx2 { ++ s32 ReverbDownsample(V_Core& core, bool right) { ++ return Internal_ReverbDownsample(core, right); ++ } ++ ++ StereoOut32 ReverbUpsample(V_Core& core) { ++ return Internal_ReverbUpsample(core); ++ } ++} ++ ++namespace isa_sse4 { ++ s32 ReverbDownsample(V_Core& core, bool right) { ++ return Internal_ReverbDownsample(core, right); ++ } ++ ++ StereoOut32 ReverbUpsample(V_Core& core) { ++ return Internal_ReverbUpsample(core); ++ } ++} +-- +2.51.1 + diff --git a/package/libretro-ps2/Config.in b/package/libretro-ps2/Config.in new file mode 100644 index 0000000000..ec622981ff --- /dev/null +++ b/package/libretro-ps2/Config.in @@ -0,0 +1,13 @@ +config BR2_PACKAGE_LIBRETRO_PS2 + bool "libretro-ps2" + depends on BR2_PACKAGE_RETROARCH + depends on BR2_INSTALL_LIBSTDCPP + depends on BR2_PACKAGE_XZ + select BR2_PACKAGE_LIBAIO + help + A Sony PS2 libretro core. + + https://www.libretro.com + +comment "LIBRETRO_PS2 needs a toolchain w/ C++" + depends on !BR2_INSTALL_LIBSTDCPP diff --git a/package/libretro-ps2/libretro-ps2.mk b/package/libretro-ps2/libretro-ps2.mk new file mode 100644 index 0000000000..2f0b650030 --- /dev/null +++ b/package/libretro-ps2/libretro-ps2.mk @@ -0,0 +1,40 @@ +################################################################################ +# +# libretro-ps2 +# +################################################################################ + +# https://github.com/libretro/ps2/commits/libretroization/ +# Commit of 2025/09/29 +LIBRETRO_PS2_VERSION = 9485a53fa5aa2bff17e04518116107f81a8c82e3 +LIBRETRO_PS2_SITE = https://github.com/libretro/ps2.git +LIBRETRO_PS2_SITE_METHOD = git +LIBRETRO_PS2_GIT_SUBMODULES = YES +LIBRETRO_PS2_LICENSE = GPLv2 +LIBRETRO_PS2_DEPENDENCIES = libaio xz host-xxd retroarch + +LIBRETRO_PS2_SUPPORTS_IN_SOURCE_BUILD = NO + +LIBRETRO_PS2_CONF_OPTS += -DCMAKE_BUILD_TYPE=Release +LIBRETRO_PS2_CONF_OPTS += -DBUILD_SHARED_LIBS=OFF +LIBRETRO_PS2_CONF_OPTS += -DLIBRETRO=ON +LIBRETRO_PS2_CONF_OPTS += -DBUILD_REGRESS=OFF +LIBRETRO_PS2_CONF_OPTS += -DBUILD_TOOLS=OFF +LIBRETRO_PS2_CONF_OPTS += -DUSE_OPENGL=ON +LIBRETRO_PS2_CONF_OPTS += -DDISABLE_ADVANCE_SIMD=ON + +ifeq ($(BR2_PACKAGE_RECALBOX_HAS_VULKAN),y) +LIBRETRO_PS2_DEPENDENCIES += vulkan-headers +LIBRETRO_PS2_CONF_OPTS += -DUSE_VULKAN=ON +endif + +define LIBRETRO_PS2_INSTALL_TARGET_CMDS + $(INSTALL) -D $(@D)/buildroot-build/bin/pcsx2_libretro.so \ + $(TARGET_DIR)/usr/lib/libretro/ps2_libretro.so + mkdir -p $(TARGET_DIR)/recalbox/share_upgrade/bios/ps2 + mkdir -p $(TARGET_DIR)/recalbox/share_upgrade/bios/ps2/resources + cp -R $(@D)/bin/resources/GameIndex.yaml \ + $(TARGET_DIR)/recalbox/share_upgrade/bios/ps2/resources +endef + +$(eval $(cmake-package)) diff --git a/package/recalbox-romfs2/systems/ps2/system.ini b/package/recalbox-romfs2/systems/ps2/system.ini index 45fe8baf39..be567690f2 100644 --- a/package/recalbox-romfs2/systems/ps2/system.ini +++ b/package/recalbox-romfs2/systems/ps2/system.ini @@ -62,3 +62,14 @@ softpatching = 0 compatibility = good speed = good +[core.2] +package = BR2_PACKAGE_LIBRETRO_PS2 +priority = 3 +emulator = "libretro" +core = "ps2" +extensions = ".bin .chd .cso .gz .img .iso .mdf .nrg" +netplay = 0 +softpatching = 0 +compatibility = good +speed = good + diff --git a/projects/configgen/configgen/generators/libretro/libretroRetroarch.py b/projects/configgen/configgen/generators/libretro/libretroRetroarch.py index 98c380e33d..ae41b6f5b7 100755 --- a/projects/configgen/configgen/generators/libretro/libretroRetroarch.py +++ b/projects/configgen/configgen/generators/libretro/libretroRetroarch.py @@ -57,6 +57,7 @@ class LibretroRetroarch: 'neogeocd', 'ngpc', 'pcfx', + 'ps2', 'psp', 'psx', 'sega32x', -- GitLab