platform, improve 32x handling for h32 (all supported platforms)
authorkub <derkub@gmail.com>
Tue, 23 Nov 2021 20:49:34 +0000 (21:49 +0100)
committerkub <derkub@gmail.com>
Tue, 23 Nov 2021 20:50:13 +0000 (21:50 +0100)
pico/32x/draw.c
platform/gp2x/emu.c
platform/libretro/libretro.c
platform/linux/emu.c

index adc5165..a027ad1 100644 (file)
@@ -350,6 +350,7 @@ void PicoDrawSetOutFormat32x(pdso_t which, int use_32x_line_mode)
   }
   // always need upscaling for H32, before mixing in 32X layer
   PicoIn.opt |= POPT_EN_SOFTSCALE;
+  PicoIn.opt &= ~POPT_DIS_32C_BORDER;
 
   if (use_32x_line_mode)
     // we'll draw via FinalizeLine32xRGB555 (rare)
index d01da07..37ee82c 100644 (file)
@@ -501,9 +501,13 @@ static void vid_reset_mode(void)
        int gp2x_mode = 16;\r
        int renderer = get_renderer();\r
 \r
-       PicoIn.opt &= ~POPT_ALT_RENDERER;\r
-       emu_scan_begin = NULL;\r
-       emu_scan_end = NULL;\r
+       PicoIn.opt &= ~(POPT_ALT_RENDERER|POPT_DIS_32C_BORDER|POPT_EN_SOFTSCALE);\r
+       if (currentConfig.scaling == EOPT_SCALE_SW) {\r
+               PicoIn.opt |= POPT_EN_SOFTSCALE;\r
+               PicoIn.filter = EOPT_FILTER_BILINEAR2;\r
+       } else if (currentConfig.scaling == EOPT_SCALE_HW)\r
+               // hw scaling, render without any padding\r
+               PicoIn.opt |= POPT_DIS_32C_BORDER;\r
 \r
        switch (renderer) {\r
        case RT_16BIT:\r
@@ -535,6 +539,9 @@ static void vid_reset_mode(void)
                gp2x_mode = 16;\r
        }\r
 \r
+       emu_scan_begin = NULL;\r
+       emu_scan_end = NULL;\r
+\r
        if (currentConfig.EmuOpt & EOPT_WIZ_TEAR_FIX) {\r
                if ((PicoIn.AHW & PAHW_32X) || renderer == RT_16BIT) {\r
                        emu_scan_begin = EmuScanBegin16_rot;\r
@@ -572,14 +579,6 @@ static void vid_reset_mode(void)
 \r
        Pico.m.dirtyPal = 1;\r
 \r
-       PicoIn.opt &= ~(POPT_DIS_32C_BORDER|POPT_EN_SOFTSCALE);\r
-       if (currentConfig.scaling == EOPT_SCALE_SW) {\r
-               PicoIn.opt |= POPT_EN_SOFTSCALE;\r
-               PicoIn.filter = EOPT_FILTER_BILINEAR2;\r
-       } else if (currentConfig.scaling == EOPT_SCALE_HW)\r
-               // hw scaling, render without any padding\r
-               PicoIn.opt |= POPT_DIS_32C_BORDER;\r
-\r
        // palette converters for 8bit modes\r
        make_local_pal = (PicoIn.AHW & PAHW_SMS) ? make_local_pal_sms : make_local_pal_md;\r
 }\r
index 1e15a2a..0af186b 100644 (file)
@@ -43,6 +43,7 @@
 #else
 #include <platform/common/upscale.h>
 #endif
+#include <platform/common/emu.h>
 
 #ifdef _3DS
 #include "3ds/3ds_utils.h"
@@ -619,6 +620,17 @@ int plat_mem_set_exec(void *ptr, size_t size)
    return ret;
 }
 
