Add sprite limit options and honor H-Blank Free too.

This commit is contained in:
David Guillen Fandos 2023-09-01 23:57:57 +02:00
parent 7321d49ca4
commit c1586a4825
4 changed files with 32 additions and 2 deletions

View File

@ -90,6 +90,7 @@ struct retro_perf_callback perf_cb;
int dynarec_enable;
int use_libretro_save_method = 0;
boot_mode selected_boot_mode = boot_game;
int sprite_limit = 1;
u32 idle_loop_target_pc = 0xFFFFFFFF;
u32 translation_gate_target_pc[MAX_TRANSLATION_GATES];
@ -800,6 +801,17 @@ static void check_variables(int started_from_load)
}
}
var.key = "gpsp_sprlim";
var.value = 0;
if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
{
if (strcmp(var.value, "disabled") == 0)
sprite_limit = 1;
else if (strcmp(var.value, "enabled") == 0)
sprite_limit = 0;
}
var.key = "gpsp_frameskip";
var.value = 0;
frameskip_type_prev = current_frameskip_type;

View File

@ -76,6 +76,17 @@ struct retro_core_option_definition option_defs_us[] = {
},
"game"
},
{
"gpsp_sprlim",
"No Sprite Limit",
"Removes the original sprite-per-scanline hardware limit. Some games might rely on the hardware limit for proper rendering (ie. hiding some sprites).",
{
{ "disabled", NULL },
{ "enabled", NULL },
{ NULL, NULL },
},
"disabled"
},
{
"gpsp_frameskip",
"Frameskip",

1
main.h
View File

@ -90,6 +90,7 @@ bool main_read_savestate(const u8 *src);
extern u32 num_skipped_frames;
extern int dynarec_enable;
extern boot_mode selected_boot_mode;
extern int sprite_limit;
#ifdef TRACE_REGISTERS
void print_regs(void);

View File

@ -99,6 +99,7 @@ typedef struct
#define tile_size_8bpp 64
// Sprite rendering cycles
#define REND_CYC_MAX 32768 /* Theoretical max is 17920 */
#define REND_CYC_SCANLINE 1210
#define REND_CYC_REDUCED 954
@ -1515,6 +1516,11 @@ static void order_obj(u32 video_mode)
t_oam *oam_base = (t_oam*)oam_ram;
u16 rend_cycles[160];
bool hblank_free = read_ioreg(REG_DISPCNT) & 0x20;
u16 max_rend_cycles = !sprite_limit ? REND_CYC_MAX :
hblank_free ? REND_CYC_REDUCED :
REND_CYC_SCANLINE;
memset(obj_priority_count, 0, sizeof(obj_priority_count));
memset(obj_alpha_count, 0, sizeof(obj_alpha_count));
memset(rend_cycles, 0, sizeof(rend_cycles));
@ -1577,7 +1583,7 @@ static void order_obj(u32 video_mode)
case OBJ_MOD_SEMITRAN:
for(row = starty; row < endy; row++)
{
if (rend_cycles[row] < REND_CYC_SCANLINE) {
if (rend_cycles[row] < max_rend_cycles) {
u32 cur_cnt = obj_priority_count[obj_priority][row];
obj_priority_list[obj_priority][row][cur_cnt] = obj_num;
obj_priority_count[obj_priority][row] = cur_cnt + 1;
@ -1594,7 +1600,7 @@ static void order_obj(u32 video_mode)
// Add the object to the list.
for(row = starty; row < endy; row++)
{
if (rend_cycles[row] < REND_CYC_SCANLINE) {
if (rend_cycles[row] < max_rend_cycles) {
u32 cur_cnt = obj_priority_count[obj_priority][row];
obj_priority_list[obj_priority][row][cur_cnt] = obj_num;
obj_priority_count[obj_priority][row] = cur_cnt + 1;