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 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;
|
||||
|
|
|
@ -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
1
main.h
|
@ -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);
|
||||
|
|
10
video.cc
10
video.cc
|
@ -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;
|
||||
|
|
Loading…
Add table
Reference in a new issue