frontend: handle double res rendering, enable on x86_64
[pcsx_rearmed.git] / frontend / plugin_lib.c
index 56da763..588f133 100644 (file)
@@ -34,6 +34,8 @@
 #include "../libpcsxcore/psxmem_map.h"
 #include "../plugins/dfinput/externals.h"
 
+#define HUD_HEIGHT 10
+
 int in_type1, in_type2;
 int in_a1[2] = { 127, 127 }, in_a2[2] = { 127, 127 };
 int in_adev[2] = { -1, -1 }, in_adev_axis[2][2] = {{ 0, 1 }, { 0, 1 }};
@@ -101,20 +103,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)
 {
-       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, pl_vout_w - border - 28,
+               h - HUD_HEIGHT, "%3d", pl_rearmed_cbs.cpu_usage);
 }
 
 // draw 192x8 status of 24 sound channels
@@ -126,7 +128,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;
 
@@ -306,6 +308,7 @@ static void pl_vout_flip(const void *vram, int stride, int bgr24, int w, int h)
        unsigned char *dest = pl_vout_buf;
        const unsigned short *src = vram;
        int dstride = pl_vout_w, h1 = h;
+       int h_full = pl_vout_h - pl_vout_yoffset;
        int doffs;
 
        pcnt_start(PCNT_BLIT);
@@ -316,7 +319,7 @@ 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;
        }
 
@@ -332,7 +335,7 @@ 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);
                clear_counter--;
        }
 
@@ -394,6 +397,8 @@ static void pl_vout_flip(const void *vram, int stride, int bgr24, int w, int h)
 #endif
        else
        {
+               src = (void *)((uintptr_t)src & ~3); // align for the blitter
+
                for (; h1-- > 0; dest += dstride * 2, src += stride)
                {
                        bgr555_to_rgb565(dest, src, w * 2);
@@ -464,7 +469,7 @@ static int dispmode_default(void)
        return 1;
 }
 
-#ifdef __ARM_NEON__
+#ifdef BUILTIN_GPU_NEON
 static int dispmode_doubleres(void)
 {
        if (!(pl_rearmed_cbs.gpu_caps & GPU_CAP_SUPPORTS_2X)
@@ -476,7 +481,9 @@ static int dispmode_doubleres(void)
        snprintf(hud_msg, sizeof(hud_msg), "double resolution");
        return 1;
 }
+#endif
 
+#ifdef __ARM_NEON__
 static int dispmode_scale2x(void)
 {
        if (!resolution_ok(psx_w * 2, psx_h * 2) || psx_bpp != 16)
@@ -502,8 +509,10 @@ static int dispmode_eagle2x(void)
 
 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
@@ -668,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;