frontend: force full recompile on drc setting change
[pcsx_rearmed.git] / frontend / menu.c
index cf9382a..f3049d9 100644 (file)
@@ -397,6 +397,7 @@ static const struct {
        CE_CONFIG_VAL(SpuIrq),
        CE_CONFIG_VAL(RCntFix),
        CE_CONFIG_VAL(VSyncWA),
+       CE_CONFIG_VAL(icache_emulation),
        CE_CONFIG_VAL(Cpu),
        CE_INTVAL(region),
        CE_INTVAL_V(g_scaler, 3),
@@ -429,6 +430,13 @@ static const struct {
        CE_INTVAL_P(gpu_unai.abe_hack),
        CE_INTVAL_P(gpu_unai.no_light),
        CE_INTVAL_P(gpu_unai.no_blend),
+       CE_INTVAL_P(gpu_senquack.ilace_force),
+       CE_INTVAL_P(gpu_senquack.pixel_skip),
+       CE_INTVAL_P(gpu_senquack.lighting),
+       CE_INTVAL_P(gpu_senquack.fast_lighting),
+       CE_INTVAL_P(gpu_senquack.blending),
+       CE_INTVAL_P(gpu_senquack.dithering),
+       CE_INTVAL_P(gpu_senquack.scale_hires),
        CE_INTVAL_P(gpu_neon.allow_interlace),
        CE_INTVAL_P(gpu_neon.enhancement_enable),
        CE_INTVAL_P(gpu_neon.enhancement_no_main),
@@ -706,6 +714,9 @@ fail:
 
 static const char *filter_exts[] = {
        "bin", "img", "mdf", "iso", "cue", "z",
+       #ifdef HAVE_CHD
+       "chd",
+       #endif
        "bz",  "znx", "pbp", "cbn", NULL
 };
 
@@ -814,7 +825,7 @@ static void draw_savestate_bg(int slot)
 
                // darken this so that menu text is visible
                if (g_menuscreen_w - w < 320)
-                       menu_darken_bg(d, d, w * 2, 0);
+                       menu_darken_bg(d, d, w, 0);
        }
 
 out:
@@ -1245,10 +1256,11 @@ static const char h_scaler[]    = "int. 2x  - scales w. or h. 2x if it fits on s
                                  "int. 4:3 - uses integer if possible, else fractional";
 static const char h_cscaler[]   = "Displays the scaler layer, you can resize it\n"
                                  "using d-pad or move it using R+d-pad";
-static const char h_overlay[]   = "Overlay provides hardware accelerated scaling";
 static const char h_soft_filter[] = "Works only if game uses low resolution modes";
-static const char h_scanline_l[]  = "Scanline brightness, 0-100%";
 static const char h_gamma[]     = "Gamma/brightness adjustment (default 100)";
+#ifdef __ARM_NEON__
+static const char h_scanline_l[]  = "Scanline brightness, 0-100%";
+#endif
 
 static int menu_loop_cscaler(int id, int keys)
 {
@@ -1374,6 +1386,25 @@ static int menu_loop_plugin_gpu_unai(int id, int keys)
        return 0;
 }
 
+static menu_entry e_menu_plugin_gpu_senquack[] =
+{
+       mee_onoff     ("Interlace",                  0, pl_rearmed_cbs.gpu_senquack.ilace_force, 1),
+       mee_onoff     ("Dithering",                  0, pl_rearmed_cbs.gpu_senquack.dithering, 1),
+       mee_onoff     ("Lighting",                   0, pl_rearmed_cbs.gpu_senquack.lighting, 1),
+       mee_onoff     ("Fast lighting",              0, pl_rearmed_cbs.gpu_senquack.fast_lighting, 1),
+       mee_onoff     ("Blending",                   0, pl_rearmed_cbs.gpu_senquack.blending, 1),
+       mee_onoff     ("Pixel skip",                 0, pl_rearmed_cbs.gpu_senquack.pixel_skip, 1),
+       mee_end,
+};
+
+static int menu_loop_plugin_gpu_senquack(int id, int keys)
+{
+       int sel = 0;
+       me_loop(e_menu_plugin_gpu_senquack, &sel);
+       return 0;
+}
+
+
 static const char *men_gpu_dithering[] = { "None", "Game dependant", "Always", NULL };
 //static const char h_gpu_0[]            = "Needed for Chrono Cross";
 static const char h_gpu_1[]            = "Capcom fighting games";
@@ -1475,6 +1506,7 @@ static const char h_plugin_gpu[] =
 #endif
                                   "gpu_peops is Pete's soft GPU, slow but accurate\n"
                                   "gpu_unai is GPU from PCSX4ALL, fast but glitchy\n"
+                                  "gpu_senquack is more accurate but slower\n"
                                   "gpu_gles Pete's hw GPU, uses 3D chip but is glitchy\n"
                                   "must save config and reload the game if changed";
 static const char h_plugin_spu[] = "spunull effectively disables sound\n"
@@ -1482,6 +1514,7 @@ static const char h_plugin_spu[] = "spunull effectively disables sound\n"
 static const char h_gpu_peops[]  = "Configure P.E.Op.S. SoftGL Driver V1.17";
 static const char h_gpu_peopsgl[]= "Configure P.E.Op.S. MesaGL Driver V1.78";
 static const char h_gpu_unai[]   = "Configure Unai/PCSX4ALL Team GPU plugin";
+static const char h_gpu_senquack[]   = "Configure Unai/PCSX4ALL Senquack plugin";
 static const char h_spu[]        = "Configure built-in P.E.Op.S. Sound Driver V1.7";
 
 static menu_entry e_menu_plugin_options[] =
@@ -1494,6 +1527,7 @@ static menu_entry e_menu_plugin_options[] =
 #endif
        mee_handler_h ("Configure gpu_peops plugin",    menu_loop_plugin_gpu_peops, h_gpu_peops),
        mee_handler_h ("Configure gpu_unai GPU plugin", menu_loop_plugin_gpu_unai, h_gpu_unai),
+       mee_handler_h ("Configure gpu_senquack GPU plugin", menu_loop_plugin_gpu_senquack, h_gpu_senquack),
        mee_handler_h ("Configure gpu_gles GPU plugin", menu_loop_plugin_gpu_peopsgl, h_gpu_peopsgl),
        mee_handler_h ("Configure built-in SPU plugin", menu_loop_plugin_spu, h_spu),
        mee_end,
@@ -1522,6 +1556,7 @@ static const char h_cfg_psxclk[]  = "Over/under-clock the PSX, default is " DEFA
 static const char h_cfg_nosmc[]   = "Will cause crashes when loading, break memcards";
 static const char h_cfg_gteunn[]  = "May cause graphical glitches";
 static const char h_cfg_gteflgs[] = "Will cause graphical glitches";
+static const char h_cfg_gtestll[] = "Some games will run too fast";
 
 static menu_entry e_menu_speed_hacks[] =
 {
@@ -1546,17 +1581,21 @@ static const char h_cfg_fl[]     = "Frame Limiter keeps the game from running to
 static const char h_cfg_xa[]     = "Disables XA sound, which can sometimes improve performance";
 static const char h_cfg_cdda[]   = "Disable CD Audio for a performance boost\n"
                                   "(proper .cue/.bin dump is needed otherwise)";
-static const char h_cfg_sio[]    = "You should not need this, breaks games";
+//static const char h_cfg_sio[]    = "You should not need this, breaks games";
 static const char h_cfg_spuirq[] = "Compatibility tweak; should be left off";
-static const char h_cfg_rcnt1[]  = "Parasite Eve 2, Vandal Hearts 1/2 Fix\n"
-                                  "(timing hack, breaks other games)";
+//static const char h_cfg_rcnt1[]  = "Parasite Eve 2, Vandal Hearts 1/2 Fix\n"
+//                                "(timing hack, breaks other games)";
 static const char h_cfg_rcnt2[]  = "InuYasha Sengoku Battle Fix\n"
                                   "(timing hack, breaks other games)";
 static const char h_cfg_nodrc[]  = "Disable dynamic recompiler and use interpreter\n"
                                   "Might be useful to overcome some dynarec bugs";
 static const char h_cfg_shacks[] = "Breaks games but may give better performance\n"
                                   "must reload game for any change to take effect";
-
+#ifdef ICACHE_EMULATION
+static const char h_cfg_icache[] = "Allows you to play the F1 games.\n"
+                                  "Note: This breaks the PAL version of Spyro 2.";
+#endif
+                                  
 static menu_entry e_menu_adv_options[] =
 {
        mee_onoff_h   ("Show CPU load",          0, g_opts, OPT_SHOWCPU, h_cfg_cpul),
@@ -1566,6 +1605,9 @@ static menu_entry e_menu_adv_options[] =
        mee_onoff_h   ("Disable CD Audio",       0, Config.Cdda, 1, h_cfg_cdda),
        //mee_onoff_h   ("SIO IRQ Always Enabled", 0, Config.Sio, 1, h_cfg_sio),
        mee_onoff_h   ("SPU IRQ Always Enabled", 0, Config.SpuIrq, 1, h_cfg_spuirq),
+#ifdef ICACHE_EMULATION
+       mee_onoff_h   ("ICache emulation",       0, Config.icache_emulation, 1, h_cfg_icache),
+#endif
        //mee_onoff_h   ("Rootcounter hack",       0, Config.RCntFix, 1, h_cfg_rcnt1),
        mee_onoff_h   ("Rootcounter hack 2",     0, Config.VSyncWA, 1, h_cfg_rcnt2),
        mee_onoff_h   ("Disable dynarec (slow!)",0, Config.Cpu, 1, h_cfg_nodrc),
@@ -2288,8 +2330,11 @@ static void menu_leave_emu(void);
 
 void menu_loop(void)
 {
+       int cycle_multiplier_old = cycle_multiplier;
+       int ndrc_hacks_old = new_dynarec_hacks;
        static int warned_about_bios = 0;
        static int sel = 0;
+       int ndrc_changed;
 
        menu_leave_emu();
 
@@ -2324,7 +2369,9 @@ void menu_loop(void)
 
        in_set_config_int(0, IN_CFG_BLOCKING, 0);
 
-       menu_prepare_emu();
+       ndrc_changed = cycle_multiplier_old != cycle_multiplier
+               || ndrc_hacks_old != new_dynarec_hacks;
+       menu_prepare_emu(ndrc_changed);
 }
 
 static int qsort_strcmp(const void *p1, const void *p2)
@@ -2576,19 +2623,25 @@ static void menu_leave_emu(void)
                cpu_clock = plat_target_cpu_clock_get();
 }
 
-void menu_prepare_emu(void)
+void menu_prepare_emu(int ndrc_config_changed)
 {
        R3000Acpu *prev_cpu = psxCpu;
 
        plat_video_menu_leave();
 
+       #ifndef DRC_DISABLE
        psxCpu = (Config.Cpu == CPU_INTERPRETER) ? &psxInt : &psxRec;
+       #else
+       psxCpu = &psxInt;
+       #endif
        if (psxCpu != prev_cpu) {
                prev_cpu->Shutdown();
                psxCpu->Init();
                // note that this does not really reset, just clears drc caches
                psxCpu->Reset();
        }
+       else if (ndrc_config_changed)
+               new_dynarec_clear_full();
 
        // core doesn't care about Config.Cdda changes,
        // so handle them manually here