From 3c70c47bb2fa50066c4c3b23813253e03b8751fe Mon Sep 17 00:00:00 2001 From: notaz Date: Sun, 12 Dec 2010 01:40:19 +0200 Subject: [PATCH] menu: implement savestates and scaling cfg --- .gitignore | 1 + Makefile | 8 ++ frontend/common/menu.c | 5 +- frontend/main.c | 6 +- frontend/menu.c | 310 ++++++++++++++++++++++++++++++++++++++--- frontend/menu.h | 5 + frontend/plat_dummy.c | 1 + frontend/plugin_lib.c | 3 + 8 files changed, 314 insertions(+), 25 deletions(-) create mode 100644 frontend/menu.h diff --git a/.gitignore b/.gitignore index 694e02c3..489387fb 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ *.o +frontend/revision.h frontend/linux frontend/common frontend/X11 diff --git a/Makefile b/Makefile index 7f4d21b0..69c4f5e2 100644 --- a/Makefile +++ b/Makefile @@ -69,6 +69,14 @@ ifdef PCNT CFLAGS += -DPCNT endif frontend/%.o: CFLAGS += -Wall -DIN_EVDEV +frontend/menu.o: frontend/revision.h + +frontend/revision.h: FORCE + @(git describe || echo) | sed -e 's/.*/#define REV "\0"/' > $@_ + @diff -q $@_ $@ > /dev/null 2>&1 || cp $@_ $@ + @rm $@_ +.PHONY: FORCE + $(TARGET): $(OBJS) $(CC) -o $@ $^ $(LDFLAGS) -Wl,-Map=$@.map diff --git a/frontend/common/menu.c b/frontend/common/menu.c index 1cb41c57..5f97730a 100644 --- a/frontend/common/menu.c +++ b/frontend/common/menu.c @@ -652,7 +652,7 @@ static void me_loop(menu_entry *menu, int *menu_sel, void (*draw_more)(void)) /* ***************************************** */ -static void draw_menu_credits(void) +static void draw_menu_credits(void (*draw_more)(void)) { const char *creds, *p; int x, y, h, w, wt; @@ -686,6 +686,9 @@ static void draw_menu_credits(void) p++; } + if (draw_more != NULL) + draw_more(); + menu_draw_end(); } diff --git a/frontend/main.c b/frontend/main.c index bbcd7e41..b05893c9 100644 --- a/frontend/main.c +++ b/frontend/main.c @@ -15,9 +15,9 @@ #include "plugin.h" #include "pcnt.h" +#include "menu.h" #include "../gui/Linux.h" #include "../libpcsxcore/misc.h" -#include "common/menu.h" #include "common/plat.h" #include "common/input.h" @@ -234,7 +234,9 @@ int main(int argc, char *argv[]) free(state_filename); } - if (!ready_to_go) + if (ready_to_go) + menu_prepare_emu(); + else menu_loop(); while (1) diff --git a/frontend/menu.c b/frontend/menu.c index 4291ac58..cae99a3a 100644 --- a/frontend/menu.c +++ b/frontend/menu.c @@ -10,13 +10,17 @@ #include #include +#include +#include "menu.h" #include "config.h" #include "plugin_lib.h" #include "omap.h" #include "common/plat.h" +#include "../gui/Linux.h" #include "../libpcsxcore/misc.h" #include "../libpcsxcore/new_dynarec/new_dynarec.h" +#include "revision.h" #define MENU_X2 1 #define array_size(x) (sizeof(x) / sizeof(x[0])) @@ -41,10 +45,19 @@ typedef enum MA_OPT_SAVECFG, MA_OPT_SAVECFG_GAME, MA_OPT_CPU_CLOCKS, + MA_OPT_FILTERING, } menu_id; -extern int ready_to_go; +enum { + SCALE_1_1, + SCALE_4_3, + SCALE_FULLSCREEN, + SCALE_CUSTOM, +}; +extern int ready_to_go; +static int game_config_loaded, last_psx_w, last_psx_h; +static int scaling, filter, state_slot, cpu_clock; static int dummy, state_slot; static char rom_fname_reload[MAXPATHLEN]; static char last_selected_fname[MAXPATHLEN]; @@ -63,27 +76,167 @@ void emu_make_path(char *buff, const char *end, int size) static int emu_check_save_file(int slot) { - return 0; + char *fname; + int ret; + + fname = get_state_filename(slot); + if (fname == NULL) + return 0; + + ret = CheckState(fname); + free(fname); + return ret == 0 ? 1 : 0; } static int emu_save_load_game(int load, int sram) { - return 0; + char *fname; + int ret; + + fname = get_state_filename(state_slot); + if (fname == NULL) + return 0; + + if (load) + ret = LoadState(fname); + else + ret = SaveState(fname); + free(fname); + + return ret; } -static int emu_write_config(int is_game) +static void draw_savestate_bg(int slot) { - return 0; } -static void emu_set_defconfig(void) +static void menu_set_defconfig(void) +{ + scaling = SCALE_4_3; +} + +static int menu_write_config(int is_game) +{ + return -1; +} + +static int menu_load_config(int is_game) { + return 0; } +#define menu_init menu_init_common #include "common/menu.c" +#undef menu_init -static void draw_savestate_bg(int slot) +// ---------- pandora specific ----------- + +static const char pnd_script_base[] = "sudo -n /usr/pandora/scripts"; +static char **pnd_filter_list; + +static int get_cpu_clock(void) { + FILE *f; + int ret = 0; + f = fopen("/proc/pandora/cpu_mhz_max", "r"); + if (f) { + fscanf(f, "%d", &ret); + fclose(f); + } + return ret; +} + +static void apply_cpu_clock(void) +{ + char buf[128]; + + if (cpu_clock != 0 && cpu_clock != get_cpu_clock()) { + snprintf(buf, sizeof(buf), "unset DISPLAY; echo y | %s/op_cpuspeed.sh %d", + pnd_script_base, cpu_clock); + system(buf); + } +} + +static void apply_filter(int which) +{ + char buf[128]; + int i; + + if (pnd_filter_list == NULL) + return; + + for (i = 0; i < which; i++) + if (pnd_filter_list[i] == NULL) + return; + + if (pnd_filter_list[i] == NULL) + return; + + snprintf(buf, sizeof(buf), "%s/op_videofir.sh %s", pnd_script_base, pnd_filter_list[i]); + system(buf); +} + +static menu_entry e_menu_gfx_options[]; + +static void pnd_menu_init(void) +{ + struct dirent *ent; + int i, count = 0; + char **mfilters; + char buff[64], *p; + DIR *dir; + + cpu_clock = get_cpu_clock(); + + dir = opendir("/etc/pandora/conf/dss_fir"); + if (dir == NULL) { + perror("filter opendir"); + return; + } + + while (1) { + errno = 0; + ent = readdir(dir); + if (ent == NULL) { + if (errno != 0) + perror("readdir"); + break; + } + p = strstr(ent->d_name, "_up"); + if (p != NULL && (p[3] == 0 || !strcmp(p + 3, "_h"))) + count++; + } + + if (count == 0) + return; + + mfilters = calloc(count + 1, sizeof(mfilters[0])); + if (mfilters == NULL) + return; + + rewinddir(dir); + for (i = 0; (ent = readdir(dir)); ) { + size_t len; + + p = strstr(ent->d_name, "_up"); + if (p == NULL || (p[3] != 0 && strcmp(p + 3, "_h"))) + continue; + + len = p - ent->d_name; + if (len > sizeof(buff) - 1) + continue; + + strncpy(buff, ent->d_name, len); + buff[len] = 0; + mfilters[i] = strdup(buff); + if (mfilters[i] != NULL) + i++; + } + closedir(dir); + + i = me_id2offset(e_menu_gfx_options, MA_OPT_FILTERING); + e_menu_gfx_options[i].data = (void *)mfilters; + pnd_filter_list = mfilters; } // -------------- key config -------------- @@ -163,7 +316,7 @@ static int mh_saveloadcfg(int id, int keys) switch (id) { case MA_OPT_SAVECFG: case MA_OPT_SAVECFG_GAME: - if (emu_write_config(id == MA_OPT_SAVECFG_GAME ? 1 : 0)) + if (menu_write_config(id == MA_OPT_SAVECFG_GAME ? 1 : 0) == 0) me_update_msg("config saved"); else me_update_msg("failed to write config"); @@ -220,8 +373,67 @@ static int menu_loop_adv_options(int id, int keys) // ------------ gfx options menu ------------ +static const char *men_scaler[] = { "1x1", "scaled 4:3", "fullscreen", "custom", NULL }; +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 *men_dummy[] = { NULL }; + +static int menu_loop_cscaler(int id, int keys) +{ + unsigned int inp; + + scaling = SCALE_CUSTOM; + + omap_enable_layer(1); + //pnd_restore_layer_data(); + + for (;;) + { + menu_draw_begin(0); + memset(g_menuscreen_ptr, 0, g_menuscreen_w * g_menuscreen_h * 2); + text_out16(2, 480 - 18, "%dx%d | d-pad to resize, R+d-pad to move", g_layer_w, g_layer_h); + menu_draw_end(); + + inp = in_menu_wait(PBTN_UP|PBTN_DOWN|PBTN_LEFT|PBTN_RIGHT|PBTN_R|PBTN_MOK|PBTN_MBACK, 40); + if (inp & PBTN_UP) g_layer_y--; + if (inp & PBTN_DOWN) g_layer_y++; + if (inp & PBTN_LEFT) g_layer_x--; + if (inp & PBTN_RIGHT) g_layer_x++; + if (!(inp & PBTN_R)) { + if (inp & PBTN_UP) g_layer_h += 2; + if (inp & PBTN_DOWN) g_layer_h -= 2; + if (inp & PBTN_LEFT) g_layer_w += 2; + if (inp & PBTN_RIGHT) g_layer_w -= 2; + } + if (inp & (PBTN_MOK|PBTN_MBACK)) + break; + + if (inp & (PBTN_UP|PBTN_DOWN|PBTN_LEFT|PBTN_RIGHT)) { + if (g_layer_x < 0) g_layer_x = 0; + if (g_layer_x > 640) g_layer_x = 640; + if (g_layer_y < 0) g_layer_y = 0; + if (g_layer_y > 420) g_layer_y = 420; + if (g_layer_w < 160) g_layer_w = 160; + if (g_layer_h < 60) g_layer_h = 60; + if (g_layer_x + g_layer_w > 800) + g_layer_w = 800 - g_layer_x; + if (g_layer_y + g_layer_h > 480) + g_layer_h = 480 - g_layer_y; + omap_enable_layer(1); + } + } + + omap_enable_layer(0); + + return 0; +} + static menu_entry e_menu_gfx_options[] = { + mee_enum ("Scaler", 0, scaling, men_scaler), + 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_end, }; @@ -236,11 +448,9 @@ static int menu_loop_gfx_options(int id, int keys) // ------------ options menu ------------ -static menu_entry e_menu_options[]; - static int mh_restore_defaults(int id, int keys) { - emu_set_defconfig(); + menu_set_defconfig(); me_update_msg("defaults restored"); return 1; } @@ -253,7 +463,7 @@ static menu_entry e_menu_options[] = { mee_range ("Save slot", 0, state_slot, 0, 9), mee_enum_h ("Confirm savestate", 0, dummy, men_confirm_save, h_confirm_save), - mee_range ("", MA_OPT_CPU_CLOCKS, dummy, 20, 5000), + mee_range ("CPU clock", MA_OPT_CPU_CLOCKS, cpu_clock, 20, 5000), mee_handler ("[Display]", menu_loop_gfx_options), mee_handler ("[Advanced]", menu_loop_adv_options), mee_cust_nosave("Save global config", MA_OPT_SAVECFG, mh_saveloadcfg, mgn_saveloadcfg), @@ -268,7 +478,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 = e_menu_options[i].name[0] ? 1 : 0; + e_menu_options[i].enabled = cpu_clock != 0 ? 1 : 0; me_enable(e_menu_options, MA_OPT_SAVECFG_GAME, ready_to_go); me_loop(e_menu_options, &sel, NULL); @@ -278,15 +488,9 @@ static int menu_loop_options(int id, int keys) // ------------ debug menu ------------ -#ifdef __GNUC__ -#define COMPILER "gcc " __VERSION__ -#else -#define COMPILER -#endif - static void draw_frame_debug(void) { - smalltext_out16(4, 1, "build: "__DATE__ " " __TIME__ " " COMPILER, 0xffff); + smalltext_out16(4, 1, "build: "__DATE__ " " __TIME__ " " REV, 0xe7fc); } static void debug_menu_loop(void) @@ -355,6 +559,7 @@ static char *romsel_run(void) return NULL; } + game_config_loaded = 0; ready_to_go = 1; return ret; } @@ -366,6 +571,8 @@ static int main_menu_handler(int id, int keys) switch (id) { case MA_MAIN_RESUME_GAME: + if (ready_to_go) + return 1; break; case MA_MAIN_SAVE_STATE: if (ready_to_go) @@ -376,6 +583,14 @@ static int main_menu_handler(int id, int keys) return menu_loop_savestate(1); break; case MA_MAIN_RESET_GAME: + if (ready_to_go) { + OpenPlugins(); + SysReset(); + if (CheckCdrom() != -1) { + LoadCdrom(); + } + return 1; + } break; case MA_MAIN_LOAD_ROM: ret_name = romsel_run(); @@ -383,7 +598,7 @@ static int main_menu_handler(int id, int keys) return 1; break; case MA_MAIN_CREDITS: - draw_menu_credits(); + draw_menu_credits(draw_frame_debug); in_menu_wait(PBTN_MOK|PBTN_MBACK, 70); break; case MA_MAIN_EXIT: @@ -412,6 +627,8 @@ static menu_entry e_menu_main[] = mee_end, }; +// ---------------------------- + void menu_loop(void) { static int sel = 0; @@ -428,7 +645,7 @@ strcpy(last_selected_fname, "/mnt/ntz/stuff/psx"); in_set_config_int(0, IN_CFG_BLOCKING, 1); do { - me_loop(e_menu_main, &sel, NULL); + me_loop(e_menu_main, &sel, draw_frame_debug); } while (!ready_to_go); /* wait until menu, ok, back is released */ @@ -439,7 +656,56 @@ strcpy(last_selected_fname, "/mnt/ntz/stuff/psx"); memset(g_menuscreen_ptr, 0, g_menuscreen_w * g_menuscreen_h * 2); menu_draw_end(); + menu_prepare_emu(); +} + +void menu_init(void) +{ + menu_set_defconfig(); + menu_load_config(0); + menu_init_common(); + pnd_menu_init(); + last_psx_w = 320; + last_psx_h = 240; +} + +void menu_notify_mode_change(int w, int h) +{ + last_psx_w = w; + last_psx_h = h; + + if (scaling == SCALE_1_1) { + g_layer_x = 800/2 - w/2; g_layer_y = 480/2 - h/2; + g_layer_w = w; g_layer_h = h; + omap_enable_layer(1); + } +} + +void menu_prepare_emu(void) +{ + if (!game_config_loaded) { + menu_load_config(1); + game_config_loaded = 1; + } + + switch (scaling) { + case SCALE_1_1: + menu_notify_mode_change(last_psx_w, last_psx_h); + break; + case SCALE_4_3: + g_layer_x = 80; g_layer_y = 0; + g_layer_w = 640; g_layer_h = 480; + break; + case SCALE_FULLSCREEN: + g_layer_x = 0; g_layer_y = 0; + g_layer_w = 800; g_layer_h = 480; + break; + case SCALE_CUSTOM: + break; + } omap_enable_layer(1); + apply_filter(filter); + apply_cpu_clock(); stop = 0; } diff --git a/frontend/menu.h b/frontend/menu.h new file mode 100644 index 00000000..67beef2b --- /dev/null +++ b/frontend/menu.h @@ -0,0 +1,5 @@ +void menu_init(void); +void menu_prepare_emu(void); +void menu_loop(void); + +void menu_notify_mode_change(int w, int h); diff --git a/frontend/plat_dummy.c b/frontend/plat_dummy.c index b209f4fe..c6af46b7 100644 --- a/frontend/plat_dummy.c +++ b/frontend/plat_dummy.c @@ -9,6 +9,7 @@ #include "linux/fbdev.h" struct vout_fbdev *layer_fb; +int g_layer_x, g_layer_y, g_layer_w, g_layer_h; struct in_default_bind in_evdev_defbinds[] = { { 0, 0, 0 }, }; diff --git a/frontend/plugin_lib.c b/frontend/plugin_lib.c index 26d5218e..7110b354 100644 --- a/frontend/plugin_lib.c +++ b/frontend/plugin_lib.c @@ -20,6 +20,7 @@ #include "common/fonts.h" #include "common/input.h" #include "omap.h" +#include "menu.h" #include "pcnt.h" #include "../libpcsxcore/new_dynarec/new_dynarec.h" @@ -85,6 +86,8 @@ int pl_fbdev_set_mode(int w, int h, int bpp) else pl_fbdev_buf = ret; + menu_notify_mode_change(w, h); + return (ret != NULL) ? 0 : -1; } -- 2.39.2