Fix some edge case where core can freeze upon loading content
[pcsx_rearmed.git] / frontend / libretro.c
index 3e2c64a..783f9cd 100644 (file)
@@ -93,8 +93,12 @@ static bool found_bios;
 static bool display_internal_fps = false;
 static unsigned frame_count = 0;
 static bool libretro_supports_bitmasks = false;
+#ifdef GPU_PEOPS
 static int show_advanced_gpu_peops_settings = -1;
+#endif
+#ifdef GPU_UNAI
 static int show_advanced_gpu_unai_settings  = -1;
+#endif
 
 static unsigned previous_width = 0;
 static unsigned previous_height = 0;
@@ -1223,6 +1227,7 @@ static void set_retro_memmap(void)
     environ_cb(RETRO_ENVIRONMENT_SET_MEMORY_MAPS, &retromap);
 }
 
+static void update_variables(bool in_flight);
 bool retro_load_game(const struct retro_game_info *info)
 {
        size_t i;
@@ -1418,6 +1423,8 @@ bool retro_load_game(const struct retro_game_info *info)
                return false;
        }
 
+       update_variables(false);
+
        if (plugins_opened) {
                ClosePlugins();
                plugins_opened = 0;
@@ -1612,7 +1619,9 @@ static void update_variables(bool in_flight)
 {
    struct retro_variable var;
    int i;
+#ifdef GPU_PEOPS
    int gpu_peops_fix = 0;
+#endif
 
    var.value = NULL;
    var.key = "pcsx_rearmed_frameskip";
@@ -1766,14 +1775,19 @@ static void update_variables(bool in_flight)
 
    if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) || var.value)
    {
-      R3000Acpu *prev_cpu = psxCpu;
+         R3000Acpu *prev_cpu = psxCpu;
+#if defined(LIGHTREC)
+      bool can_use_dynarec = found_bios;
+#else
+      bool can_use_dynarec = 1;
+#endif
 
 #ifdef _3DS
       if(!__ctr_svchax)
          Config.Cpu = CPU_INTERPRETER;
       else
 #endif
-      if (strcmp(var.value, "disabled") == 0)
+      if (strcmp(var.value, "disabled") == 0 || !can_use_dynarec)
          Config.Cpu = CPU_INTERPRETER;
       else if (strcmp(var.value, "enabled") == 0)
          Config.Cpu = CPU_DYNAREC;
@@ -1846,6 +1860,18 @@ static void update_variables(bool in_flight)
          Config.VSyncWA = 1;
    }
 
+#ifndef _WIN32
+   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;
+      else
+        Config.AsyncCD = 0;
+   }
+#endif
+
    var.value = NULL;
    var.key = "pcsx_rearmed_noxadecoding";
    if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) || var.value)
@@ -2739,13 +2765,15 @@ void retro_init(void)
    if (environ_cb(RETRO_ENVIRONMENT_GET_INPUT_BITMASKS, NULL))
       libretro_supports_bitmasks = true;
 
-       update_variables(false);
        check_system_specs();
 }
 
 void retro_deinit(void)
 {
-       ClosePlugins();
+       if (plugins_opened) {
+               ClosePlugins();
+               plugins_opened = 0;
+       }
        SysClose();
 #ifdef _3DS
    linearFree(vout_buf);