X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=pcsx_rearmed.git;a=blobdiff_plain;f=frontend%2Flibretro.c;h=0869a2589f25e3c937f51e37c80bd1e9def763ba;hp=4e509a0a37550ffdb9a20e1ba6447ac2ac8ae386;hb=1a6164a1aaa1a7f5117730f30410461bb76b63f5;hpb=3601e36bd526c63c842f68b2ff6cac82954e5e7e diff --git a/frontend/libretro.c b/frontend/libretro.c index 4e509a0a..0869a258 100644 --- a/frontend/libretro.c +++ b/frontend/libretro.c @@ -28,6 +28,10 @@ static retro_environment_t environ_cb; static retro_audio_sample_batch_t audio_batch_cb; static void *vout_buf; +static int vout_width, vout_height; +static int vout_doffs_old, vout_fb_dirty; +static bool vout_can_dupe; + static int samples_sent, samples_to_send; static int plugins_opened; @@ -81,6 +85,8 @@ static int vout_open(void) static void vout_set_mode(int w, int h, int raw_w, int raw_h, int bpp) { + vout_width = w; + vout_height = h; } #ifndef FRONTEND_SUPPORTS_RGB565 @@ -95,15 +101,12 @@ static void convert(void *buf, size_t bytes) } #endif -static unsigned game_width; -static unsigned game_height; -static unsigned game_fb_dirty; - static void vout_flip(const void *vram, int stride, int bgr24, int w, int h) { unsigned short *dest = vout_buf; const unsigned short *src = vram; - int dstride = w, h1 = h; + int dstride = vout_width, h1 = h; + int doffs; if (vram == NULL) { // blanking @@ -111,6 +114,15 @@ static void vout_flip(const void *vram, int stride, int bgr24, int w, int h) goto out; } + doffs = (vout_height - h) * dstride; + doffs += (dstride - w) / 2 & ~1; + if (doffs != vout_doffs_old) { + // clear borders + memset(vout_buf, 0, dstride * h * 2); + vout_doffs_old = doffs; + } + dest += doffs; + if (bgr24) { // XXX: could we switch to RETRO_PIXEL_FORMAT_XRGB8888 here? @@ -129,11 +141,9 @@ static void vout_flip(const void *vram, int stride, int bgr24, int w, int h) out: #ifndef FRONTEND_SUPPORTS_RGB565 - convert(vout_buf, w * h * 2); + convert(vout_buf, vout_width * vout_height * 2); #endif - game_width = w; - game_height = h; - game_fb_dirty = 1; + vout_fb_dirty = 1; pl_rearmed_cbs.flip_cnt++; } @@ -393,8 +403,9 @@ void retro_run(void) samples_to_send += 44100 / 60; - video_cb(game_fb_dirty ? vout_buf : NULL, game_width, game_height, game_width * 2); - game_fb_dirty = 0; + video_cb((vout_fb_dirty || !vout_can_dupe) ? vout_buf : NULL, + vout_width, vout_height, vout_width * 2); + vout_fb_dirty = 0; } void retro_init(void) @@ -437,6 +448,17 @@ void retro_init(void) level = 1; environ_cb(RETRO_ENVIRONMENT_SET_PERFORMANCE_LEVEL, &level); + environ_cb(RETRO_ENVIRONMENT_GET_CAN_DUPE, &vout_can_dupe); + + /* Set how much slower PSX CPU runs * 100 (so that 200 is 2 times) + * we have to do this because cache misses and some IO penalties + * are not emulated. Warning: changing this may break compatibility. */ +#ifdef __ARM_ARCH_7A__ + cycle_multiplier = 175; +#else + cycle_multiplier = 200; +#endif + McdDisable[0] = 0; McdDisable[1] = 1; init_memcard(Mcd1Data);