X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=pcsx_rearmed.git;a=blobdiff_plain;f=frontend%2Fplugin_lib.c;h=472a1b2c1e0737a2e2ec4a2547d300016646b1ec;hp=a0f16e9324ff30f755b3aa4e96192fb4e1d0df26;hb=0fed3dc3d9799a9db68dd8be4172aafb0e161957;hpb=c9099d020a1e523d97541f426f7d44da1392526f diff --git a/frontend/plugin_lib.c b/frontend/plugin_lib.c index a0f16e93..472a1b2c 100644 --- a/frontend/plugin_lib.c +++ b/frontend/plugin_lib.c @@ -28,8 +28,9 @@ #include "plat.h" #include "pcnt.h" #include "pl_gun_ts.h" +#include "psemu_plugin_defs.h" #include "../libpcsxcore/new_dynarec/new_dynarec.h" -#include "../libpcsxcore/psemu_plugin_defs.h" +#include "../libpcsxcore/psxmem_map.h" #include "../plugins/gpulib/cspace.h" #include "../plugins/dfinput/externals.h" @@ -43,7 +44,7 @@ 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; +static int pl_vout_scale, pl_vout_yoffset; static int psx_w, psx_h, psx_bpp; static int vsync_cnt; static int is_pal, frame_interval, frame_interval1024; @@ -146,12 +147,15 @@ static __attribute__((noinline)) void draw_active_chans(int vout_w, int vout_h) } } -void pl_print_hud(int w, int h, int xborder) +static void print_hud(int w, int h, int xborder) { if (h < 16) return; - xborder += (pl_vout_w - w) / 2; + if (w < pl_vout_w) + xborder += (pl_vout_w - w) / 2; + if (h > pl_vout_h) + h = pl_vout_h; if (g_opts & OPT_SHOWSPU) draw_active_chans(w, h); @@ -226,6 +230,7 @@ static int resolution_ok(int w, int h) static void pl_vout_set_mode(int w, int h, int raw_w, int raw_h, int bpp) { int vout_w, vout_h, vout_bpp; + int buf_yoffset = 0; // special h handling, Wipeout likes to change it by 1-6 static int vsync_cnt_ms_prev; @@ -239,6 +244,12 @@ static void pl_vout_set_mode(int w, int h, int raw_w, int raw_h, int bpp) vout_h = h; vout_bpp = psx_bpp = bpp; + // don't use very low heights + if (vout_h < 192) { + buf_yoffset = (192 - vout_h) / 2; + vout_h = 192; + } + pl_vout_scale = 1; #ifdef __ARM_NEON__ if (soft_filter) { @@ -254,10 +265,6 @@ static void pl_vout_set_mode(int w, int h, int raw_w, int raw_h, int bpp) } #endif - if (pl_vout_buf != NULL && vout_w == pl_vout_w && vout_h == pl_vout_h - && vout_bpp == pl_vout_bpp) - return; - update_layer_size(vout_w, vout_h); pl_vout_buf = plat_gvideo_set_mode(&vout_w, &vout_h, &vout_bpp); @@ -268,7 +275,11 @@ static void pl_vout_set_mode(int w, int h, int raw_w, int raw_h, int bpp) pl_vout_w = vout_w; pl_vout_h = vout_h; pl_vout_bpp = vout_bpp; + pl_vout_yoffset = buf_yoffset; } + if (pl_vout_buf != NULL) + pl_vout_buf = (char *)pl_vout_buf + + pl_vout_yoffset * pl_vout_w * pl_vout_bpp / 8; menu_notify_mode_change(pl_vout_w, pl_vout_h, pl_vout_bpp); } @@ -359,13 +370,17 @@ static void pl_vout_flip(const void *vram, int stride, int bgr24, int w, int h) } out_hud: - pl_print_hud(w * pl_vout_scale, h * pl_vout_scale, 0); + print_hud(w * pl_vout_scale, h * pl_vout_scale, 0); out: pcnt_end(PCNT_BLIT); // let's flip now pl_vout_buf = plat_gvideo_flip(); + if (pl_vout_buf != NULL) + pl_vout_buf = (char *)pl_vout_buf + + pl_vout_yoffset * pl_vout_w * pl_vout_bpp / 8; + pl_rearmed_cbs.flip_cnt++; } @@ -698,15 +713,8 @@ static void pl_get_layer_pos(int *x, int *y, int *w, int *h) *h = g_layer_h; } -static void *pl_mmap(unsigned int size) -{ - return plat_mmap(0, size, 0, 0); -} - -static void pl_munmap(void *ptr, unsigned int size) -{ - plat_munmap(ptr, size); -} +static void *pl_mmap(unsigned int size); +static void pl_munmap(void *ptr, unsigned int size); struct rearmed_cbs pl_rearmed_cbs = { pl_get_layer_pos, @@ -774,6 +782,27 @@ void pl_start_watchdog(void) fprintf(stderr, "could not start watchdog: %d\n", ret); } +static void *pl_emu_mmap(unsigned long addr, size_t size, int is_fixed, + enum psxMapTag tag) +{ + return plat_mmap(addr, size, 0, is_fixed); +} + +static void pl_emu_munmap(void *ptr, size_t size, enum psxMapTag tag) +{ + plat_munmap(ptr, size); +} + +static void *pl_mmap(unsigned int size) +{ + return psxMapHook(0, size, 0, MAP_TAG_VRAM); +} + +static void pl_munmap(void *ptr, unsigned int size) +{ + psxUnmapHook(ptr, size, MAP_TAG_VRAM); +} + void pl_init(void) { extern unsigned int hSyncCount; // from psxcounters @@ -786,4 +815,7 @@ void pl_init(void) pl_rearmed_cbs.gpu_hcnt = &hSyncCount; pl_rearmed_cbs.gpu_frame_count = &frame_counter; + + psxMapHook = pl_emu_mmap; + psxUnmapHook = pl_emu_munmap; }