+static void apply_renderer()
+{
+   PicoIn.opt &= ~(POPT_ALT_RENDERER|POPT_EN_SOFTSCALE);
+   PicoIn.opt |= POPT_DIS_32C_BORDER;
+   if (vout_format == PDF_NONE)
+      PicoIn.opt |= POPT_ALT_RENDERER;
+   PicoDrawSetOutFormat(vout_format, 0);
+   if (!vout_16bit && vout_format == PDF_8BIT)
+      PicoDrawSetOutBuf(Pico.est.Draw2FB, 328);
+}
+
 void emu_video_mode_change(int start_line, int line_count, int start_col, int col_count)
 {
    struct retro_system_av_info av_info;
@@ -629,8 +641,6 @@ void emu_video_mode_change(int start_line, int line_count, int start_col, int co
    vm_current_col_count = col_count;
 
    // 8bit renderes create a 328x256 CLUT image, while 16bit creates 320x240 RGB
-   vout_16bit = vout_format == PDF_RGB555 || (PicoIn.AHW & PAHW_32X);
-
 #if defined(RENDER_GSKIT_PS2)
    // calculate the borders of the real image inside the picodrive image
    vout_width = (vout_16bit ? VOUT_MAX_WIDTH : VOUT_8BIT_WIDTH);
@@ -680,7 +690,10 @@ void emu_video_mode_change(int start_line, int line_count, int start_col, int co
 
 void emu_32x_startup(void)
 {
+   PicoIn.filter = EOPT_FILTER_SMOOTHER; // for H32 upscaling
    PicoDrawSetOutFormat(vout_format, 0);
+   vout_16bit = 1;
+
    if ((vm_current_start_line != -1) &&
        (vm_current_line_count != -1) &&
        (vm_current_start_col != -1) &&
@@ -1302,9 +1315,7 @@ bool retro_load_game(const struct retro_game_info *info)
    PicoIn.sndOut = sndBuffer;
    PsndRerate(0);
 
-   PicoDrawSetOutFormat(vout_format, 0);
-   if (vout_format == PDF_8BIT)
-      PicoDrawSetOutBuf(Pico.est.Draw2FB, 328);
+   apply_renderer();
 
    /* Setup retro memory maps */
    set_memory_maps();
@@ -1651,13 +1662,9 @@ static void update_variables(bool first_run)
          vout_format = PDF_8BIT;
       else if (strcmp(var.value, "accurate") == 0)
          vout_format = PDF_RGB555;
+      vout_16bit = vout_format == PDF_RGB555 || (PicoIn.AHW & PAHW_32X);
 
-      PicoIn.opt &= ~POPT_ALT_RENDERER;
-      if (vout_format == PDF_NONE)
-         PicoIn.opt |= POPT_ALT_RENDERER;
-      PicoDrawSetOutFormat(vout_format, 0);
-      if (vout_format == PDF_8BIT)
-         PicoDrawSetOutBuf(Pico.est.Draw2FB, 328);
+      apply_renderer();
    }
 
    var.value = NULL;
index a6c4cb7..8dd8c54 100644 (file)
@@ -202,6 +202,15 @@ void plat_video_set_buffer(void *buf)
 static void apply_renderer(void)\r
 {\r
        PicoIn.opt &= ~(POPT_ALT_RENDERER|POPT_EN_SOFTSCALE|POPT_DIS_32C_BORDER);\r
+       if (is_16bit_mode()) {\r
+               if (currentConfig.scaling == EOPT_SCALE_SW) {\r
+                       PicoIn.opt |= POPT_EN_SOFTSCALE;\r
+                       PicoIn.filter = currentConfig.filter;\r
+               } else if (currentConfig.scaling == EOPT_SCALE_HW)\r
+                       // hw scaling, render without any padding\r
+                       PicoIn.opt |= POPT_DIS_32C_BORDER;\r
+       } else\r
+               PicoIn.opt |= POPT_DIS_32C_BORDER;\r
 \r
        switch (get_renderer()) {\r
        case RT_16BIT:\r
@@ -226,16 +235,6 @@ static void apply_renderer(void)
 \r
        if (PicoIn.AHW & PAHW_32X)\r
                PicoDrawSetOutBuf(screen_buffer(g_screen_ptr), g_screen_ppitch * 2);\r
-       if (is_16bit_mode()) {\r
-               if (currentConfig.scaling == EOPT_SCALE_SW) {\r
-                       PicoIn.opt |= POPT_EN_SOFTSCALE;\r
-                       PicoIn.filter = currentConfig.filter;\r
-               } else if (currentConfig.scaling == EOPT_SCALE_HW)\r
-                       // hw scaling, render without any padding\r
-                       PicoIn.opt |= POPT_DIS_32C_BORDER;\r
-       } else\r
-               PicoIn.opt |= POPT_DIS_32C_BORDER;\r
-\r
        Pico.m.dirtyPal = 1;\r
 }\r
 \r
@@ -389,7 +388,7 @@ void emu_video_mode_change(int start_line, int line_count, int start_col, int co
                        PicoDrawSetCallbacks(cb_vscaling_begin,cb_vscaling_nop);\r
                break;\r
        case EOPT_SCALE_SW:\r
-               screen_y = (screen_h - 240)/2;\r
+               screen_y = (screen_h - 240)/2 + (out_h > 144);\r
                // NTSC always has 224 visible lines, anything smaller has bars\r
                if (out_h < 224 && out_h > 144)\r
                        screen_y += (224 - out_h)/2;\r