Browse Source

platform, improve 32x handling for h32 (all supported platforms) and bumped libchdr submodule

root 2 years ago
parent
commit
7cc056be8e
5 changed files with 40 additions and 34 deletions
  1. 1 0
      pico/32x/draw.c
  2. 1 1
      pico/cd/libchdr
  3. 10 11
      platform/gp2x/emu.c
  4. 18 11
      platform/libretro/libretro.c
  5. 10 11
      platform/linux/emu.c

+ 1 - 0
pico/32x/draw.c

@@ -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)

+ 1 - 1
pico/cd/libchdr

@@ -1 +1 @@
-Subproject commit 5de1a59019815ccdbba0fe07c71b31406d023248
+Subproject commit 7972daa6ca6bf631bf54d60c5ed09eb76472bb79

+ 10 - 11
platform/gp2x/emu.c

@@ -501,9 +501,13 @@ static void vid_reset_mode(void)
 	int gp2x_mode = 16;
 	int renderer = get_renderer();
 
-	PicoIn.opt &= ~POPT_ALT_RENDERER;
-	emu_scan_begin = NULL;
-	emu_scan_end = NULL;
+	PicoIn.opt &= ~(POPT_ALT_RENDERER|POPT_DIS_32C_BORDER|POPT_EN_SOFTSCALE);
+	if (currentConfig.scaling == EOPT_SCALE_SW) {
+		PicoIn.opt |= POPT_EN_SOFTSCALE;
+		PicoIn.filter = EOPT_FILTER_BILINEAR2;
+	} else if (currentConfig.scaling == EOPT_SCALE_HW)
+		// hw scaling, render without any padding
+		PicoIn.opt |= POPT_DIS_32C_BORDER;
 
 	switch (renderer) {
 	case RT_16BIT:
@@ -535,6 +539,9 @@ static void vid_reset_mode(void)
 		gp2x_mode = 16;
 	}
 
+	emu_scan_begin = NULL;
+	emu_scan_end = NULL;
+
 	if (currentConfig.EmuOpt & EOPT_WIZ_TEAR_FIX) {
 		if ((PicoIn.AHW & PAHW_32X) || renderer == RT_16BIT) {
 			emu_scan_begin = EmuScanBegin16_rot;
@@ -572,14 +579,6 @@ static void vid_reset_mode(void)
 
 	Pico.m.dirtyPal = 1;
 
-	PicoIn.opt &= ~(POPT_DIS_32C_BORDER|POPT_EN_SOFTSCALE);
-	if (currentConfig.scaling == EOPT_SCALE_SW) {
-		PicoIn.opt |= POPT_EN_SOFTSCALE;
-		PicoIn.filter = EOPT_FILTER_BILINEAR2;
-	} else if (currentConfig.scaling == EOPT_SCALE_HW)
-		// hw scaling, render without any padding
-		PicoIn.opt |= POPT_DIS_32C_BORDER;
-
 	// palette converters for 8bit modes
 	make_local_pal = (PicoIn.AHW & PAHW_SMS) ? make_local_pal_sms : make_local_pal_md;
 }

+ 18 - 11
platform/libretro/libretro.c

@@ -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;

+ 10 - 11
platform/linux/emu.c

@@ -207,6 +207,15 @@ void plat_video_set_buffer(void *buf)
 static void apply_renderer(void)
 {
 	PicoIn.opt &= ~(POPT_ALT_RENDERER|POPT_EN_SOFTSCALE|POPT_DIS_32C_BORDER);
+	if (is_16bit_mode()) {
+		if (currentConfig.scaling == EOPT_SCALE_SW) {
+			PicoIn.opt |= POPT_EN_SOFTSCALE;
+			PicoIn.filter = currentConfig.filter;
+		} else if (currentConfig.scaling == EOPT_SCALE_HW)
+			// hw scaling, render without any padding
+			PicoIn.opt |= POPT_DIS_32C_BORDER;
+	} else
+		PicoIn.opt |= POPT_DIS_32C_BORDER;
 
 	switch (get_renderer()) {
 	case RT_16BIT:
@@ -231,16 +240,6 @@ static void apply_renderer(void)
 
 	if (PicoIn.AHW & PAHW_32X)
 		PicoDrawSetOutBuf(screen_buffer(g_screen_ptr), g_screen_ppitch * 2);
-	if (is_16bit_mode()) {
-		if (currentConfig.scaling == EOPT_SCALE_SW) {
-			PicoIn.opt |= POPT_EN_SOFTSCALE;
-			PicoIn.filter = currentConfig.filter;
-		} else if (currentConfig.scaling == EOPT_SCALE_HW)
-			// hw scaling, render without any padding
-			PicoIn.opt |= POPT_DIS_32C_BORDER;
-	} else
-		PicoIn.opt |= POPT_DIS_32C_BORDER;
-
 	Pico.m.dirtyPal = 1;
 }
 
@@ -395,7 +394,7 @@ void emu_video_mode_change(int start_line, int line_count, int start_col, int co
 			PicoDrawSetCallbacks(cb_vscaling_begin,cb_vscaling_nop);
 		break;
 	case EOPT_SCALE_SW:
-		screen_y = (screen_h - 240)/2;
+		screen_y = (screen_h - 240)/2 + (out_h > 144);
 		// NTSC always has 224 visible lines, anything smaller has bars
 		if (out_h < 224 && out_h > 144)
 			screen_y += (224 - out_h)/2;