X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=frontend%2Flibretro.c;h=62acf4250a8b0cb97f9d8b217cd7b0fdc85938a0;hb=f770faad8e05014d16e9c1f3c46bfd76274695c6;hp=62c4fbfa03ccd54b5230d498ab79bd4e887230b4;hpb=311312335dca8b82913397418ca5c8aa8a677081;p=pcsx_rearmed.git diff --git a/frontend/libretro.c b/frontend/libretro.c index 62c4fbfa..62acf425 100644 --- a/frontend/libretro.c +++ b/frontend/libretro.c @@ -41,6 +41,10 @@ #include #include "libretro_core_options.h" +#ifdef USE_LIBRETRO_VFS +#include +#endif + #ifdef _3DS #include "3ds/3ds_utils.h" #endif @@ -554,6 +558,10 @@ static const struct retro_controller_info ports[9] = /* libretro */ void retro_set_environment(retro_environment_t cb) { +#ifdef USE_LIBRETRO_VFS + struct retro_vfs_interface_info vfs_iface_info; +#endif + environ_cb = cb; if (cb(RETRO_ENVIRONMENT_GET_LOG_INTERFACE, &logging)) @@ -561,6 +569,13 @@ void retro_set_environment(retro_environment_t cb) environ_cb(RETRO_ENVIRONMENT_SET_CONTROLLER_INFO, (void*)ports); libretro_set_core_options(environ_cb); + +#ifdef USE_LIBRETRO_VFS + vfs_iface_info.required_interface_version = 1; + vfs_iface_info.iface = NULL; + if (environ_cb(RETRO_ENVIRONMENT_GET_VFS_INTERFACE, &vfs_iface_info)) + filestream_vfs_init(&vfs_iface_info); +#endif } void retro_set_video_refresh(retro_video_refresh_t cb) { video_cb = cb; } @@ -574,155 +589,26 @@ unsigned retro_api_version(void) return RETRO_API_VERSION; } -static int controller_port_variable(unsigned port, struct retro_variable *var) -{ - if (port >= PORTS_NUMBER) - return 0; - - if (!environ_cb) - return 0; - - var->value = NULL; - switch (port) - { - case 0: - var->key = "pcsx_rearmed_pad1type"; - break; - case 1: - var->key = "pcsx_rearmed_pad2type"; - break; - case 2: - var->key = "pcsx_rearmed_pad3type"; - break; - case 3: - var->key = "pcsx_rearmed_pad4type"; - break; - case 4: - var->key = "pcsx_rearmed_pad5type"; - break; - case 5: - var->key = "pcsx_rearmed_pad6type"; - break; - case 6: - var->key = "pcsx_rearmed_pad7type"; - break; - case 7: - var->key = "pcsx_rearmed_pad8type"; - break; - } - - return environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, var) && var->value; -} - -static void update_controller_port_variable(unsigned port) -{ - if (port >= PORTS_NUMBER) - return; - - struct retro_variable var; - - if (controller_port_variable(port, &var)) - { - if (strcmp(var.value, "standard") == 0) - in_type[port] = PSE_PAD_TYPE_STANDARD; - else if (strcmp(var.value, "analog") == 0) - in_type[port] = PSE_PAD_TYPE_ANALOGJOY; - else if (strcmp(var.value, "dualshock") == 0) - in_type[port] = PSE_PAD_TYPE_ANALOGPAD; - else if (strcmp(var.value, "negcon") == 0) - in_type[port] = PSE_PAD_TYPE_NEGCON; - else if (strcmp(var.value, "guncon") == 0) - in_type[port] = PSE_PAD_TYPE_GUNCON; - else if (strcmp(var.value, "mouse") == 0) - in_type[port] = PSE_PAD_TYPE_MOUSE; - else if (strcmp(var.value, "none") == 0) - in_type[port] = PSE_PAD_TYPE_NONE; - // else 'default' case, do nothing - } -} - -static void update_controller_port_device(unsigned port, unsigned device) -{ - if (port >= PORTS_NUMBER) - return; - - struct retro_variable var; - - if (!controller_port_variable(port, &var)) - return; - - if (strcmp(var.value, "default") != 0) - return; - - switch (device) - { - case RETRO_DEVICE_JOYPAD: - in_type[port] = PSE_PAD_TYPE_STANDARD; - break; - case RETRO_DEVICE_ANALOG: - in_type[port] = PSE_PAD_TYPE_ANALOGPAD; - break; - case RETRO_DEVICE_MOUSE: - in_type[port] = PSE_PAD_TYPE_MOUSE; - break; - case RETRO_DEVICE_LIGHTGUN: - in_type[port] = PSE_PAD_TYPE_GUN; - break; - case RETRO_DEVICE_NONE: - default: - in_type[port] = PSE_PAD_TYPE_NONE; - } -} - static void update_multitap(void) { - struct retro_variable var; - int auto_case, port; + struct retro_variable var = { 0 }; - var.value = NULL; - var.key = "pcsx_rearmed_multitap1"; - auto_case = 0; - if (environ_cb && (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)) - { - if (strcmp(var.value, "enabled") == 0) - multitap1 = 1; - else if (strcmp(var.value, "disabled") == 0) - multitap1 = 0; - else // 'auto' case - auto_case = 1; - } - else - auto_case = 1; - - if (auto_case) - { - // If a gamepad is plugged after port 2, we need a first multitap. - multitap1 = 0; - for (port = 2; port < PORTS_NUMBER; port++) - multitap1 |= in_type[port] != PSE_PAD_TYPE_NONE; - } + multitap1 = 0; + multitap2 = 0; var.value = NULL; - var.key = "pcsx_rearmed_multitap2"; - auto_case = 0; + var.key = "pcsx_rearmed_multitap"; if (environ_cb && (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)) { - if (strcmp(var.value, "enabled") == 0) + if (strcmp(var.value, "port 1") == 0) + multitap1 = 1; + else if (strcmp(var.value, "port 2") == 0) multitap2 = 1; - else if (strcmp(var.value, "disabled") == 0) - multitap2 = 0; - else // 'auto' case - auto_case = 1; - } - else - auto_case = 1; - - if (auto_case) - { - // If a gamepad is plugged after port 4, we need a second multitap. - multitap2 = 0; - for (port = 4; port < PORTS_NUMBER; port++) - multitap2 |= in_type[port] != PSE_PAD_TYPE_NONE; + else if (strcmp(var.value, "ports 1 and 2") == 0) + { + multitap1 = 1; + multitap2 = 1; + } } } @@ -768,7 +654,7 @@ void retro_get_system_info(struct retro_system_info *info) #endif memset(info, 0, sizeof(*info)); info->library_name = "PCSX-ReARMed"; - info->library_version = "r22" GIT_VERSION; + info->library_version = "r23l" GIT_VERSION; info->valid_extensions = "bin|cue|img|mdf|pbp|toc|cbn|m3u|chd"; info->need_fullpath = true; } @@ -1211,11 +1097,11 @@ static bool read_m3u(const char *file) { char line[1024]; char name[PATH_MAX]; - FILE *f = fopen(file, "r"); - if (!f) + FILE *fp = fopen(file, "r"); + if (!fp) return false; - while (fgets(line, sizeof(line), f) && disk_count < sizeof(disks) / sizeof(disks[0])) + while (fgets(line, sizeof(line), fp) && disk_count < sizeof(disks) / sizeof(disks[0])) { if (line[0] == '#') continue; @@ -1241,7 +1127,7 @@ static bool read_m3u(const char *file) } } - fclose(f); + fclose(fp); return (disk_count != 0); } @@ -1451,14 +1337,12 @@ bool retro_load_game(const struct retro_game_info *info) for (i = 0; i < sizeof(disks) / sizeof(disks[0]) && i < cdrIsoMultidiskCount; i++) { - char disk_name[PATH_MAX]; - char disk_label[PATH_MAX]; - disk_name[0] = '\0'; - disk_label[0] = '\0'; + char disk_name[PATH_MAX - 16] = { 0 }; + char disk_label[PATH_MAX] = { 0 }; disks[i].fname = strdup(info->path); - get_disk_label(disk_name, info->path, PATH_MAX); + get_disk_label(disk_name, info->path, sizeof(disk_name)); snprintf(disk_label, sizeof(disk_label), "%s #%u", disk_name, (unsigned)i + 1); disks[i].flabel = strdup(disk_label); @@ -1499,6 +1383,10 @@ bool retro_load_game(const struct retro_game_info *info) } } + /* set ports to use "standard controller" initially */ + for (i = 0; i < 8; ++i) + in_type[i] = PSE_PAD_TYPE_STANDARD; + plugin_call_rearmed_cbs(); /* dfinput_activate(); */ @@ -1585,7 +1473,6 @@ static float GunconAdjustRatioY = 1; static void update_variables(bool in_flight) { struct retro_variable var; - int i; #ifdef GPU_PEOPS int gpu_peops_fix = 0; #endif @@ -1608,9 +1495,6 @@ static void update_variables(bool in_flight) Config.PsxType = 1; } - /*for (i = 0; i < PORTS_NUMBER; i++) - update_controller_port_variable(i);*/ - update_multitap(); var.value = NULL; @@ -1744,11 +1628,13 @@ static void update_variables(bool in_flight) display_internal_fps = true; } -#if defined(LIGHTREC) || defined(NEW_DYNAREC) +#ifndef DRC_DISABLE var.value = NULL; var.key = "pcsx_rearmed_drc"; - if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) + if (!environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var)) + var.value = "enabled"; + { R3000Acpu *prev_cpu = psxCpu; #if defined(LIGHTREC) @@ -1775,7 +1661,8 @@ static void update_variables(bool in_flight) psxCpu->Reset(); // not really a reset.. } } -#endif /* LIGHTREC || NEW_DYNAREC */ +#endif /* !DRC_DISABLE */ + psxCpu->ApplyConfig(); var.value = NULL; var.key = "pcsx_rearmed_spu_reverb"; @@ -1813,16 +1700,16 @@ static void update_variables(bool in_flight) else if (strcmp(var.value, "enabled") == 0) Config.RCntFix = 1; } - + var.value = NULL; - var.key = "pcsx_rearmed_idiablofix"; + var.key = "pcsx_rearmed_icache_emulation"; if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) { if (strcmp(var.value, "disabled") == 0) - spu_config.idiablofix = 0; + Config.icache_emulation = 0; else if (strcmp(var.value, "enabled") == 0) - spu_config.idiablofix = 1; + Config.icache_emulation = 1; } var.value = NULL; @@ -1842,9 +1729,20 @@ static void update_variables(bool in_flight) if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) { if (strcmp(var.value, "async") == 0) + { Config.AsyncCD = 1; - else + Config.CHD_Precache = 0; + } + else if (strcmp(var.value, "sync") == 0) + { + Config.AsyncCD = 0; + Config.CHD_Precache = 0; + } + else if (strcmp(var.value, "precache") == 0) + { Config.AsyncCD = 0; + Config.CHD_Precache = 1; + } } #endif @@ -2155,7 +2053,7 @@ static void update_variables(bool in_flight) GunconAdjustRatioY = atof(var.value); } -#ifdef NEW_DYNAREC +#if !defined(DRC_DISABLE) && !defined(LIGHTREC) var.value = NULL; var.key = "pcsx_rearmed_nosmccheck"; if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) @@ -2194,7 +2092,27 @@ static void update_variables(bool in_flight) int psxclock = atoi(var.value); cycle_multiplier = 10000 / psxclock; } -#endif /* NEW_DYNAREC */ + + var.value = NULL; + var.key = "pcsx_rearmed_nocompathacks"; + if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) + { + if (strcmp(var.value, "enabled") == 0) + new_dynarec_hacks |= NDHACK_NO_COMPAT_HACKS; + else + new_dynarec_hacks &= ~NDHACK_NO_COMPAT_HACKS; + } +#endif /* !DRC_DISABLE && !LIGHTREC */ + + var.value = NULL; + var.key = "pcsx_rearmed_nostalls"; + if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) + { + if (strcmp(var.value, "enabled") == 0) + Config.DisableStalls = 1; + else + Config.DisableStalls = 0; + } var.value = NULL; var.key = "pcsx_rearmed_input_sensitivity"; @@ -2219,14 +2137,6 @@ static void update_variables(bool in_flight) unsigned i; struct retro_core_option_display option_display; char gpu_peops_option[][50] = { - "pcsx_rearmed_multitap1", - "pcsx_rearmed_multitap2", - "pcsx_rearmed_pad3type", - "pcsx_rearmed_pad4type", - "pcsx_rearmed_pad5type", - "pcsx_rearmed_pad6type", - "pcsx_rearmed_pad7type", - "pcsx_rearmed_pad8type", "pcsx_rearmed_negcon_deadzone", "pcsx_rearmed_negcon_response", "pcsx_rearmed_analog_axis_modifier", @@ -2281,12 +2191,6 @@ static void update_variables(bool in_flight) } } } - - for (i = 0; i < 8; i++) { - SysPrintf("[DEBUG] Player %d: %s\n", i + 1, get_pse_pad_label[in_type[i]]); - } - SysPrintf("Multiplayer 1: %s\n", multitap1 ? "enabled" : "disabled"); - SysPrintf("Multiplayer 2: %s\n", multitap2 ? "enabled" : "disabled"); } // Taken from beetle-psx-libretro @@ -2631,6 +2535,7 @@ void retro_run(void) // skip BIOS logos psxRegs.pc = psxRegs.GPR.n.ra; } + return; } print_internal_fps(); @@ -2655,17 +2560,15 @@ void retro_run(void) static bool try_use_bios(const char *path) { - FILE *f; long size; const char *name; - - f = fopen(path, "rb"); - if (f == NULL) + FILE *fp = fopen(path, "rb"); + if (fp == NULL) return false; - fseek(f, 0, SEEK_END); - size = ftell(f); - fclose(f); + fseek(fp, 0, SEEK_END); + size = ftell(fp); + fclose(fp); if (size != 512 * 1024) return false; @@ -2811,11 +2714,19 @@ static void loadPSXBios(void) } } - if (useHLE || !found_bios) + if (!found_bios) { - const char *msg_str = "No PlayStation BIOS file found - add for better compatibility"; - - SysPrintf("no BIOS files found.\n"); + const char *msg_str; + if (useHLE) + { + msg_str = "BIOS set to \'hle\' in core options - real BIOS will be ignored"; + SysPrintf("Using HLE BIOS.\n"); + } + else + { + msg_str = "No PlayStation BIOS file found - add for better compatibility"; + SysPrintf("No BIOS files found.\n"); + } if (msg_interface_version >= 1) { @@ -2850,7 +2761,7 @@ void retro_init(void) msg_interface_version = 0; environ_cb(RETRO_ENVIRONMENT_GET_MESSAGE_INTERFACE_VERSION, &msg_interface_version); -#ifdef __MACH__ +#if defined(__MACH__) && !defined(TVOS) // magic sauce to make the dynarec work on iOS syscall(SYS_ptrace, 0 /*PTRACE_TRACEME*/, 0, 0, 0); #endif @@ -2883,7 +2794,8 @@ void retro_init(void) #ifdef _3DS vout_buf = linearMemAlign(VOUT_MAX_WIDTH * VOUT_MAX_HEIGHT * 2, 0x80); #elif defined(_POSIX_C_SOURCE) && (_POSIX_C_SOURCE >= 200112L) && !defined(VITA) && !defined(__SWITCH__) - posix_memalign(&vout_buf, 16, VOUT_MAX_WIDTH * VOUT_MAX_HEIGHT * 2); + if (posix_memalign(&vout_buf, 16, VOUT_MAX_WIDTH * VOUT_MAX_HEIGHT * 2) != 0) + vout_buf = (void *) 0; #else vout_buf = malloc(VOUT_MAX_WIDTH * VOUT_MAX_HEIGHT * 2); #endif