libretro, various fixes (input handling, aspect ratio)

This commit is contained in:
kub 2021-11-10 23:11:51 +01:00
parent 495fe1fdad
commit e86583124e
3 changed files with 29 additions and 66 deletions

View file

@ -94,9 +94,7 @@ static const float VOUT_PAR = 0.0;
static const float VOUT_4_3 = (4.0f / 3.0f); static const float VOUT_4_3 = (4.0f / 3.0f);
static const float VOUT_CRT = (1.29911f); static const float VOUT_CRT = (1.29911f);
static bool show_overscan = false; /* Required to allow on the fly changes to 'renderer' */
/* Required to allow on the fly changes to 'show overscan' */
static int vm_current_start_line = -1; static int vm_current_start_line = -1;
static int vm_current_line_count = -1; static int vm_current_line_count = -1;
static int vm_current_start_col = -1; static int vm_current_start_col = -1;
@ -657,17 +655,9 @@ void emu_video_mode_change(int start_line, int line_count, int start_col, int co
if (vout_16bit) if (vout_16bit)
PicoDrawSetOutBuf(vout_buf, vout_width * 2); PicoDrawSetOutBuf(vout_buf, vout_width * 2);
if (show_overscan) vout_height = line_count;
{ /* Note: We multiply by 2 here to account for pitch */
vout_height = line_count + (start_line * 2); vout_offset = vout_width * start_line * 2;
vout_offset = 0;
}
else
{
vout_height = line_count;
/* Note: We multiply by 2 here to account for pitch */
vout_offset = vout_width * start_line * 2;
}
/* Redundant sanity check... */ /* Redundant sanity check... */
vout_height = (vout_height > VOUT_MAX_HEIGHT) ? vout_height = (vout_height > VOUT_MAX_HEIGHT) ?
@ -764,7 +754,7 @@ void retro_get_system_info(struct retro_system_info *info)
void retro_get_system_av_info(struct retro_system_av_info *info) void retro_get_system_av_info(struct retro_system_av_info *info)
{ {
int common_height; float tv_height = (vout_height > 144 ? Pico.m.pal ? 240 : 224 : 144);
float common_width; float common_width;
memset(info, 0, sizeof(*info)); memset(info, 0, sizeof(*info));
@ -776,11 +766,10 @@ void retro_get_system_av_info(struct retro_system_av_info *info)
info->geometry.max_height = vout_height; info->geometry.max_height = vout_height;
common_width = vout_width; common_width = vout_width;
common_height = vout_height >= 192 && vout_height <= 224 ? 224 : vout_height;
if (vout_aspect != 0) if (vout_aspect != 0)
common_width = vout_aspect * common_height; common_width = vout_aspect * tv_height;
info->geometry.aspect_ratio = common_width / common_height; info->geometry.aspect_ratio = common_width / vout_height;
} }
/* savestates */ /* savestates */
@ -1312,6 +1301,8 @@ bool retro_load_game(const struct retro_game_info *info)
PsndRerate(0); PsndRerate(0);
PicoDrawSetOutFormat(vout_format, 0); PicoDrawSetOutFormat(vout_format, 0);
if (vout_format == PDF_8BIT)
PicoDrawSetOutBuf(Pico.est.Draw2FB, 328);
/* Setup retro memory maps */ /* Setup retro memory maps */
set_memory_maps(); set_memory_maps();
@ -1407,18 +1398,18 @@ void retro_reset(void)
} }
static const unsigned short retro_pico_map[] = { static const unsigned short retro_pico_map[] = {
1 << GBTN_B, [RETRO_DEVICE_ID_JOYPAD_B] = 1 << GBTN_B,
1 << GBTN_A, [RETRO_DEVICE_ID_JOYPAD_Y] = 1 << GBTN_A,
1 << GBTN_MODE, [RETRO_DEVICE_ID_JOYPAD_SELECT] = 1 << GBTN_MODE,
1 << GBTN_START, [RETRO_DEVICE_ID_JOYPAD_START] = 1 << GBTN_START,
1 << GBTN_UP, [RETRO_DEVICE_ID_JOYPAD_UP] = 1 << GBTN_UP,
1 << GBTN_DOWN, [RETRO_DEVICE_ID_JOYPAD_DOWN] = 1 << GBTN_DOWN,
1 << GBTN_LEFT, [RETRO_DEVICE_ID_JOYPAD_LEFT] = 1 << GBTN_LEFT,
1 << GBTN_RIGHT, [RETRO_DEVICE_ID_JOYPAD_RIGHT] = 1 << GBTN_RIGHT,
1 << GBTN_C, [RETRO_DEVICE_ID_JOYPAD_A] = 1 << GBTN_C,
1 << GBTN_Y, [RETRO_DEVICE_ID_JOYPAD_X] = 1 << GBTN_Y,
1 << GBTN_X, [RETRO_DEVICE_ID_JOYPAD_L] = 1 << GBTN_X,
1 << GBTN_Z, [RETRO_DEVICE_ID_JOYPAD_R] = 1 << GBTN_Z,
}; };
#define RETRO_PICO_MAP_LEN (sizeof(retro_pico_map) / sizeof(retro_pico_map[0])) #define RETRO_PICO_MAP_LEN (sizeof(retro_pico_map) / sizeof(retro_pico_map[0]))
@ -1451,7 +1442,6 @@ static void update_variables(bool first_run)
double new_sound_rate; double new_sound_rate;
unsigned short old_snd_filter; unsigned short old_snd_filter;
int32_t old_snd_filter_range; int32_t old_snd_filter_range;
bool old_show_overscan;
var.value = NULL; var.value = NULL;
var.key = "picodrive_input1"; var.key = "picodrive_input1";
@ -1579,15 +1569,6 @@ static void update_variables(bool first_run)
PicoIn.opt &= ~POPT_DIS_SPRITE_LIM; PicoIn.opt &= ~POPT_DIS_SPRITE_LIM;
} }
old_show_overscan = show_overscan;
var.value = NULL;
var.key = "picodrive_overscan";
show_overscan = false;
if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) {
if (strcmp(var.value, "enabled") == 0)
show_overscan = true;
}
var.value = NULL; var.value = NULL;
var.key = "picodrive_overclk68k"; var.key = "picodrive_overclk68k";
if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) { if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) {
@ -1664,6 +1645,8 @@ static void update_variables(bool first_run)
if (vout_format == PDF_NONE) if (vout_format == PDF_NONE)
PicoIn.opt |= POPT_ALT_RENDERER; PicoIn.opt |= POPT_ALT_RENDERER;
PicoDrawSetOutFormat(vout_format, 0); PicoDrawSetOutFormat(vout_format, 0);
if (vout_format == PDF_8BIT)
PicoDrawSetOutBuf(Pico.est.Draw2FB, 328);
} }
var.value = NULL; var.value = NULL;
@ -1681,7 +1664,7 @@ static void update_variables(bool first_run)
} }
/* setup video if required */ /* setup video if required */
if (show_overscan != old_show_overscan || vout_format != old_vout_format) if (vout_format != old_vout_format)
{ {
if ((vm_current_start_line != -1) && if ((vm_current_start_line != -1) &&
(vm_current_line_count != -1) && (vm_current_line_count != -1) &&
@ -1819,15 +1802,15 @@ void retro_run(void)
* with the fast renderer this is improving performance, at the expense of accuracy. * with the fast renderer this is improving performance, at the expense of accuracy.
*/ */
/* This section is mostly copied from pemu_finalize_frame in platform/linux/emu.c */ /* This section is mostly copied from pemu_finalize_frame in platform/linux/emu.c */
unsigned short *pd = (unsigned short *)vout_buf; unsigned short *pd = (unsigned short *)((char *)vout_buf + vout_offset);
/* Skip the leftmost 8 columns (it is used as an overlap area for rendering) */ /* Skip the leftmost 8 columns (it is used as an overlap area for rendering) */
unsigned char *ps = Pico.est.Draw2FB + 8; unsigned char *ps = Pico.est.Draw2FB + vm_current_start_line * 328 + 8;
unsigned short *pal = Pico.est.HighPal; unsigned short *pal = Pico.est.HighPal;
int x; int x;
if (Pico.m.dirtyPal) if (Pico.m.dirtyPal)
PicoDrawUpdateHighPal(); PicoDrawUpdateHighPal();
/* Copy up to the max height to include the overscan area, and skip the leftmost 8 columns again */ /* Copy, and skip the leftmost 8 columns again */
for (i = 0; i < VOUT_MAX_HEIGHT; i++, ps += 8) { for (i = 0; i < vout_height; i++, ps += 8) {
for (x = 0; x < vout_width; x+=4) { for (x = 0; x < vout_width; x+=4) {
*pd++ = pal[*ps++]; *pd++ = pal[*ps++];
*pd++ = pal[*ps++]; *pd++ = pal[*ps++];
@ -1842,7 +1825,7 @@ void retro_run(void)
unsigned short *pd = (unsigned short *)vout_buf; unsigned short *pd = (unsigned short *)vout_buf;
unsigned short *ps = (unsigned short *)vout_ghosting_buf; unsigned short *ps = (unsigned short *)vout_ghosting_buf;
int y; int y;
for (y = 0; y < VOUT_MAX_HEIGHT; y++) { for (y = 0; y < vout_height; y++) {
if (vout_ghosting == 1) if (vout_ghosting == 1)
v_blend(pd, ps, vout_width, p_075_round); v_blend(pd, ps, vout_width, p_075_round);
else else

View file

@ -174,17 +174,6 @@ struct retro_core_option_definition option_defs_us[] = {
}, },
"disabled" "disabled"
}, },
{
"picodrive_overscan",
"Show Overscan",
"Crop out the potentially random glitchy video output that would have been hidden by the bezel around the edge of a standard-definition television screen.",
{
{ "disabled", NULL },
{ "enabled", NULL },
{ NULL, NULL },
},
"disabled"
},
{ {
"picodrive_overclk68k", "picodrive_overclk68k",
"68K Overclock", "68K Overclock",

View file

@ -139,15 +139,6 @@ struct retro_core_option_definition option_defs_tr[] = {
}, },
"PAR" "PAR"
}, },
{
"picodrive_overscan",
"Tarama Taşmasını Göster",
"Standart tanımlı bir televizyon ekranının kenar çevresinde, çerçeve tarafından gizlenmiş olabilecek rastgele video çıkışını kesin.",
{
{ NULL, NULL },
},
"disabled"
},
{ {
"picodrive_overclk68k", "picodrive_overclk68k",
"68K Hızaşırtma", "68K Hızaşırtma",