frontend: save gpu-gles settings too
[pcsx_rearmed.git] / frontend / menu.c
index c6a52de..27ba825 100644 (file)
@@ -25,7 +25,6 @@
 #include "omap.h"
 #include "plat.h"
 #include "pcnt.h"
-#include "cspace.h"
 #include "common/plat.h"
 #include "common/input.h"
 #include "linux/in_evdev.h"
@@ -35,6 +34,7 @@
 #include "../libpcsxcore/psemu_plugin_defs.h"
 #include "../libpcsxcore/new_dynarec/new_dynarec.h"
 #include "../plugins/dfinput/main.h"
+#include "../plugins/gpulib/cspace.h"
 #include "revision.h"
 
 #define REARMED_BIRTHDAY_TIME 1293306830       /* 25 Dec 2010 */
@@ -69,8 +69,11 @@ typedef enum
        MA_OPT_SAVECFG,
        MA_OPT_SAVECFG_GAME,
        MA_OPT_CPU_CLOCKS,
-       MA_OPT_FILTERING,
        MA_OPT_DISP_OPTS,
+       MA_OPT_SCALER,
+       MA_OPT_SCALER2,
+       MA_OPT_FILTERING,
+       MA_OPT_SCALER_C,
 } menu_id;
 
 enum {
@@ -89,7 +92,7 @@ static int warned_about_bios, region, in_type_sel1, in_type_sel2;
 static int psx_clock;
 static int memcard1_sel, memcard2_sel;
 int g_opts;
-int analog_deadzone; // for Caanoo
+int soft_scaling, analog_deadzone; // for Caanoo
 
 #ifdef __ARM_ARCH_7A__
 #define DEFAULT_PSX_CLOCK 57
@@ -216,6 +219,7 @@ static void menu_set_defconfig(void)
        volume_boost = 0;
        frameskip = 0;
        analog_deadzone = 50;
+       soft_scaling = 1;
        psx_clock = DEFAULT_PSX_CLOCK;
 
        region = 0;
@@ -291,6 +295,16 @@ static const struct {
        CE_INTVAL_P(gpu_unai.no_light),
        CE_INTVAL_P(gpu_unai.no_blend),
        CE_INTVAL_P(gpu_neon.allow_interlace),
+       CE_INTVAL_P(gpu_peopsgl.bDrawDither),
+       CE_INTVAL_P(gpu_peopsgl.iFilterType),
+       CE_INTVAL_P(gpu_peopsgl.iFrameTexType),
+       CE_INTVAL_P(gpu_peopsgl.iUseMask),
+       CE_INTVAL_P(gpu_peopsgl.bOpaquePass),
+       CE_INTVAL_P(gpu_peopsgl.bAdvancedBlend),
+       CE_INTVAL_P(gpu_peopsgl.bUseFastMdec),
+       CE_INTVAL_P(gpu_peopsgl.iVRamSize),
+       CE_INTVAL_P(gpu_peopsgl.iTexGarbageCollection),
+       CE_INTVAL_P(gpu_peopsgl.dwActFixes),
        CE_INTVAL_V(iUseReverb, 3),
        CE_INTVAL_V(iXAPitch, 3),
        CE_INTVAL_V(iUseInterpolation, 3),
@@ -756,6 +770,9 @@ me_bind_action emuctrl_actions[] =
        { "Toggle Frameskip ", 1 << SACTION_TOGGLE_FSKIP },
        { "Take Screenshot  ", 1 << SACTION_SCREENSHOT },
        { "Enter Menu       ", 1 << SACTION_ENTER_MENU },
+#ifdef __ARM_ARCH_7A__ /* XXX */
+       { "Minimize         ", 1 << SACTION_MINIMIZE },
+#endif
        { "Gun Trigger      ", 1 << SACTION_GUN_TRIGGER },
        { "Gun A button     ", 1 << SACTION_GUN_A },
        { "Gun B button     ", 1 << SACTION_GUN_B },
@@ -1176,10 +1193,11 @@ static int menu_loop_cscaler(int id, int keys)
 
 static menu_entry e_menu_gfx_options[] =
 {
-       mee_enum      ("Scaler",                   0, scaling, men_scaler),
+       mee_enum      ("Scaler",                   MA_OPT_SCALER, scaling, men_scaler),
+       mee_onoff     ("Software Scaling",         MA_OPT_SCALER2, soft_scaling, 1),
        mee_enum      ("Filter",                   MA_OPT_FILTERING, filter, men_dummy),
 //     mee_onoff     ("Vsync",                    0, vsync, 1),
-       mee_cust_h    ("Setup custom scaler",      0, menu_loop_cscaler, NULL, h_cscaler),
+       mee_cust_h    ("Setup custom scaler",      MA_OPT_SCALER_C, menu_loop_cscaler, NULL, h_cscaler),
        mee_end,
 };
 
@@ -1263,6 +1281,43 @@ static int menu_loop_plugin_gpu_peops(int id, int keys)
        return 0;
 }
 
+static const char *men_peopsgl_texfilter[] = { "None", "Standard", "Extended",
+       "Standard-sprites", "Extended-sprites", "Standard+sprites", "Extended+sprites", NULL };
+static const char *men_peopsgl_fbtex[] = { "Emulated VRam", "Black", "Card", "Card+soft" };
+
+static menu_entry e_menu_plugin_gpu_peopsgl[] =
+{
+       mee_onoff     ("Dithering",                  0, pl_rearmed_cbs.gpu_peopsgl.bDrawDither, 1),
+       mee_enum      ("Texture Filtering",          0, pl_rearmed_cbs.gpu_peopsgl.iFilterType, men_peopsgl_texfilter),
+       mee_enum      ("Framebuffer Textures",       0, pl_rearmed_cbs.gpu_peopsgl.iFrameTexType, men_peopsgl_fbtex),
+       mee_onoff     ("Mask Detect",                0, pl_rearmed_cbs.gpu_peopsgl.iUseMask, 1),
+       mee_onoff     ("Opaque Pass",                0, pl_rearmed_cbs.gpu_peopsgl.bOpaquePass, 1),
+       mee_onoff     ("Advanced Blend",             0, pl_rearmed_cbs.gpu_peopsgl.bAdvancedBlend, 1),
+       mee_onoff     ("Use Fast Mdec",              0, pl_rearmed_cbs.gpu_peopsgl.bUseFastMdec, 1),
+       mee_range     ("Texture RAM size (MB)",      0, pl_rearmed_cbs.gpu_peopsgl.iVRamSize, 4, 128),
+       mee_onoff     ("Texture garbage collection", 0, pl_rearmed_cbs.gpu_peopsgl.iTexGarbageCollection, 1),
+       mee_label     ("Fixes/hacks:"),
+       mee_onoff     ("FF7 cursor",                 0, pl_rearmed_cbs.gpu_peopsgl.dwActFixes, 1<<0),
+       mee_onoff     ("Direct FB updates",          0, pl_rearmed_cbs.gpu_peopsgl.dwActFixes, 1<<1),
+       mee_onoff     ("Black brightness",           0, pl_rearmed_cbs.gpu_peopsgl.dwActFixes, 1<<2),
+       mee_onoff     ("Swap front detection",       0, pl_rearmed_cbs.gpu_peopsgl.dwActFixes, 1<<3),
+       mee_onoff     ("Disable coord check",        0, pl_rearmed_cbs.gpu_peopsgl.dwActFixes, 1<<4),
+       mee_onoff     ("No blue glitches (LoD)",     0, pl_rearmed_cbs.gpu_peopsgl.dwActFixes, 1<<5),
+       mee_onoff     ("Soft FB access",             0, pl_rearmed_cbs.gpu_peopsgl.dwActFixes, 1<<6),
+       mee_onoff     ("FF9 rect",                   0, pl_rearmed_cbs.gpu_peopsgl.dwActFixes, 1<<9),
+       mee_onoff     ("No subtr. blending",         0, pl_rearmed_cbs.gpu_peopsgl.dwActFixes, 1<<10),
+       mee_onoff     ("Lazy upload (DW7)",          0, pl_rearmed_cbs.gpu_peopsgl.dwActFixes, 1<<11),
+       mee_onoff     ("Additional uploads",         0, pl_rearmed_cbs.gpu_peopsgl.dwActFixes, 1<<15),
+       mee_end,
+};
+
+static int menu_loop_plugin_gpu_peopsgl(int id, int keys)
+{
+       static int sel = 0;
+       me_loop(e_menu_plugin_gpu_peopsgl, &sel);
+       return 0;
+}
+
 static const char *men_spu_interp[] = { "None", "Simple", "Gaussian", "Cubic", NULL };
 static const char h_spu_volboost[]  = "Large values cause distortion";
 static const char h_spu_irq_wait[]  = "Wait for CPU (recommended set to ON)";
@@ -1289,22 +1344,35 @@ static int menu_loop_plugin_spu(int id, int keys)
 static const char h_bios[]       = "HLE is simulated BIOS. BIOS selection is saved in\n"
                                   "savestates and can't be changed there. Must save\n"
                                   "config and reload the game for change to take effect";
-static const char h_plugin_xpu[] = "Must save config and reload the game\n"
-                                  "for plugin change to take effect";
+static const char h_plugin_gpu[] = 
+#ifdef __ARM_NEON__
+                                  "builtin_gpu is the NEON GPU, very fast and accurate\n"
+                                  "gpuPEOPS "
+#else
+                                  "builtin_gpu "
+#endif
+                                               "is Pete's soft GPU, slow but accurate\n"
+                                  "gpuPCSX4ALL is GPU from PCSX4ALL, fast but glitchy\n"
+                                  "gpuGLES 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"
+                                  "must save config and reload the game if changed";
 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_spu[]        = "Configure built-in P.E.Op.S. Sound Driver V1.7";
 
 static menu_entry e_menu_plugin_options[] =
 {
        mee_enum_h    ("BIOS",                          0, bios_sel, bioses, h_bios),
-       mee_enum_h    ("GPU plugin",                    0, gpu_plugsel, gpu_plugins, h_plugin_xpu),
-       mee_enum_h    ("SPU plugin",                    0, spu_plugsel, spu_plugins, h_plugin_xpu),
+       mee_enum_h    ("GPU plugin",                    0, gpu_plugsel, gpu_plugins, h_plugin_gpu),
+       mee_enum_h    ("SPU plugin",                    0, spu_plugsel, spu_plugins, h_plugin_spu),
 #ifdef __ARM_NEON__
        mee_handler_h ("Configure built-in GPU plugin", menu_loop_plugin_gpu_neon, h_gpu_neon),
 #endif
        mee_handler_h ("Configure gpu_peops plugin",    menu_loop_plugin_gpu_peops, h_gpu_peops),
        mee_handler_h ("Configure PCSX4ALL GPU plugin", menu_loop_plugin_gpu_unai, h_gpu_unai),
+       mee_handler_h ("Configure 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,
 };
@@ -1327,7 +1395,8 @@ static int menu_loop_plugin_options(int id, int keys)
 
 // ------------ adv options menu ------------
 
-static const char h_cfg_psxclk[]  = "Over/under-clock the PSX, default is " DEFAULT_PSX_CLOCK_S "\n";
+static const char h_cfg_psxclk[]  = "Over/under-clock the PSX, default is " DEFAULT_PSX_CLOCK_S "\n"
+                                   "(lower value - less work for the emu, may be faster)";
 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";
@@ -1435,7 +1504,7 @@ static int menu_loop_options(int id, int keys)
        int i;
 
        i = me_id2offset(e_menu_options, MA_OPT_CPU_CLOCKS);
-       e_menu_options[i].enabled = cpu_clock != 0 ? 1 : 0;
+       e_menu_options[i].enabled = cpu_clock_st != 0 ? 1 : 0;
        me_enable(e_menu_options, MA_OPT_SAVECFG_GAME, ready_to_go && CdromId[0]);
 
        me_loop(e_menu_options, &sel);
@@ -1445,12 +1514,12 @@ static int menu_loop_options(int id, int keys)
 
 // ------------ debug menu ------------
 
-static void draw_frame_debug(GPUFreeze_t *gpuf)
+static void draw_frame_debug(GPUFreeze_t *gpuf, int x, int y)
 {
        int w = min(g_menuscreen_w, 1024);
        int h = min(g_menuscreen_h, 512);
        u16 *d = g_menuscreen_ptr;
-       u16 *s = (u16 *)gpuf->psxVRam;
+       u16 *s = (u16 *)gpuf->psxVRam + y * 1024 + x;
        char buff[64];
        int ty = 1;
 
@@ -1470,8 +1539,8 @@ static void draw_frame_debug(GPUFreeze_t *gpuf)
 
 static void debug_menu_loop(void)
 {
+       int inp, df_x = 0, df_y = 0;
        GPUFreeze_t *gpuf;
-       int inp;
 
        gpuf = malloc(sizeof(*gpuf));
        if (gpuf == NULL)
@@ -1480,13 +1549,16 @@ static void debug_menu_loop(void)
        while (1)
        {
                menu_draw_begin(0);
-               draw_frame_debug(gpuf);
+               draw_frame_debug(gpuf, df_x, df_y);
                menu_draw_end();
 
                inp = in_menu_wait(PBTN_MOK|PBTN_MBACK|PBTN_MA2|PBTN_MA3|PBTN_L|PBTN_R |
-                                       PBTN_UP|PBTN_DOWN|PBTN_LEFT|PBTN_RIGHT, 70);
-               if (inp & PBTN_MBACK)
-                       break;
+                                       PBTN_UP|PBTN_DOWN|PBTN_LEFT|PBTN_RIGHT, 10);
+               if      (inp & PBTN_MBACK) break;
+               else if (inp & PBTN_UP)    { if (df_y > 0) df_y--; }
+               else if (inp & PBTN_DOWN)  { if (df_y < 512 - g_menuscreen_h) df_y++; }
+               else if (inp & PBTN_LEFT)  { if (df_x > 0) df_x--; }
+               else if (inp & PBTN_RIGHT) { if (df_x < 1024 - g_menuscreen_w) df_x++; }
        }
 
        free(gpuf);
@@ -1663,7 +1735,7 @@ static void draw_frame_main(void)
 
 static void draw_frame_credits(void)
 {
-       smalltext_out16(4, 1, "build: "__DATE__ " " __TIME__ " " REV, 0xe7fc);
+       smalltext_out16(4, 1, "build: " __DATE__ " " __TIME__ " " REV, 0xe7fc);
 }
 
 static const char credits_text[] = 
@@ -1673,14 +1745,14 @@ static const char credits_text[] =
        "(C) 2009-2011 PCSX-Reloaded Team\n\n"
        "ARM recompiler (C) 2009-2011 Ari64\n"
 #ifdef __ARM_NEON__
-       "ARM NEON GPU (c) 2011 Exophase\n"
+       "ARM NEON GPU (c) 2011-2012 Exophase\n"
 #endif
        "PEOpS GPU and SPU by Pete Bernert\n"
        "  and the P.E.Op.S. team\n"
        "PCSX4ALL plugin by PCSX4ALL team\n"
        "  Chui, Franxis, Unai\n\n"
        "integration, optimization and\n"
-       "  frontend (C) 2010-2011 notaz\n";
+       "  frontend (C) 2010-2012 notaz\n";
 
 static int reset_game(void)
 {
@@ -2175,9 +2247,12 @@ void menu_init(void)
        readpng(g_menubg_src_ptr, buff, READPNG_BG, g_menuscreen_w, g_menuscreen_h);
 
 #ifndef __ARM_ARCH_7A__ /* XXX */
-       me_enable(e_menu_options, MA_OPT_DISP_OPTS, 0);
+       me_enable(e_menu_gfx_options, MA_OPT_SCALER, 0);
+       me_enable(e_menu_gfx_options, MA_OPT_FILTERING, 0);
+       me_enable(e_menu_gfx_options, MA_OPT_SCALER_C, 0);
        me_enable(e_menu_keyconfig, MA_CTRL_NUBS_BTNS, 0);
 #else
+       me_enable(e_menu_gfx_options, MA_OPT_SCALER2, 0);
        me_enable(e_menu_keyconfig, MA_CTRL_VIBRATION, 0);
        me_enable(e_menu_keyconfig, MA_CTRL_DEADZONE, 0);
 #endif