+ enum retro_pixel_format fmt = RETRO_PIXEL_FORMAT_RGB565;
+ if (environ_cb(RETRO_ENVIRONMENT_SET_PIXEL_FORMAT, &fmt))
+ {
+ SysPrintf("RGB565 supported, using it\n");
+ }
+#endif
+
+ if (info == NULL || info->path == NULL)
+ {
+ SysPrintf("info->path required\n");
+ return false;
+ }
+
+ update_variables(false);
+
+ if (plugins_opened)
+ {
+ ClosePlugins();
+ plugins_opened = 0;
+ }
+
+ disk_init();
+
+ extract_directory(base_dir, info->path, sizeof(base_dir));
+
+ if (is_m3u)
+ {
+ if (!read_m3u(info->path))
+ {
+ log_cb(RETRO_LOG_INFO, "failed to read m3u file\n");
+ return false;
+ }
+ }
+ else
+ {
+ char disk_label[PATH_MAX];
+ disk_label[0] = '\0';
+
+ disk_count = 1;
+ disks[0].fname = strdup(info->path);
+
+ get_disk_label(disk_label, info->path, PATH_MAX);
+ disks[0].flabel = strdup(disk_label);
+ }
+
+ /* If this is an M3U file, attempt to set the
+ * initial disk image */
+ if (is_m3u && (disk_initial_index > 0) && (disk_initial_index < disk_count))
+ {
+ const char *fname = disks[disk_initial_index].fname;
+
+ if (fname && (*fname != '\0'))
+ if (strcmp(disk_initial_path, fname) == 0)
+ cd_index = disk_initial_index;
+ }
+
+ set_cd_image(disks[cd_index].fname);
+ disk_current_index = cd_index;
+
+ /* have to reload after set_cd_image for correct cdr plugin */
+ if (LoadPlugins() == -1)
+ {
+ log_cb(RETRO_LOG_INFO, "failed to load plugins\n");
+ return false;
+ }
+
+ plugins_opened = 1;
+ NetOpened = 0;
+
+ if (OpenPlugins() == -1)
+ {
+ log_cb(RETRO_LOG_INFO, "failed to open plugins\n");
+ return false;
+ }
+
+ /* Handle multi-disk images (i.e. PBP)
+ * > Cannot do this until after OpenPlugins() is
+ * called (since this sets the value of
+ * cdrIsoMultidiskCount) */
+ if (!is_m3u && (cdrIsoMultidiskCount > 1))
+ {
+ disk_count = cdrIsoMultidiskCount < 8 ? cdrIsoMultidiskCount : 8;
+
+ /* Small annoyance: We need to change the label
+ * of disk 0, so have to clear existing entries */
+ if (disks[0].fname != NULL)
+ free(disks[0].fname);
+ disks[0].fname = NULL;
+
+ if (disks[0].flabel != NULL)
+ free(disks[0].flabel);
+ disks[0].flabel = NULL;
+
+ for (i = 0; i < sizeof(disks) / sizeof(disks[0]) && i < cdrIsoMultidiskCount; i++)
+ {
+ 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, sizeof(disk_name));
+ snprintf(disk_label, sizeof(disk_label), "%s #%u", disk_name, (unsigned)i + 1);
+ disks[i].flabel = strdup(disk_label);
+
+ disks[i].internal_index = i;
+ }
+
+ /* This is not an M3U file, so initial disk
+ * image has not yet been set - attempt to
+ * do so now */
+ if ((disk_initial_index > 0) && (disk_initial_index < disk_count))
+ {
+ const char *fname = disks[disk_initial_index].fname;
+
+ if (fname && (*fname != '\0'))
+ if (strcmp(disk_initial_path, fname) == 0)
+ cd_index = disk_initial_index;
+ }
+
+ if (cd_index > 0)
+ {
+ CdromId[0] = '\0';
+ CdromLabel[0] = '\0';
+
+ cdrIsoMultidiskSelect = disks[cd_index].internal_index;
+ disk_current_index = cd_index;
+ set_cd_image(disks[cd_index].fname);
+
+ if (ReloadCdromPlugin() < 0)
+ {
+ log_cb(RETRO_LOG_INFO, "failed to reload cdr plugins\n");
+ return false;
+ }
+ if (CDR_open() < 0)
+ {
+ log_cb(RETRO_LOG_INFO, "failed to open cdr plugin\n");
+ return false;
+ }
+ }
+ }
+
+ /* 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(); */
+
+ if (!is_exe && CheckCdrom() == -1)
+ {
+ log_cb(RETRO_LOG_INFO, "unsupported/invalid CD image: %s\n", info->path);
+ return false;
+ }
+
+ SysReset();
+
+ if (is_exe)
+ ret = Load(info->path);
+ else
+ ret = LoadCdrom();
+ if (ret != 0)
+ {
+ log_cb(RETRO_LOG_INFO, "could not load %s (%d)\n", is_exe ? "exe" : "CD", ret);
+ return false;
+ }
+ emu_on_new_cd(0);
+
+ set_retro_memmap();
+ retro_set_audio_buff_status_cb();
+
+ return true;
+}
+
+unsigned retro_get_region(void)
+{
+ return is_pal_mode ? RETRO_REGION_PAL : RETRO_REGION_NTSC;
+}
+
+void *retro_get_memory_data(unsigned id)
+{
+ if (id == RETRO_MEMORY_SAVE_RAM)
+ return Mcd1Data;
+ else if (id == RETRO_MEMORY_SYSTEM_RAM)
+ return psxM;
+ else
+ return NULL;
+}
+
+size_t retro_get_memory_size(unsigned id)
+{
+ if (id == RETRO_MEMORY_SAVE_RAM)
+ return MCD_SIZE;
+ else if (id == RETRO_MEMORY_SYSTEM_RAM)
+ return 0x200000;
+ else
+ return 0;
+}
+
+void retro_reset(void)
+{
+ //hack to prevent retroarch freezing when reseting in the menu but not while running with the hot key
+ rebootemu = 1;
+ //SysReset();
+}
+
+static const unsigned short retro_psx_map[] = {
+ [RETRO_DEVICE_ID_JOYPAD_B] = 1 << DKEY_CROSS,
+ [RETRO_DEVICE_ID_JOYPAD_Y] = 1 << DKEY_SQUARE,
+ [RETRO_DEVICE_ID_JOYPAD_SELECT] = 1 << DKEY_SELECT,
+ [RETRO_DEVICE_ID_JOYPAD_START] = 1 << DKEY_START,
+ [RETRO_DEVICE_ID_JOYPAD_UP] = 1 << DKEY_UP,
+ [RETRO_DEVICE_ID_JOYPAD_DOWN] = 1 << DKEY_DOWN,
+ [RETRO_DEVICE_ID_JOYPAD_LEFT] = 1 << DKEY_LEFT,
+ [RETRO_DEVICE_ID_JOYPAD_RIGHT] = 1 << DKEY_RIGHT,
+ [RETRO_DEVICE_ID_JOYPAD_A] = 1 << DKEY_CIRCLE,
+ [RETRO_DEVICE_ID_JOYPAD_X] = 1 << DKEY_TRIANGLE,
+ [RETRO_DEVICE_ID_JOYPAD_L] = 1 << DKEY_L1,
+ [RETRO_DEVICE_ID_JOYPAD_R] = 1 << DKEY_R1,
+ [RETRO_DEVICE_ID_JOYPAD_L2] = 1 << DKEY_L2,
+ [RETRO_DEVICE_ID_JOYPAD_R2] = 1 << DKEY_R2,
+ [RETRO_DEVICE_ID_JOYPAD_L3] = 1 << DKEY_L3,
+ [RETRO_DEVICE_ID_JOYPAD_R3] = 1 << DKEY_R3,
+};
+#define RETRO_PSX_MAP_LEN (sizeof(retro_psx_map) / sizeof(retro_psx_map[0]))
+
+//Percentage distance of screen to adjust for Guncon
+static int GunconAdjustX = 0;
+static int GunconAdjustY = 0;
+
+//Used when out by a percentage with Guncon
+static float GunconAdjustRatioX = 1;
+static float GunconAdjustRatioY = 1;
+
+static void update_variables(bool in_flight)
+{
+ struct retro_variable var;
+#ifdef GPU_PEOPS
+ // Always enable GPU_PEOPS_OLD_FRAME_SKIP flag
+ // (this is set in standalone, with no option
+ // to change it)
+ int gpu_peops_fix = GPU_PEOPS_OLD_FRAME_SKIP;
+#endif
+ frameskip_type_t prev_frameskip_type;
+
+ var.value = NULL;
+ var.key = "pcsx_rearmed_frameskip_type";
+
+ prev_frameskip_type = frameskip_type;
+ frameskip_type = FRAMESKIP_NONE;
+ pl_rearmed_cbs.frameskip = 0;
+
+ if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
+ {
+ if (strcmp(var.value, "auto") == 0)
+ frameskip_type = FRAMESKIP_AUTO;
+ if (strcmp(var.value, "auto_threshold") == 0)
+ frameskip_type = FRAMESKIP_AUTO_THRESHOLD;
+ if (strcmp(var.value, "fixed_interval") == 0)
+ frameskip_type = FRAMESKIP_FIXED_INTERVAL;
+ }
+
+ if (frameskip_type != 0)
+ pl_rearmed_cbs.frameskip = -1;
+
+ var.value = NULL;
+ var.key = "pcsx_rearmed_frameskip_threshold";
+ if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
+ {
+ frameskip_threshold = strtol(var.value, NULL, 10);
+ }
+
+ var.value = NULL;
+ var.key = "pcsx_rearmed_frameskip_interval";
+ if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
+ {
+ frameskip_interval = strtol(var.value, NULL, 10);
+ }
+
+ var.value = NULL;
+ var.key = "pcsx_rearmed_region";
+ if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
+ {
+ Config.PsxAuto = 0;
+ if (strcmp(var.value, "auto") == 0)
+ Config.PsxAuto = 1;
+ else if (strcmp(var.value, "NTSC") == 0)
+ Config.PsxType = 0;
+ else if (strcmp(var.value, "PAL") == 0)
+ Config.PsxType = 1;
+ }
+
+ update_multitap();
+
+ var.value = NULL;
+ var.key = "pcsx_rearmed_negcon_deadzone";
+ negcon_deadzone = 0;
+ if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
+ {
+ negcon_deadzone = (int)(atoi(var.value) * 0.01f * NEGCON_RANGE);
+ }
+
+ var.value = NULL;
+ var.key = "pcsx_rearmed_negcon_response";
+ negcon_linearity = 1;
+ if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
+ {
+ if (strcmp(var.value, "quadratic") == 0)
+ {
+ negcon_linearity = 2;
+ }
+ else if (strcmp(var.value, "cubic") == 0)
+ {
+ negcon_linearity = 3;
+ }
+ }
+
+ var.value = NULL;
+ var.key = "pcsx_rearmed_analog_axis_modifier";
+ axis_bounds_modifier = true;
+ if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
+ {
+ if (strcmp(var.value, "square") == 0)
+ {
+ axis_bounds_modifier = true;
+ }
+ else if (strcmp(var.value, "circle") == 0)
+ {
+ axis_bounds_modifier = false;
+ }
+ }
+
+ var.value = NULL;
+ var.key = "pcsx_rearmed_vibration";
+
+ if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
+ {
+ if (strcmp(var.value, "disabled") == 0)
+ in_enable_vibration = 0;
+ else if (strcmp(var.value, "enabled") == 0)
+ in_enable_vibration = 1;
+ }
+
+ var.value = NULL;
+ var.key = "pcsx_rearmed_dithering";
+
+ if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
+ {
+ if (strcmp(var.value, "disabled") == 0)
+ {
+ pl_rearmed_cbs.gpu_peops.iUseDither = 0;
+ pl_rearmed_cbs.gpu_peopsgl.bDrawDither = 0;
+ pl_rearmed_cbs.gpu_unai.dithering = 0;
+#ifdef GPU_NEON
+ pl_rearmed_cbs.gpu_neon.allow_dithering = 0;
+#endif
+ }
+ else if (strcmp(var.value, "enabled") == 0)
+ {
+ pl_rearmed_cbs.gpu_peops.iUseDither = 1;
+ pl_rearmed_cbs.gpu_peopsgl.bDrawDither = 1;
+ pl_rearmed_cbs.gpu_unai.dithering = 1;
+#ifdef GPU_NEON
+ pl_rearmed_cbs.gpu_neon.allow_dithering = 1;
+#endif
+ }
+ }
+
+#ifdef GPU_NEON
+ var.value = NULL;
+ var.key = "pcsx_rearmed_neon_interlace_enable_v2";
+
+ if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
+ {
+ if (strcmp(var.value, "disabled") == 0)
+ pl_rearmed_cbs.gpu_neon.allow_interlace = 0;
+ else if (strcmp(var.value, "enabled") == 0)
+ pl_rearmed_cbs.gpu_neon.allow_interlace = 1;
+ else // auto
+ pl_rearmed_cbs.gpu_neon.allow_interlace = 2;
+ }
+
+ var.value = NULL;
+ var.key = "pcsx_rearmed_neon_enhancement_enable";
+
+ if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
+ {
+ if (strcmp(var.value, "disabled") == 0)
+ pl_rearmed_cbs.gpu_neon.enhancement_enable = 0;
+ else if (strcmp(var.value, "enabled") == 0)
+ pl_rearmed_cbs.gpu_neon.enhancement_enable = 1;
+ }
+
+ var.value = NULL;
+ var.key = "pcsx_rearmed_neon_enhancement_no_main";
+
+ if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
+ {
+ if (strcmp(var.value, "disabled") == 0)
+ pl_rearmed_cbs.gpu_neon.enhancement_no_main = 0;
+ else if (strcmp(var.value, "enabled") == 0)
+ pl_rearmed_cbs.gpu_neon.enhancement_no_main = 1;
+ }
+#endif
+
+ var.value = NULL;
+ var.key = "pcsx_rearmed_duping_enable";
+
+ if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
+ {
+ if (strcmp(var.value, "disabled") == 0)
+ duping_enable = false;
+ else if (strcmp(var.value, "enabled") == 0)
+ duping_enable = true;
+ }
+
+ var.value = NULL;
+ var.key = "pcsx_rearmed_display_internal_fps";
+
+ if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
+ {
+ if (strcmp(var.value, "disabled") == 0)
+ display_internal_fps = false;
+ else if (strcmp(var.value, "enabled") == 0)
+ display_internal_fps = true;
+ }
+
+ //
+ // CPU emulation related config
+#ifndef DRC_DISABLE
+ var.value = NULL;
+ var.key = "pcsx_rearmed_drc";
+
+ if (!environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var))
+ var.value = "enabled";
+
+ {
+ R3000Acpu *prev_cpu = psxCpu;
+
+#ifdef _3DS
+ if (!__ctr_svchax)
+ Config.Cpu = CPU_INTERPRETER;
+ else
+#endif
+ if (strcmp(var.value, "disabled") == 0)
+ Config.Cpu = CPU_INTERPRETER;
+ else if (strcmp(var.value, "enabled") == 0)
+ Config.Cpu = CPU_DYNAREC;
+
+ psxCpu = (Config.Cpu == CPU_INTERPRETER) ? &psxInt : &psxRec;
+ if (psxCpu != prev_cpu)
+ {
+ prev_cpu->Notify(R3000ACPU_NOTIFY_BEFORE_SAVE, NULL);
+ prev_cpu->Shutdown();
+ psxCpu->Init();
+ psxCpu->Reset();
+ psxCpu->Notify(R3000ACPU_NOTIFY_AFTER_LOAD, NULL);
+ }
+ }
+#endif /* !DRC_DISABLE */
+
+ var.value = NULL;
+ var.key = "pcsx_rearmed_psxclock";
+ if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
+ {
+ int psxclock = atoi(var.value);
+ Config.cycle_multiplier = 10000 / psxclock;
+ }
+
+#if !defined(DRC_DISABLE) && !defined(LIGHTREC)
+ var.value = NULL;
+ var.key = "pcsx_rearmed_nosmccheck";
+ if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
+ {
+ if (strcmp(var.value, "enabled") == 0)
+ new_dynarec_hacks |= NDHACK_NO_SMC_CHECK;
+ else
+ new_dynarec_hacks &= ~NDHACK_NO_SMC_CHECK;
+ }
+
+ var.value = NULL;
+ var.key = "pcsx_rearmed_gteregsunneeded";
+ if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
+ {
+ if (strcmp(var.value, "enabled") == 0)
+ new_dynarec_hacks |= NDHACK_GTE_UNNEEDED;
+ else
+ new_dynarec_hacks &= ~NDHACK_GTE_UNNEEDED;
+ }
+
+ var.value = NULL;
+ var.key = "pcsx_rearmed_nogteflags";
+ if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
+ {
+ if (strcmp(var.value, "enabled") == 0)
+ new_dynarec_hacks |= NDHACK_GTE_NO_FLAGS;
+ else
+ new_dynarec_hacks &= ~NDHACK_GTE_NO_FLAGS;
+ }
+
+ 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_icache_emulation";
+ if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
+ {
+ if (strcmp(var.value, "disabled") == 0)
+ Config.icache_emulation = 0;
+ else if (strcmp(var.value, "enabled") == 0)
+ Config.icache_emulation = 1;
+ }
+
+ var.value = NULL;
+ var.key = "pcsx_rearmed_exception_emulation";
+ if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
+ {
+ if (strcmp(var.value, "enabled") == 0)
+ Config.PreciseExceptions = 1;
+ else
+ Config.PreciseExceptions = 0;
+ }
+
+ psxCpu->ApplyConfig();
+
+ // end of CPU emu config
+ //
+
+ var.value = NULL;
+ var.key = "pcsx_rearmed_spu_reverb";
+
+ if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
+ {
+ if (strcmp(var.value, "disabled") == 0)
+ spu_config.iUseReverb = false;
+ else if (strcmp(var.value, "enabled") == 0)
+ spu_config.iUseReverb = true;
+ }
+
+ var.value = NULL;
+ var.key = "pcsx_rearmed_spu_interpolation";
+
+ if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
+ {
+ if (strcmp(var.value, "simple") == 0)
+ spu_config.iUseInterpolation = 1;
+ else if (strcmp(var.value, "gaussian") == 0)
+ spu_config.iUseInterpolation = 2;
+ else if (strcmp(var.value, "cubic") == 0)
+ spu_config.iUseInterpolation = 3;
+ else if (strcmp(var.value, "off") == 0)
+ spu_config.iUseInterpolation = 0;
+ }
+
+ var.value = NULL;
+ var.key = "pcsx_rearmed_spu_thread";
+ if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
+ {
+ if (strcmp(var.value, "enabled") == 0)
+ spu_config.iUseThread = 1;
+ else
+ spu_config.iUseThread = 0;
+ }
+
+ if (P_HAVE_PTHREAD) {
+ var.value = NULL;
+ var.key = "pcsx_rearmed_async_cd";
+ if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
+ {
+ if (strcmp(var.value, "async") == 0)
+ {
+ Config.AsyncCD = 1;
+ 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;
+ }
+ }
+ }
+
+ var.value = NULL;
+ var.key = "pcsx_rearmed_noxadecoding";
+ if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
+ {
+ if (strcmp(var.value, "disabled") == 0)
+ Config.Xa = 1;
+ else
+ Config.Xa = 0;
+ }
+
+ var.value = NULL;
+ var.key = "pcsx_rearmed_nocdaudio";
+ if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
+ {
+ if (strcmp(var.value, "disabled") == 0)
+ Config.Cdda = 1;
+ else
+ Config.Cdda = 0;
+ }
+
+ var.value = NULL;
+ var.key = "pcsx_rearmed_gpu_slow_llists";
+ if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
+ {
+ if (strcmp(var.value, "disabled") == 0)
+ Config.GpuListWalking = 0;
+ else if (strcmp(var.value, "enabled") == 0)
+ Config.GpuListWalking = 1;
+ else // auto
+ Config.GpuListWalking = -1;
+ }
+
+ var.value = NULL;
+ var.key = "pcsx_rearmed_screen_centering";
+ if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
+ {
+ if (strcmp(var.value, "game") == 0)
+ pl_rearmed_cbs.screen_centering_type = 1;
+ else if (strcmp(var.value, "manual") == 0)
+ pl_rearmed_cbs.screen_centering_type = 2;
+ else // auto
+ pl_rearmed_cbs.screen_centering_type = 0;
+ }
+
+ var.value = NULL;
+ var.key = "pcsx_rearmed_screen_centering_x";
+ if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
+ {
+ pl_rearmed_cbs.screen_centering_x = atoi(var.value);
+ }
+
+ var.value = NULL;
+ var.key = "pcsx_rearmed_screen_centering_y";
+ if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
+ {
+ pl_rearmed_cbs.screen_centering_y = atoi(var.value);
+ }
+
+#ifdef THREAD_RENDERING
+ var.key = "pcsx_rearmed_gpu_thread_rendering";
+ var.value = NULL;
+
+ if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
+ {
+ if (strcmp(var.value, "disabled") == 0)
+ pl_rearmed_cbs.thread_rendering = THREAD_RENDERING_OFF;
+ else if (strcmp(var.value, "sync") == 0)
+ pl_rearmed_cbs.thread_rendering = THREAD_RENDERING_SYNC;
+ else if (strcmp(var.value, "async") == 0)
+ pl_rearmed_cbs.thread_rendering = THREAD_RENDERING_ASYNC;
+ }
+#endif
+
+#ifdef GPU_PEOPS
+ var.value = NULL;
+ var.key = "pcsx_rearmed_gpu_peops_odd_even_bit";
+
+ if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
+ {
+ if (strcmp(var.value, "enabled") == 0)
+ gpu_peops_fix |= GPU_PEOPS_ODD_EVEN_BIT;
+ }
+
+ var.value = NULL;
+ var.key = "pcsx_rearmed_gpu_peops_expand_screen_width";
+
+ if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
+ {
+ if (strcmp(var.value, "enabled") == 0)
+ gpu_peops_fix |= GPU_PEOPS_EXPAND_SCREEN_WIDTH;
+ }
+
+ var.value = NULL;
+ var.key = "pcsx_rearmed_gpu_peops_ignore_brightness";
+
+ if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
+ {
+ if (strcmp(var.value, "enabled") == 0)
+ gpu_peops_fix |= GPU_PEOPS_IGNORE_BRIGHTNESS;
+ }
+
+ var.value = NULL;
+ var.key = "pcsx_rearmed_gpu_peops_disable_coord_check";
+
+ if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
+ {
+ if (strcmp(var.value, "enabled") == 0)
+ gpu_peops_fix |= GPU_PEOPS_DISABLE_COORD_CHECK;
+ }
+
+ var.value = NULL;
+ var.key = "pcsx_rearmed_gpu_peops_lazy_screen_update";
+
+ if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
+ {
+ if (strcmp(var.value, "enabled") == 0)
+ gpu_peops_fix |= GPU_PEOPS_LAZY_SCREEN_UPDATE;
+ }
+
+ var.value = NULL;
+ var.key = "pcsx_rearmed_gpu_peops_repeated_triangles";
+
+ if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
+ {
+ if (strcmp(var.value, "enabled") == 0)
+ gpu_peops_fix |= GPU_PEOPS_REPEATED_TRIANGLES;
+ }
+
+ var.value = NULL;
+ var.key = "pcsx_rearmed_gpu_peops_quads_with_triangles";
+
+ if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
+ {
+ if (strcmp(var.value, "enabled") == 0)
+ gpu_peops_fix |= GPU_PEOPS_QUADS_WITH_TRIANGLES;
+ }
+
+ var.value = NULL;
+ var.key = "pcsx_rearmed_gpu_peops_fake_busy_state";
+
+ if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
+ {
+ if (strcmp(var.value, "enabled") == 0)
+ gpu_peops_fix |= GPU_PEOPS_FAKE_BUSY_STATE;
+ }
+
+ if (pl_rearmed_cbs.gpu_peops.dwActFixes != gpu_peops_fix)
+ pl_rearmed_cbs.gpu_peops.dwActFixes = gpu_peops_fix;