X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=frontend%2Fplugin_lib.c;h=8a6b6adb1f5f8b09609c6209689de52fdca568dc;hb=2db412ade2b09ca04da81d91b75bbf6475dbde5a;hp=a3dcbab9e56bd2461f03d84c99cba97e353baa05;hpb=c82f907a99f7d0d3071471489d247f4b4394a8b7;p=pcsx_rearmed.git diff --git a/frontend/plugin_lib.c b/frontend/plugin_lib.c index a3dcbab9..8a6b6adb 100644 --- a/frontend/plugin_lib.c +++ b/frontend/plugin_lib.c @@ -16,6 +16,7 @@ #include #include #include +#include #include "libpicofe/fonts.h" #include "libpicofe/input.h" @@ -32,19 +33,25 @@ #include "psemu_plugin_defs.h" #include "../libpcsxcore/new_dynarec/new_dynarec.h" #include "../libpcsxcore/psxmem_map.h" -#include "../plugins/dfinput/externals.h" -int in_type1, in_type2; -int in_a1[2] = { 127, 127 }, in_a2[2] = { 127, 127 }; +#define HUD_HEIGHT 10 + +int in_type[8]; +int multitap1; +int multitap2; +int in_analog_left[8][2] = {{ 127, 127 },{ 127, 127 },{ 127, 127 },{ 127, 127 },{ 127, 127 },{ 127, 127 },{ 127, 127 },{ 127, 127 }}; +int in_analog_right[8][2] = {{ 127, 127 },{ 127, 127 },{ 127, 127 },{ 127, 127 },{ 127, 127 },{ 127, 127 },{ 127, 127 },{ 127, 127 }}; int in_adev[2] = { -1, -1 }, in_adev_axis[2][2] = {{ 0, 1 }, { 0, 1 }}; int in_adev_is_nublike[2]; -int in_keystate, in_state_gun; +unsigned short in_keystate[8]; +int in_mouse[8][2]; +int in_state_gun; int in_enable_vibration; void *tsdev; void *pl_vout_buf; int g_layer_x, g_layer_y, g_layer_w, g_layer_h; static int pl_vout_w, pl_vout_h, pl_vout_bpp; /* output display/layer */ -static int pl_vout_scale, pl_vout_yoffset; +static int pl_vout_scale_w, pl_vout_scale_h, pl_vout_yoffset; static int psx_w, psx_h, psx_bpp; static int vsync_cnt; static int is_pal, frame_interval, frame_interval1024; @@ -101,20 +108,20 @@ static void hud_printf(void *fb, int w, int x, int y, const char *texto, ...) static void print_msg(int h, int border) { - hud_print(pl_vout_buf, pl_vout_w, border + 2, h - 10, hud_msg); + hud_print(pl_vout_buf, pl_vout_w, border + 2, h - HUD_HEIGHT, hud_msg); } static void print_fps(int h, int border) { - hud_printf(pl_vout_buf, pl_vout_w, border + 2, h - 10, + hud_printf(pl_vout_buf, pl_vout_w, border + 2, h - HUD_HEIGHT, "%2d %4.1f", pl_rearmed_cbs.flips_per_sec, pl_rearmed_cbs.vsps_cur); } -static void print_cpu_usage(int w, int h, int border) +static void print_cpu_usage(int x, int h) { - hud_printf(pl_vout_buf, pl_vout_w, pl_vout_w - border - 28, h - 10, - "%3d", pl_rearmed_cbs.cpu_usage); + hud_printf(pl_vout_buf, pl_vout_w, x - 28, + h - HUD_HEIGHT, "%3d", pl_rearmed_cbs.cpu_usage); } // draw 192x8 status of 24 sound channels @@ -126,7 +133,7 @@ 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 - 10) + vout_w / 2 - 192/2; + vout_w * (vout_h - HUD_HEIGHT) + vout_w / 2 - 192/2; unsigned short *d, p; int c, x, y; @@ -147,13 +154,11 @@ static __attribute__((noinline)) void draw_active_chans(int vout_w, int vout_h) } } -static void print_hud(int w, int h, int xborder) +static void print_hud(int x, int w, int h) { - if (h < 16) + if (h < 192) return; - if (w < pl_vout_w) - xborder += (pl_vout_w - w) / 2; if (h > pl_vout_h) h = pl_vout_h; @@ -161,12 +166,12 @@ static void print_hud(int w, int h, int xborder) draw_active_chans(w, h); if (hud_msg[0] != 0) - print_msg(h, xborder); + print_msg(h, x); else if (g_opts & OPT_SHOWFPS) - print_fps(h, xborder); + print_fps(h, x); if (g_opts & OPT_SHOWCPU) - print_cpu_usage(w, h, xborder); + print_cpu_usage(x + w, h); } /* update scaler target size according to user settings */ @@ -180,6 +185,14 @@ static void update_layer_size(int w, int h) g_layer_w = w; g_layer_h = h; break; + case SCALE_2_2: + g_layer_w = w; g_layer_h = h; + if (w * 2 <= g_menuscreen_w) + g_layer_w = w * 2; + if (h * 2 <= g_menuscreen_h) + g_layer_h = h * 2; + break; + case SCALE_4_3v2: if (h > g_menuscreen_h || (240 < h && h <= 360)) goto fractional_4_3; @@ -222,7 +235,7 @@ static void update_layer_size(int w, int h) } // XXX: this is platform specific really -static int resolution_ok(int w, int h) +static inline int resolution_ok(int w, int h) { return w <= 1024 && h <= 512; } @@ -247,26 +260,27 @@ static void pl_vout_set_mode(int w, int h, int raw_w, int raw_h, int bpp) if (pl_rearmed_cbs.only_16bpp) vout_bpp = 16; - // don't use very low heights - if (vout_h < 192) { - buf_yoffset = (192 - vout_h) / 2; - vout_h = 192; - } + assert(vout_h >= 192); - pl_vout_scale = 1; + pl_vout_scale_w = pl_vout_scale_h = 1; #ifdef __ARM_NEON__ if (soft_filter) { if (resolution_ok(w * 2, h * 2) && bpp == 16) { - vout_w *= 2; - vout_h *= 2; - pl_vout_scale = 2; + pl_vout_scale_w = 2; + pl_vout_scale_h = 2; } else { // filter unavailable hud_msg[0] = 0; } } + else if (scanlines != 0 && scanline_level != 100 && bpp == 16) { + if (h <= 256) + pl_vout_scale_h = 2; + } #endif + vout_w *= pl_vout_scale_w; + vout_h *= pl_vout_scale_h; update_layer_size(vout_w, vout_h); @@ -287,13 +301,15 @@ 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 void pl_vout_flip(const void *vram, int stride, int bgr24, int w, int h) +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 doffs_old, clear_counter; + static int clear_counter; unsigned char *dest = pl_vout_buf; const unsigned short *src = vram; int dstride = pl_vout_w, h1 = h; - int doffs; + int h_full = pl_vout_h - pl_vout_yoffset; + int xoffs = 0, doffs; pcnt_start(PCNT_BLIT); @@ -303,23 +319,26 @@ static void pl_vout_flip(const void *vram, int stride, int bgr24, int w, int h) pl_plat_clear(); else memset(pl_vout_buf, 0, - dstride * pl_vout_h * pl_vout_bpp / 8); + dstride * h_full * pl_vout_bpp / 8); goto out_hud; } - // borders - doffs = (dstride - w * pl_vout_scale) / 2 & ~1; + assert(x + w <= pl_vout_w); + assert(y + h <= pl_vout_h); + + // offset + xoffs = x * pl_vout_scale_w; + doffs = xoffs + y * dstride; - if (doffs > doffs_old) + if (dims_changed) clear_counter = 2; - doffs_old = doffs; if (clear_counter > 0) { if (pl_plat_clear) pl_plat_clear(); else memset(pl_vout_buf, 0, - dstride * pl_vout_h * pl_vout_bpp / 8); + dstride * h_full * pl_vout_bpp / 8); clear_counter--; } @@ -353,16 +372,31 @@ static void pl_vout_flip(const void *vram, int stride, int bgr24, int w, int h) } } #ifdef __ARM_NEON__ - else if (soft_filter == SOFT_FILTER_SCALE2X && pl_vout_scale == 2) + else if (soft_filter == SOFT_FILTER_SCALE2X && pl_vout_scale_w == 2) { neon_scale2x_16_16(src, (void *)dest, w, stride * 2, dstride * 2, h); } - else if (soft_filter == SOFT_FILTER_EAGLE2X && pl_vout_scale == 2) + else if (soft_filter == SOFT_FILTER_EAGLE2X && pl_vout_scale_w == 2) { neon_eagle2x_16_16(src, (void *)dest, w, stride * 2, dstride * 2, h); } + else if (scanlines != 0 && scanline_level != 100) + { + int 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) + { + 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; + } + } #endif else { @@ -373,7 +407,7 @@ static void pl_vout_flip(const void *vram, int stride, int bgr24, int w, int h) } out_hud: - print_hud(w * pl_vout_scale, h * pl_vout_scale, 0); + print_hud(xoffs, w * pl_vout_scale_w, (y + h) * pl_vout_scale_h); out: pcnt_end(PCNT_BLIT); @@ -436,7 +470,8 @@ static int dispmode_default(void) return 1; } -int dispmode_doubleres(void) +#ifdef BUILTIN_GPU_NEON +static int dispmode_doubleres(void) { if (!(pl_rearmed_cbs.gpu_caps & GPU_CAP_SUPPORTS_2X) || !resolution_ok(psx_w * 2, psx_h * 2) || psx_bpp != 16) @@ -447,8 +482,10 @@ int dispmode_doubleres(void) snprintf(hud_msg, sizeof(hud_msg), "double resolution"); return 1; } +#endif -int dispmode_scale2x(void) +#ifdef __ARM_NEON__ +static int dispmode_scale2x(void) { if (!resolution_ok(psx_w * 2, psx_h * 2) || psx_bpp != 16) return 0; @@ -459,7 +496,7 @@ int dispmode_scale2x(void) return 1; } -int dispmode_eagle2x(void) +static int dispmode_eagle2x(void) { if (!resolution_ok(psx_w * 2, psx_h * 2) || psx_bpp != 16) return 0; @@ -469,11 +506,14 @@ int dispmode_eagle2x(void) snprintf(hud_msg, sizeof(hud_msg), "eagle2x"); return 1; } +#endif static int (*dispmode_switchers[])(void) = { dispmode_default, -#ifdef __ARM_NEON__ +#ifdef BUILTIN_GPU_NEON dispmode_doubleres, +#endif +#ifdef __ARM_NEON__ dispmode_scale2x, dispmode_eagle2x, #endif @@ -528,7 +568,7 @@ static void update_analog_nub_adjust(int *x_, int *y_) static void update_analogs(void) { - int *nubp[2] = { in_a1, in_a2 }; + int *nubp[2] = { in_analog_left[0], in_analog_right[0] }; int vals[2]; int i, a, v, ret; @@ -556,7 +596,6 @@ static void update_analogs(void) } } - //printf("%4d %4d %4d %4d\n", in_a1[0], in_a1[1], in_a2[0], in_a2[1]); } static void update_input(void) @@ -565,7 +604,7 @@ static void update_input(void) unsigned int emu_act; in_update(actions); - if (in_type1 == PSE_PAD_TYPE_ANALOGPAD) + 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; @@ -579,21 +618,19 @@ static void update_input(void) } emu_set_action(emu_act); - in_keystate = actions[IN_BINDTYPE_PLAYER12]; + in_keystate[0] = actions[IN_BINDTYPE_PLAYER12]; + + // fixme + //if (in_type[0] == PSE_PAD_TYPE_GUNCON && tsdev) + // pl_gun_ts_update(tsdev, xn, yn, in); + // in_analog_left[0][0] = xn } #else /* MAEMO */ -static void update_input(void) -{ -} +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); - - *xres = psx_w; - *yres = psx_h; } #define MAX_LAG_FRAMES 3 @@ -640,6 +677,7 @@ void pl_frame_limit(void) hud_msg[0] = 0; } tv_old = now; + //new_dynarec_print_stats(); } #ifdef PCNT static int ya_vsync_count;