Add sprite limit options and honor H-Blank Free too.
This commit is contained in:
parent
7321d49ca4
commit
c1586a4825
4 changed files with 32 additions and 2 deletions
|
@ -90,6 +90,7 @@ struct retro_perf_callback perf_cb;
|
||||||
int dynarec_enable;
|
int dynarec_enable;
|
||||||
int use_libretro_save_method = 0;
|
int use_libretro_save_method = 0;
|
||||||
boot_mode selected_boot_mode = boot_game;
|
boot_mode selected_boot_mode = boot_game;
|
||||||
|
int sprite_limit = 1;
|
||||||
|
|
||||||
u32 idle_loop_target_pc = 0xFFFFFFFF;
|
u32 idle_loop_target_pc = 0xFFFFFFFF;
|
||||||
u32 translation_gate_target_pc[MAX_TRANSLATION_GATES];
|
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.key = "gpsp_frameskip";
|
||||||
var.value = 0;
|
var.value = 0;
|
||||||
frameskip_type_prev = current_frameskip_type;
|
frameskip_type_prev = current_frameskip_type;
|
||||||
|
|
|
@ -76,6 +76,17 @@ struct retro_core_option_definition option_defs_us[] = {
|
||||||
},
|
},
|
||||||
"game"
|
"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",
|
"gpsp_frameskip",
|
||||||
"Frameskip",
|
"Frameskip",
|
||||||
|
|
1
main.h
1
main.h
|
@ -90,6 +90,7 @@ bool main_read_savestate(const u8 *src);
|
||||||
extern u32 num_skipped_frames;
|
extern u32 num_skipped_frames;
|
||||||
extern int dynarec_enable;
|
extern int dynarec_enable;
|
||||||
extern boot_mode selected_boot_mode;
|
extern boot_mode selected_boot_mode;
|
||||||
|
extern int sprite_limit;
|
||||||
|
|
||||||
#ifdef TRACE_REGISTERS
|
#ifdef TRACE_REGISTERS
|
||||||
void print_regs(void);
|
void print_regs(void);
|
||||||
|
|
10
video.cc
10
video.cc
|
@ -99,6 +99,7 @@ typedef struct
|
||||||
#define tile_size_8bpp 64
|
#define tile_size_8bpp 64
|
||||||
|
|
||||||
// Sprite rendering cycles
|
// Sprite rendering cycles
|
||||||
|
#define REND_CYC_MAX 32768 /* Theoretical max is 17920 */
|
||||||
#define REND_CYC_SCANLINE 1210
|
#define REND_CYC_SCANLINE 1210
|
||||||
#define REND_CYC_REDUCED 954
|
#define REND_CYC_REDUCED 954
|
||||||
|
|
||||||
|
@ -1515,6 +1516,11 @@ static void order_obj(u32 video_mode)
|
||||||
t_oam *oam_base = (t_oam*)oam_ram;
|
t_oam *oam_base = (t_oam*)oam_ram;
|
||||||
u16 rend_cycles[160];
|
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_priority_count, 0, sizeof(obj_priority_count));
|
||||||
memset(obj_alpha_count, 0, sizeof(obj_alpha_count));
|
memset(obj_alpha_count, 0, sizeof(obj_alpha_count));
|
||||||
memset(rend_cycles, 0, sizeof(rend_cycles));
|
memset(rend_cycles, 0, sizeof(rend_cycles));
|
||||||
|
@ -1577,7 +1583,7 @@ static void order_obj(u32 video_mode)
|
||||||
case OBJ_MOD_SEMITRAN:
|
case OBJ_MOD_SEMITRAN:
|
||||||
for(row = starty; row < endy; row++)
|
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];
|
u32 cur_cnt = obj_priority_count[obj_priority][row];
|
||||||
obj_priority_list[obj_priority][row][cur_cnt] = obj_num;
|
obj_priority_list[obj_priority][row][cur_cnt] = obj_num;
|
||||||
obj_priority_count[obj_priority][row] = cur_cnt + 1;
|
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.
|
// Add the object to the list.
|
||||||
for(row = starty; row < endy; row++)
|
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];
|
u32 cur_cnt = obj_priority_count[obj_priority][row];
|
||||||
obj_priority_list[obj_priority][row][cur_cnt] = obj_num;
|
obj_priority_list[obj_priority][row][cur_cnt] = obj_num;
|
||||||
obj_priority_count[obj_priority][row] = cur_cnt + 1;
|
obj_priority_count[obj_priority][row] = cur_cnt + 1;
|
||||||
|
|
Loading…
Add table
Reference in a new issue