X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=pcsx_rearmed.git;a=blobdiff_plain;f=frontend%2Fplugin_lib.c;h=ab4d4152eb6309a98057b9de590ea1f94c2f40e8;hp=bdf09c7154ae4a4267c6d446f307e5bfa9828e8f;hb=HEAD;hpb=308c6e678a2f0a56a9dee35307070550354f580c diff --git a/frontend/plugin_lib.c b/frontend/plugin_lib.c index bdf09c71..9b6faf44 100644 --- a/frontend/plugin_lib.c +++ b/frontend/plugin_lib.c @@ -33,7 +33,9 @@ #include "psemu_plugin_defs.h" #include "../libpcsxcore/new_dynarec/new_dynarec.h" #include "../libpcsxcore/psxmem_map.h" -#include "../plugins/dfinput/externals.h" +#include "../libpcsxcore/gpu.h" +#include "../libpcsxcore/r3000a.h" +#include "../libpcsxcore/psxcounters.h" #define HUD_HEIGHT 10 @@ -46,7 +48,6 @@ int in_adev[2] = { -1, -1 }, in_adev_axis[2][2] = {{ 0, 1 }, { 0, 1 }}; int in_adev_is_nublike[2]; unsigned short in_keystate[8]; int in_mouse[8][2]; -int in_state_gun; int in_enable_vibration; void *tsdev; void *pl_vout_buf; @@ -134,11 +135,11 @@ static __attribute__((noinline)) void draw_active_chans(int vout_w, int vout_h) static const unsigned short colors[2] = { 0x1fe3, 0x0700 }; unsigned short *dest = (unsigned short *)pl_vout_buf + - vout_w * (vout_h - HUD_HEIGHT) + vout_w / 2 - 192/2; + pl_vout_w * (vout_h - HUD_HEIGHT) + pl_vout_w / 2 - 192/2; unsigned short *d, p; int c, x, y; - if (dest == NULL || pl_vout_bpp != 16) + if (pl_vout_buf == NULL || pl_vout_bpp != 16) return; spu_get_debug_info(&live_chans, &run_chans, &fmod_chans, &noise_chans); @@ -149,7 +150,7 @@ static __attribute__((noinline)) void draw_active_chans(int vout_w, int vout_h) (fmod_chans & (1< g_menuscreen_w) g_layer_w = g_menuscreen_w; - if (g_layer_h > g_menuscreen_h) g_layer_h = g_menuscreen_h; + if (g_scaler != SCALE_CUSTOM) { + g_layer_x = g_menuscreen_w / 2 - g_layer_w / 2; + g_layer_y = g_menuscreen_h / 2 - g_layer_h / 2; + } + if (g_layer_w > g_menuscreen_w * 2) g_layer_w = g_menuscreen_w * 2; + if (g_layer_h > g_menuscreen_h * 2) g_layer_h = g_menuscreen_h * 2; } // XXX: this is platform specific really @@ -302,10 +303,16 @@ static void pl_vout_set_mode(int w, int h, int raw_w, int raw_h, int bpp) menu_notify_mode_change(pl_vout_w, pl_vout_h, pl_vout_bpp); } +static int flip_clear_counter; + +void pl_force_clear(void) +{ + flip_clear_counter = 2; +} + static void pl_vout_flip(const void *vram, int stride, int bgr24, int x, int y, int w, int h, int dims_changed) { - static int clear_counter; unsigned char *dest = pl_vout_buf; const unsigned short *src = vram; int dstride = pl_vout_w, h1 = h; @@ -332,15 +339,15 @@ static void pl_vout_flip(const void *vram, int stride, int bgr24, doffs = xoffs + y * dstride; if (dims_changed) - clear_counter = 2; + flip_clear_counter = 3; - if (clear_counter > 0) { + if (flip_clear_counter > 0) { if (pl_plat_clear) pl_plat_clear(); else memset(pl_vout_buf, 0, dstride * h_full * pl_vout_bpp / 8); - clear_counter--; + flip_clear_counter--; } if (pl_plat_blit) @@ -385,17 +392,21 @@ static void pl_vout_flip(const void *vram, int stride, int bgr24, } else if (scanlines != 0 && scanline_level != 100) { - int l = scanline_level * 2048 / 100; + int h2, l = scanline_level * 2048 / 100; int stride_0 = pl_vout_scale_h >= 2 ? 0 : stride; h1 *= pl_vout_scale_h; - for (; h1 >= 2; h1 -= 2) + while (h1 > 0) { - bgr555_to_rgb565(dest, src, w * 2); - dest += dstride * 2, src += stride_0; + for (h2 = scanlines; h2 > 0 && h1 > 0; h2--, h1--) { + bgr555_to_rgb565(dest, src, w * 2); + dest += dstride * 2, src += stride_0; + } - bgr555_to_rgb565_b(dest, src, w * 2, l); - dest += dstride * 2, src += stride; + for (h2 = scanlines; h2 > 0 && h1 > 0; h2--, h1--) { + bgr555_to_rgb565_b(dest, src, w * 2, l); + dest += dstride * 2, src += stride; + } } } #endif @@ -603,12 +614,14 @@ static void update_input(void) { int actions[IN_BINDTYPE_COUNT] = { 0, }; unsigned int emu_act; + int in_state_gun; + int i; in_update(actions); if (in_type[0] == PSE_PAD_TYPE_ANALOGJOY || in_type[0] == PSE_PAD_TYPE_ANALOGPAD) update_analogs(); emu_act = actions[IN_BINDTYPE_EMU]; - in_state_gun = (emu_act & SACTION_GUN_MASK) >> SACTION_GUN_TRIGGER; + in_state_gun = emu_act & SACTION_GUN_MASK; emu_act &= ~SACTION_GUN_MASK; if (emu_act) { @@ -619,19 +632,49 @@ static void update_input(void) } emu_set_action(emu_act); - in_keystate[0] = actions[IN_BINDTYPE_PLAYER12]; + in_keystate[0] = actions[IN_BINDTYPE_PLAYER12] & 0xffff; + in_keystate[1] = (actions[IN_BINDTYPE_PLAYER12] >> 16) & 0xffff; + + if (tsdev) for (i = 0; i < 2; i++) { + int in = 0, x = 0, y = 0, trigger;; + if (in_type[i] != PSE_PAD_TYPE_GUN + && in_type[i] != PSE_PAD_TYPE_GUNCON) + continue; + trigger = in_type[i] == PSE_PAD_TYPE_GUN + ? (1 << DKEY_SQUARE) : (1 << DKEY_CIRCLE); + + pl_gun_ts_update(tsdev, &x, &y, &in); + in_analog_left[i][0] = 65536; + in_analog_left[i][1] = 65536; + if (in && !(in_state_gun & (1 << SACTION_GUN_TRIGGER2))) { + in_analog_left[i][0] = x; + in_analog_left[i][1] = y; + if (!(g_opts & OPT_TSGUN_NOTRIGGER)) + in_state_gun |= (1 << SACTION_GUN_TRIGGER); + } + in_keystate[i] = 0; + if (in_state_gun & ((1 << SACTION_GUN_TRIGGER) + | (1 << SACTION_GUN_TRIGGER2))) + in_keystate[i] |= trigger; + if (in_state_gun & (1 << SACTION_GUN_A)) + in_keystate[i] |= (1 << DKEY_START); + if (in_state_gun & (1 << SACTION_GUN_B)) + in_keystate[i] |= (1 << DKEY_CROSS); + } } #else /* MAEMO */ extern void update_input(void); #endif -void pl_update_gun(int *xn, int *yn, int *xres, int *yres, int *in) +void pl_gun_byte2(int port, unsigned char byte) { - if (tsdev) - pl_gun_ts_update(tsdev, xn, yn, in); + if (!tsdev || in_type[port] != PSE_PAD_TYPE_GUN || !(byte & 0x10)) + return; + if (in_analog_left[port][0] == 65536) + return; - *xres = psx_w; - *yres = psx_h; + psxScheduleIrq10(4, in_analog_left[port][0] * 1629 / 1024, + in_analog_left[port][1] * psx_h / 1024); } #define MAX_LAG_FRAMES 3 @@ -736,18 +779,20 @@ void pl_frame_limit(void) void pl_timing_prepare(int is_pal_) { + double fps; pl_rearmed_cbs.fskip_advice = 0; pl_rearmed_cbs.flips_per_sec = 0; pl_rearmed_cbs.cpu_usage = 0; is_pal = is_pal_; - frame_interval = is_pal ? 20000 : 16667; - frame_interval1024 = is_pal ? 20000*1024 : 17066667; + fps = psxGetFps(); + frame_interval = (int)(1000000.0 / fps); + frame_interval1024 = (int)(1000000.0 * 1024.0 / fps); // used by P.E.Op.S. frameskip code - pl_rearmed_cbs.gpu_peops.fFrameRateHz = is_pal ? 50.0f : 59.94f; + pl_rearmed_cbs.gpu_peops.fFrameRateHz = (float)fps; pl_rearmed_cbs.gpu_peops.dwFrameRateTicks = - (100000*100 / (unsigned long)(pl_rearmed_cbs.gpu_peops.fFrameRateHz*100)); + (100000*100 / (int)(pl_rearmed_cbs.gpu_peops.fFrameRateHz*100)); } static void pl_get_layer_pos(int *x, int *y, int *w, int *h) @@ -771,6 +816,7 @@ struct rearmed_cbs pl_rearmed_cbs = { .mmap = pl_mmap, .munmap = pl_munmap, .pl_set_gpu_caps = pl_set_gpu_caps, + .gpu_state_change = gpu_state_change, }; /* watchdog */