From e64dc4c54e96643522dc4b8c205d143c7d9b2f1d Mon Sep 17 00:00:00 2001 From: notaz Date: Sat, 18 Jun 2011 01:23:27 +0300 Subject: [PATCH] dfxvideo: decouple from main emu --- frontend/main.c | 7 ++--- frontend/menu.c | 56 +++++++++++++++++++------------------- frontend/plugin.c | 2 ++ frontend/plugin_lib.c | 22 ++++----------- frontend/plugin_lib.h | 12 ++++++-- plugins/dfxvideo/draw_fb.c | 7 ++--- plugins/dfxvideo/gpu.c | 19 ++++++++++++- plugins/gpu_unai/gpu.cpp | 2 +- 8 files changed, 70 insertions(+), 57 deletions(-) diff --git a/frontend/main.c b/frontend/main.c index f97610a6..068fe501 100644 --- a/frontend/main.c +++ b/frontend/main.c @@ -36,9 +36,6 @@ enum sched_action emu_action, emu_action_old; char hud_msg[64]; int hud_new_msg; -// from softgpu plugin -extern int UseFrameSkip; - static void make_path(char *buf, size_t size, const char *dir, const char *fname) { if (fname) @@ -157,9 +154,9 @@ void do_emu_action(void) state_slot = 9; goto do_state_slot; case SACTION_TOGGLE_FSKIP: - UseFrameSkip ^= 1; + pl_rearmed_cbs.frameskip ^= 1; snprintf(hud_msg, sizeof(hud_msg), "FRAMESKIP %s", - UseFrameSkip ? "ON" : "OFF"); + pl_rearmed_cbs.frameskip ? "ON" : "OFF"); break; case SACTION_SCREENSHOT: { diff --git a/frontend/menu.c b/frontend/menu.c index da1caeaa..6dc62f32 100644 --- a/frontend/menu.c +++ b/frontend/menu.c @@ -75,13 +75,6 @@ static char last_selected_fname[MAXPATHLEN]; static int warned_about_bios, region, in_type_sel; int g_opts; -// from softgpu plugin -extern int iUseDither; -extern int UseFrameSkip; -extern uint32_t dwActFixes; -extern float fFrameRateHz; -extern int dwFrameRateTicks; - // sound plugin extern int iUseReverb; extern int iUseInterpolation; @@ -154,8 +147,9 @@ static void menu_sync_config(void) pl_frame_interval = Config.PsxType ? 20000 : 16667; // used by P.E.Op.S. frameskip code - fFrameRateHz = Config.PsxType ? 50.0f : 59.94f; - dwFrameRateTicks = (100000*100 / (unsigned long)(fFrameRateHz*100)); + pl_rearmed_cbs.gpu_peops.fFrameRateHz = Config.PsxType ? 50.0f : 59.94f; + pl_rearmed_cbs.gpu_peops.dwFrameRateTicks = + (100000*100 / (unsigned long)(pl_rearmed_cbs.gpu_peops.fFrameRateHz*100)); } static void menu_set_defconfig(void) @@ -169,9 +163,9 @@ static void menu_set_defconfig(void) Config.Xa = Config.Cdda = Config.Sio = Config.SpuIrq = Config.RCntFix = Config.VSyncWA = 0; - iUseDither = 0; - UseFrameSkip = 1; - dwActFixes = 1<<7; + pl_rearmed_cbs.frameskip = 0; + pl_rearmed_cbs.gpu_peops.iUseDither = 0; + pl_rearmed_cbs.gpu_peops.dwActFixes = 1<<7; iUseReverb = 2; iUseInterpolation = 1; @@ -194,6 +188,9 @@ static void menu_set_defconfig(void) #define CE_INTVAL(val) \ { #val, sizeof(val), &val } +#define CE_INTVAL_P(val) \ + { #val, sizeof(pl_rearmed_cbs.val), &pl_rearmed_cbs.val } + // 'versioned' var, used when defaults change #define CE_INTVAL_V(val, ver) \ { #val #ver, sizeof(val), &val } @@ -228,9 +225,9 @@ static const struct { CE_INTVAL(cpu_clock), CE_INTVAL(g_opts), CE_INTVAL(in_type_sel), - CE_INTVAL(iUseDither), - CE_INTVAL(UseFrameSkip), - CE_INTVAL(dwActFixes), + CE_INTVAL_P(frameskip), + CE_INTVAL_P(gpu_peops.iUseDither), + CE_INTVAL_P(gpu_peops.dwActFixes), CE_INTVAL(iUseReverb), CE_INTVAL(iXAPitch), CE_INTVAL_V(iUseInterpolation, 2), @@ -1054,16 +1051,16 @@ static const char h_gpu_10[] = "Toggle busy flags after drawing"; static menu_entry e_menu_plugin_gpu[] = { - mee_enum ("Dithering", 0, iUseDither, men_gpu_dithering), - mee_onoff_h ("Odd/even bit hack", 0, dwActFixes, 1<<0, h_gpu_0), - mee_onoff_h ("Expand screen width", 0, dwActFixes, 1<<1, h_gpu_1), - mee_onoff_h ("Ignore brightness color", 0, dwActFixes, 1<<2, h_gpu_2), - mee_onoff_h ("Disable coordinate check", 0, dwActFixes, 1<<3, h_gpu_3), - mee_onoff_h ("Lazy screen update", 0, dwActFixes, 1<<6, h_gpu_6), - mee_onoff_h ("Old frame skipping", 0, dwActFixes, 1<<7, h_gpu_7), - mee_onoff_h ("Repeated flat tex triangles ",0,dwActFixes, 1<<8, h_gpu_8), - mee_onoff_h ("Draw quads with triangles", 0, dwActFixes, 1<<9, h_gpu_9), - mee_onoff_h ("Fake 'gpu busy' states", 0, dwActFixes, 1<<10, h_gpu_10), + mee_enum ("Dithering", 0, pl_rearmed_cbs.gpu_peops.iUseDither, men_gpu_dithering), + mee_onoff_h ("Odd/even bit hack", 0, pl_rearmed_cbs.gpu_peops.dwActFixes, 1<<0, h_gpu_0), + mee_onoff_h ("Expand screen width", 0, pl_rearmed_cbs.gpu_peops.dwActFixes, 1<<1, h_gpu_1), + mee_onoff_h ("Ignore brightness color", 0, pl_rearmed_cbs.gpu_peops.dwActFixes, 1<<2, h_gpu_2), + mee_onoff_h ("Disable coordinate check", 0, pl_rearmed_cbs.gpu_peops.dwActFixes, 1<<3, h_gpu_3), + mee_onoff_h ("Lazy screen update", 0, pl_rearmed_cbs.gpu_peops.dwActFixes, 1<<6, h_gpu_6), + mee_onoff_h ("Old frame skipping", 0, pl_rearmed_cbs.gpu_peops.dwActFixes, 1<<7, h_gpu_7), + mee_onoff_h ("Repeated flat tex triangles ",0,pl_rearmed_cbs.gpu_peops.dwActFixes, 1<<8, h_gpu_8), + mee_onoff_h ("Draw quads with triangles", 0, pl_rearmed_cbs.gpu_peops.dwActFixes, 1<<9, h_gpu_9), + mee_onoff_h ("Fake 'gpu busy' states", 0, pl_rearmed_cbs.gpu_peops.dwActFixes, 1<<10, h_gpu_10), mee_end, }; @@ -1101,7 +1098,7 @@ static const char h_bios[] = "HLE is simulated BIOS. BIOS selection is sav "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_gpu[] = "Configure built-in P.E.Op.S. SoftGL Driver V1.17"; +static const char h_gpu[] = "Configure P.E.Op.S. SoftGL Driver V1.17"; static const char h_spu[] = "Configure built-in P.E.Op.S. Sound Driver V1.7"; static menu_entry e_menu_plugin_options[] = @@ -1109,7 +1106,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_handler_h ("Configure built-in GPU plugin", menu_loop_plugin_gpu, h_gpu), + mee_handler_h ("Configure gpu_peops plugin", menu_loop_plugin_gpu, h_gpu), mee_handler_h ("Configure built-in SPU plugin", menu_loop_plugin_spu, h_spu), mee_end, }; @@ -1188,7 +1185,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_onoff_h ("Frameskip", 0, UseFrameSkip, 1, h_frameskip), + mee_onoff_h ("Frameskip", 0, pl_rearmed_cbs.frameskip, 1, h_frameskip), mee_onoff ("Show FPS", 0, g_opts, OPT_SHOWFPS), mee_enum ("Region", 0, region, men_region), mee_range ("CPU clock", MA_OPT_CPU_CLOCKS, cpu_clock, 20, 5000), @@ -1769,6 +1766,9 @@ void menu_prepare_emu(void) apply_filter(filter); apply_cpu_clock(); + // push config to GPU plugin + plugin_call_rearmed_cbs(); + if (GPU_open != NULL) { int ret = GPU_open(&gpuDisp, "PCSX", NULL); if (ret) diff --git a/frontend/plugin.c b/frontend/plugin.c index 0d244fa7..cbb5558d 100644 --- a/frontend/plugin.c +++ b/frontend/plugin.c @@ -76,6 +76,7 @@ extern long GPUdmaChain(uint32_t *,uint32_t); extern void GPUupdateLace(void); extern long GPUfreeze(uint32_t, void *); extern void GPUvBlank(int, uint32_t *); +extern void GPUrearmedCallbacks(const struct rearmed_cbs *cbs); #define DUMMY(id, name) \ @@ -168,6 +169,7 @@ static const struct { DIRECT_GPU(GPUdmaChain), DIRECT_GPU(GPUfreeze), DIRECT_GPU(GPUvBlank), + DIRECT_GPU(GPUrearmedCallbacks), DUMMY_GPU(GPUdisplayText), /* diff --git a/frontend/plugin_lib.c b/frontend/plugin_lib.c index ee0e0868..58c67d27 100644 --- a/frontend/plugin_lib.c +++ b/frontend/plugin_lib.c @@ -34,11 +34,7 @@ int in_type, in_keystate, in_a1[2] = { 127, 127 }, in_a2[2] = { 127, 127 }; static int pl_fbdev_w, pl_fbdev_h, pl_fbdev_bpp; static int flip_cnt, vsync_cnt, flips_per_sec, tick_per_sec; static float vsps_cur; -static int plugin_skip_advice; static int vsync_usec_time; -// P.E.Op.S. -extern int UseFrameSkip; -extern float fps_skip; static int get_cpu_ticks(void) { @@ -252,16 +248,11 @@ void pl_frame_limit(void) usleep(diff - pl_frame_interval / 2); } - if (UseFrameSkip) { - if (diff < -pl_frame_interval) { - // P.E.Op.S. makes skip decision based on this - fps_skip = 1.0f; - plugin_skip_advice = 1; - } - else if (diff >= 0) { - fps_skip = 100.0f; - plugin_skip_advice = 0; - } + if (pl_rearmed_cbs.frameskip) { + if (diff < -pl_frame_interval) + pl_rearmed_cbs.fskip_advice = 1; + else if (diff >= 0) + pl_rearmed_cbs.fskip_advice = 0; } pcnt_start(PCNT_ALL); @@ -311,13 +302,12 @@ static void pl_get_layer_pos(int *x, int *y, int *w, int *h) *h = g_layer_h; } -const struct rearmed_cbs pl_rearmed_cbs = { +struct rearmed_cbs pl_rearmed_cbs = { pl_get_layer_pos, pl_fbdev_open, pl_fbdev_set_mode, pl_fbdev_flip, pl_fbdev_close, - &plugin_skip_advice, }; /* watchdog */ diff --git a/frontend/plugin_lib.h b/frontend/plugin_lib.h index 61dc3bec..49894afd 100644 --- a/frontend/plugin_lib.h +++ b/frontend/plugin_lib.h @@ -37,10 +37,18 @@ struct rearmed_cbs { void *(*pl_fbdev_set_mode)(int w, int h, int bpp); void *(*pl_fbdev_flip)(void); void (*pl_fbdev_close)(void); - int *fskip_option; + // gpu options + int frameskip; + int fskip_advice; + struct { + int iUseDither; + int dwActFixes; + float fFrameRateHz; + int dwFrameRateTicks; + } gpu_peops; }; -extern const struct rearmed_cbs pl_rearmed_cbs; +extern struct rearmed_cbs pl_rearmed_cbs; extern int pl_frame_interval; diff --git a/plugins/dfxvideo/draw_fb.c b/plugins/dfxvideo/draw_fb.c index b5608130..a3f50e82 100644 --- a/plugins/dfxvideo/draw_fb.c +++ b/plugins/dfxvideo/draw_fb.c @@ -9,9 +9,9 @@ #include "gpu.h" -#include "plugin_lib.h" -#include "arm_utils.h" -#include "pcnt.h" +#include "../../frontend/plugin_lib.h" +#include "../../frontend/arm_utils.h" +#include "../../frontend/pcnt.h" // misc globals long lLowerpart; @@ -101,4 +101,3 @@ void CloseDisplay(void) { pl_fbdev_close(); } - diff --git a/plugins/dfxvideo/gpu.c b/plugins/dfxvideo/gpu.c index b3845263..9a614de2 100644 --- a/plugins/dfxvideo/gpu.c +++ b/plugins/dfxvideo/gpu.c @@ -62,6 +62,7 @@ BOOL bDoLazyUpdate=FALSE; uint32_t lGPUInfoVals[16]; static int iFakePrimBusy=0; static uint32_t vBlank=0; +static const int *skip_advice; //////////////////////////////////////////////////////////////////////// // some misc external display funcs @@ -232,7 +233,8 @@ static void decideSkip(void) if(dwActFixes&0xa0) // -> pc fps calculation fix/old skipping fix { - if((fps_skip < fFrameRateHz) && !bSkipNextFrame) // -> skip max one in a row + int skip = (skip_advice && *skip_advice) || fps_skip < fFrameRateHz; + if(skip && !bSkipNextFrame) // -> skip max one in a row {bSkipNextFrame = TRUE; fps_skip=fFrameRateHz;} else bSkipNextFrame = FALSE; } @@ -1132,3 +1134,18 @@ void CALLBACK GPUvBlank(int val) vBlank=val?0x80000000:0; } +// rearmed thing +#include "../../frontend/plugin_lib.h" + +void GPUrearmedCallbacks(const struct rearmed_cbs *cbs) +{ + // sync config + UseFrameSkip = cbs->frameskip; + iUseDither = cbs->gpu_peops.iUseDither; + dwActFixes = cbs->gpu_peops.dwActFixes; + fFrameRateHz = cbs->gpu_peops.fFrameRateHz; + dwFrameRateTicks = cbs->gpu_peops.dwFrameRateTicks; + + skip_advice = &cbs->fskip_advice; + fps_skip = 100.0f; +} diff --git a/plugins/gpu_unai/gpu.cpp b/plugins/gpu_unai/gpu.cpp index 0ef8f51f..808c8916 100644 --- a/plugins/gpu_unai/gpu.cpp +++ b/plugins/gpu_unai/gpu.cpp @@ -938,7 +938,7 @@ void GPU_updateLace(void) blit(); fb_dirty = false; - if (*cbs->fskip_option) + if (cbs->fskip_advice) isSkip = true; } else -- 2.39.2