Merge pull request #10951 from fjtrujy/salamanderPS2

WIP: PS2 Salamander and multi-core
This commit is contained in:
Autechre 2020-07-01 21:18:53 +02:00 committed by GitHub
commit 043a60633f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 199 additions and 97 deletions

View File

@ -6,12 +6,11 @@ HAVE_THREADS = 0
MUTE_WARNINGS = 1
PS2_IP = 192.168.1.150
TARGET = retroarchps2.elf
TARGET_RELEASE = retroarchps2-release.elf
TARGET = retroarchps2-debug.elf
TARGET_RELEASE = retroarchps2.elf
# Compile the IRXs first
IRX_DIR = ps2/irx
IRX_FILES = $(wildcard ps2/irx/*.c)
ifeq ($(DEBUG), 1)
OPTIMIZE_LV := -O0 -g
@ -36,7 +35,7 @@ RARCH_DEFINES += -DHAVE_ZLIB -DHAVE_NO_BUILTINZLIB -DHAVE_RPNG -DHAVE_RJPEG -DHA
LDFLAGS += -L$(PS2DEV)/gsKit/lib -L$(PS2SDK)/ports/lib -L.
# Lib cdvd is needed to get proper time
LIBS += -lretro_ps2 -lpatches -lpoweroff -lgskit -ldmakit -laudsrv -lpadx -lmtap -lz -lcdvd
LIBS += -lretro_ps2 -lpatches -lpoweroff -lgskit -ldmakit -laudsrv -lpadx -lmtap -lz -lcdvd -lelf-loader
ifeq ($(BUILD_FOR_PCSX2), 1)
RARCH_DEFINES += -DBUILD_FOR_PCSX2

103
Makefile.ps2.salamander Normal file
View File

@ -0,0 +1,103 @@
BUILD_FOR_PCSX2 = 0
DEBUG = 0
HAVE_FILE_LOGGER = 0
MUTE_WARNINGS = 1
PS2_IP = 192.168.1.150
TARGET = raboot-debug.elf
TARGET_RELEASE = raboot.elf
# Compile the IRXs first
IRX_DIR = ps2/irx
ifeq ($(DEBUG), 1)
OPTIMIZE_LV := -O0 -g
RARCH_DEFINES += -DDEBUG
else
OPTIMIZE_LV := -O3
LDFLAGS := -s
endif
ifeq ($(MUTE_WARNINGS), 1)
DISABLE_WARNINGS := -Wno-sign-compare -Wno-unused -Wno-parentheses
endif
INCDIR = -Ilibretro-common/include
INCDIR += -Ips2/include
CFLAGS = $(OPTIMIZE_LV) $(DISABLE_WARNINGS) -ffast-math -fsingle-precision-constant
ASFLAGS = $(CFLAGS)
RARCH_DEFINES += -DPS2 -DIS_SALAMANDER -DRARCH_CONSOLE
LIBDIR =
LDFLAGS =
LIBS = -lm -lelf-loader -lpatches -lpoweroff
ifeq ($(BUILD_FOR_PCSX2), 1)
RARCH_DEFINES += -DBUILD_FOR_PCSX2
endif
ifeq ($(HAVE_FILE_LOGGER), 1)
CFLAGS += -DHAVE_FILE_LOGGER
endif
CFLAGS += $(RARCH_DEFINES)
EE_OBJS = frontend/frontend_salamander.o \
frontend/frontend_driver.o \
frontend/drivers/platform_ps2.o \
libretro-common/file/file_path.o \
libretro-common/file/file_path_io.o \
libretro-common/string/stdstring.o \
libretro-common/lists/string_list.o \
libretro-common/lists/dir_list.o \
libretro-common/file/retro_dirent.o \
libretro-common/encodings/encoding_utf.o \
libretro-common/compat/fopen_utf8.o \
libretro-common/compat/compat_strl.o \
libretro-common/compat/compat_strcasestr.o \
libretro-common/file/config_file.o \
libretro-common/streams/file_stream.o \
libretro-common/vfs/vfs_implementation.o \
libretro-common/hash/rhash.o \
libretro-common/time/rtime.o \
file_path_str.o \
verbosity.o \
ps2/compat_files/ps2_devices.o
# Needed IRX objects
EE_OBJS += $(IRX_DIR)/freesio2_irx.o $(IRX_DIR)/iomanX_irx.o $(IRX_DIR)/cdfs_irx.o
EE_OBJS += $(IRX_DIR)/fileXio_irx.o $(IRX_DIR)/mcman_irx.o $(IRX_DIR)/mcserv_irx.o $(IRX_DIR)/usbd_irx.o
EE_OBJS += $(IRX_DIR)/usbhdfsd_irx.o $(IRX_DIR)/freesd_irx.o $(IRX_DIR)/poweroff_irx.o
EE_CFLAGS = $(CFLAGS)
EE_CXXFLAGS = $(CFLAGS)
EE_LDFLAGS = $(LDFLAGS)
EE_LIBS = $(LIBS)
EE_ASFLAGS = $(ASFLAGS)
EE_INCS = $(INCDIR)
EE_BIN = $(TARGET)
EE_GPVAL = $(GPVAL)
all: irxdir $(EE_BIN)
irxdir:
$(MAKE) -C $(IRX_DIR)
clean:
rm -f $(EE_BIN) $(EE_OBJS)
$(MAKE) -C $(IRX_DIR) clean
debug: clean all run
run:
ps2client -h $(PS2_IP) execee host:$(EE_BIN)
package:
ps2-packer $(EE_BIN) $(TARGET_RELEASE)
release: clean all package
#Include preferences
include $(PS2SDK)/samples/Makefile.pref
include $(PS2SDK)/samples/Makefile.eeglobal_cpp

View File

@ -20,8 +20,9 @@ cd dist-scripts
elif [ $PLATFORM = "ps2" ] ; then
platform=ps2
SALAMANDER=NO
SALAMANDER=yes
EXT=a
OPTS=release
mkdir -p ../pkg/${platform}/cores/
@ -151,6 +152,9 @@ fi
# Compile Salamander core
if [ $SALAMANDER = "yes" ]; then
make -C ../ -f Makefile.${platform}.salamander $OPTS || exit 1
if [ $PLATFORM = "ps2" ] ; then
mv -f ../raboot.elf ../pkg/${platform}/raboot.PBP
fi
if [ $PLATFORM = "psp1" ] ; then
mv -f ../EBOOT.PBP ../pkg/${platform}/EBOOT.PBP
fi
@ -249,15 +253,13 @@ for f in `ls -v *_${platform}.${EXT}`; do
make -C ../ -f Makefile.${platform} $OPTS APP_TITLE="$name" LIBRETRO=$name $whole_archive $big_stack -j3 || exit 1
elif [ $PLATFORM = "ps2" ]; then
# TODO PS2 should be able to compile in parallel
make -C ../ -f Makefile.${platform} $OPTS $whole_archive $big_stack || exit 1
make -C ../ -f Makefile.${platform} $OPTS || exit 1
else
make -C ../ -f Makefile.${platform} $OPTS $whole_archive $big_stack -j3 || exit 1
fi
# Do manual executable step
if [ $PLATFORM = "ps2" ] ; then
make -C ../ -f Makefile.${platform} package -j3
elif [ $PLATFORM = "dex-ps3" ] ; then
if [ $PLATFORM = "dex-ps3" ] ; then
$MAKE_FSELF_NPDRM -c ../retroarch_${platform}.elf ../CORE.SELF
elif [ $PLATFORM = "cex-ps3" ] ; then
$SCETOOL_PATH $SCETOOL_FLAGS_CORE ../retroarch_${platform}.elf ../CORE.SELF
@ -287,7 +289,7 @@ for f in `ls -v *_${platform}.${EXT}`; do
fi
fi
elif [ $PLATFORM = "ps2" ] ; then
mv -f ../retroarchps2-release.elf ../pkg/${platform}/cores/retroarchps2_${name}.elf
mv -f ../retroarchps2.elf ../pkg/${platform}/cores/${name}_libretro_${platform}.elf
elif [ $PLATFORM = "psp1" ] ; then
mv -f ../EBOOT.PBP ../pkg/${platform}/cores/${name}_libretro.PBP
elif [ $PLATFORM = "vita" ] ; then
@ -330,6 +332,7 @@ for f in `ls -v *_${platform}.${EXT}`; do
rm -f ../retroarch_${platform}.elf ../retroarch_${platform}.self ../CORE.SELF
elif [ $PLATFORM = "ps2" ] ; then
rm -f ../retroarchps2.elf
rm -f ../retroarchps2-debug.elf
elif [ $PLATFORM = "psp1" ] ; then
rm -f ../retroarchpsp.elf
elif [ $PLATFORM = "vita" ] ; then

View File

@ -13,50 +13,46 @@
*/
#include <stdint.h>
#include "../frontend_driver.h"
#include <loadfile.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <kernel.h>
#include <sbv_patches.h>
#include <sifrpc.h>
#include <iopcontrol.h>
#include <libpwroff.h>
#include <libmtap.h>
#include <audsrv.h>
#include <libpad.h>
#include <ps2_devices.h>
#include <ps2_irx_variables.h>
#include <loadfile.h>
#include <file/file_path.h>
#include <string/stdstring.h>
#include "../frontend_driver.h"
#include "../../defaults.h"
#include "../../file_path_special.h"
#include "../../verbosity.h"
#include <elf-loader.h>
static char eboot_path[512];
static char user_path[512];
static enum frontend_fork ps2_fork_mode = FRONTEND_FORK_NONE;
static int bootDeviceID;
char cwd[FILENAME_MAX];
static void create_path_names(void)
{
char cwd[FILENAME_MAX];
int bootDeviceID;
char user_path[FILENAME_MAX];
#if defined(BUILD_FOR_PCSX2)
strlcpy(cwd, rootDevicePath(BOOT_DEVICE_MC0), sizeof(cwd));
#else
getcwd(cwd, sizeof(cwd));
bootDeviceID=getBootDeviceID(cwd);
strlcpy(cwd, rootDevicePath(bootDeviceID), sizeof(cwd));
#endif
strcat(cwd, "RETROARCH");
strlcpy(user_path, rootDevicePath(bootDeviceID), rootDevicePath(bootDeviceID));
strcat(user_path, "RETROARCH");
// Content in the same folder
fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_CORE], cwd,
"cores", sizeof(g_defaults.dirs[DEFAULT_DIR_CORE]));
fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_CORE_INFO], cwd,
"info", sizeof(g_defaults.dirs[DEFAULT_DIR_CORE_INFO]));
strlcpy(eboot_path, cwd, sizeof(eboot_path));
strlcpy(g_defaults.dirs[DEFAULT_DIR_PORT], eboot_path, sizeof(g_defaults.dirs[DEFAULT_DIR_PORT]));
strlcpy(user_path, eboot_path, sizeof(user_path));
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_PORT],
"INFO", sizeof(g_defaults.dirs[DEFAULT_DIR_CORE_INFO]));
/* user data */
fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_CHEATS], user_path,
"CHEATS", sizeof(g_defaults.dirs[DEFAULT_DIR_CHEATS]));
fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_MENU_CONFIG], user_path,
@ -95,6 +91,20 @@ static void poweroffCallback(void *arg)
poweroffShutdown();
}
static void reset_IOP()
{
SifInitRpc(0);
#if !defined(DEBUG) || defined(BUILD_FOR_PCSX2)
/* Comment this line if you don't wanna debug the output */
while(!SifIopReset(NULL, 0)){};
#endif
while(!SifIopSync()){};
SifInitRpc(0);
sbv_patch_enable_lmb();
sbv_patch_disable_prefix_check();
}
static void frontend_ps2_get_environment_settings(int *argc, char *argv[],
void *args, void *params_data)
{
@ -103,7 +113,7 @@ static void frontend_ps2_get_environment_settings(int *argc, char *argv[],
#ifndef IS_SALAMANDER
if (!string_is_empty(argv[1]))
{
static char path[PATH_MAX_LENGTH] = {0};
static char path[FILENAME_MAX] = {0};
struct rarch_main_wrap *args =
(struct rarch_main_wrap*)params_data;
@ -122,7 +132,6 @@ static void frontend_ps2_get_environment_settings(int *argc, char *argv[],
RARCH_LOG("argv[0]: %s\n", argv[0]);
RARCH_LOG("argv[1]: %s\n", argv[1]);
RARCH_LOG("argv[2]: %s\n", argv[2]);
RARCH_LOG("Auto-start game %s.\n", argv[1]);
}
@ -139,18 +148,7 @@ static void frontend_ps2_get_environment_settings(int *argc, char *argv[],
static void frontend_ps2_init(void *data)
{
char cwd[FILENAME_MAX];
int bootDeviceID;
SifInitRpc(0);
#if !defined(DEBUG) || defined(BUILD_FOR_PCSX2)
/* Comment this line if you don't wanna debug the output */
while (!SifIopReset(NULL, 0)) { };
#endif
while (!SifIopSync()) { };
SifInitRpc(0);
sbv_patch_enable_lmb();
reset_IOP();
/* I/O Files */
SifExecModuleBuffer(&iomanX_irx, size_iomanX_irx, 0, NULL, NULL);
@ -161,21 +159,22 @@ static void frontend_ps2_init(void *data)
SifExecModuleBuffer(&mcman_irx, size_mcman_irx, 0, NULL, NULL);
SifExecModuleBuffer(&mcserv_irx, size_mcserv_irx, 0, NULL, NULL);
/* Controllers */
SifExecModuleBuffer(&freemtap_irx, size_freemtap_irx, 0, NULL, NULL);
SifExecModuleBuffer(&freepad_irx, size_freepad_irx, 0, NULL, NULL);
/* USB */
SifExecModuleBuffer(&usbd_irx, size_usbd_irx, 0, NULL, NULL);
SifExecModuleBuffer(&usbhdfsd_irx, size_usbhdfsd_irx, 0, NULL, NULL);
/* CDFS */
SifExecModuleBuffer(&cdfs_irx, size_cdfs_irx, 0, NULL, NULL);
#ifndef IS_SALAMANDER
/* Controllers */
SifExecModuleBuffer(&freemtap_irx, size_freemtap_irx, 0, NULL, NULL);
SifExecModuleBuffer(&freepad_irx, size_freepad_irx, 0, NULL, NULL);
/* Audio */
SifExecModuleBuffer(&freesd_irx, size_freesd_irx, 0, NULL, NULL);
SifExecModuleBuffer(&audsrv_irx, size_audsrv_irx, 0, NULL, NULL);
/* CDVD */
SifExecModuleBuffer(&cdfs_irx, size_cdfs_irx, 0, NULL, NULL);
/* Initializes audsrv library */
if (audsrv_init()) {
RARCH_ERR("audsrv library not initalizated\n");
@ -192,48 +191,52 @@ static void frontend_ps2_init(void *data)
if (mtapPortOpen(0) != 1) {
RARCH_ERR("mtapPortOpen library not initalizated\n");
}
#endif
#if defined(BUILD_FOR_PCSX2)
bootDeviceID = BOOT_DEVICE_MC0;
strlcpy(cwd, rootDevicePath(bootDeviceID), sizeof(rootDevicePath(bootDeviceID)));
#else
getcwd(cwd, sizeof(cwd));
bootDeviceID = getBootDeviceID(cwd);
#if !defined(IS_SALAMANDER) && !defined(DEBUG)
// If it is not salamander we need to go one level up for set the CWD.
path_parent_dir(cwd);
#endif
#endif
#if defined(HAVE_FILE_LOGGER)
retro_main_log_file_init("retroarch.log", false);
char fileLog[FILENAME_MAX];
strlcpy(fileLog, rootDevicePath(bootDeviceID), sizeof(fileLog));
strcat(fileLog, "retroarch.log");
retro_main_log_file_init(fileLog, false);
verbosity_enable();
#endif
waitUntilDeviceIsReady(bootDeviceID);
}
static void frontend_ps2_deinit(void *data)
{
(void)data;
#if defined(HAVE_FILE_LOGGER)
verbosity_disable();
command_event(CMD_EVENT_LOG_FILE_DEINIT, NULL);
retro_main_log_file_deinit();
#endif
padEnd();
audsrv_quit();
Exit(0);
}
static void frontend_ps2_exec(const char *path, bool should_load_game)
{
#if defined(IS_SALAMANDER)
char argp[512] = {0};
SceSize args = 0;
strlcpy(argp, eboot_path, sizeof(argp));
args = strlen(argp) + 1;
int args = 0;
static char *argv[1];
RARCH_LOG("Attempt to load executable: [%s].\n", path);
#ifndef IS_SALAMANDER
if (should_load_game && !path_is_empty(RARCH_PATH_CONTENT))
{
argp[args] = '\0';
strlcat(argp + args, path_get(RARCH_PATH_CONTENT), sizeof(argp) - args);
args += strlen(argp + args) + 1;
args++;
argv[0] = path_get(RARCH_PATH_CONTENT);
}
#endif
RARCH_LOG("Attempt to load executable: [%s].\n", path);
#if 0
exitspawn_kernel(path, args, argp); /* I don't know what this is doing */
#endif
#endif
LoadELFFromFile(path, args, argv);
}
#ifndef IS_SALAMANDER
@ -353,7 +356,7 @@ frontend_ctx_driver_t frontend_ctx_ps2 = {
frontend_ps2_exitspawn, /* exitspawn */
NULL, /* process_args */
frontend_ps2_exec, /* exec */
#ifdef IS_SALAMANDER
#ifdef IS_SALAMANDER
NULL, /* set_fork */
#else
frontend_ps2_set_fork, /* set_fork */

View File

@ -165,7 +165,6 @@ static void refreshScreen(ps2_video_t *ps2)
gsKit_sync_flip(ps2->gsGlobal);
gsKit_queue_exec(ps2->gsGlobal);
gsKit_TexManager_nextFrame(ps2->gsGlobal);
}
static void *ps2_gfx_init(const video_info_t *video,

View File

@ -20,8 +20,6 @@
#include "../../config.h"
#endif
#include <libpad.h>
#include <boolean.h>
#include <libretro.h>
#include <retro_miscellaneous.h>

View File

@ -19,6 +19,7 @@
#include <kernel.h>
#include <string.h>
#include <dirent.h>
#include <sys/stat.h>
#define DEVICE_SLASH "/"
@ -161,14 +162,14 @@ enum BootDeviceIDs getBootDeviceID(char *path)
bool waitUntilDeviceIsReady(enum BootDeviceIDs device_id)
{
DIR *dir;
int ret = 0;
int retries = 3;
struct stat buffer;
int ret = -1;
int retries = 10;
char *rootDevice = rootDevicePath(device_id);
while(dir == NULL && retries > 0)
while(ret != 0 && retries > 0)
{
dir = opendir(rootDevice);
ret = stat(rootDevice, &buffer);
/* Wait untill the device is ready */
nopdelay();
nopdelay();
@ -181,10 +182,6 @@ bool waitUntilDeviceIsReady(enum BootDeviceIDs device_id)
retries--;
}
if (dir) {
ret = 1;
closedir(dir);
}
return ret;
return ret == 0;
}