Small sprite optimization

This commit is contained in:
Toni Wilen 2024-02-02 20:49:52 +02:00
parent fb15de32c0
commit 88c17d9f0a

View File

@ -172,6 +172,7 @@ struct spritepixelsbuf {
static struct spritepixelsbuf spritepixels_buffer[MAX_PIXELS_PER_LINE];
static struct spritepixelsbuf *spritepixels;
static int sprite_first_x, sprite_last_x;
static bool sprite_visibility;
#ifdef AGA
/* AGA mode color lookup tables */
@ -1769,10 +1770,7 @@ static uae_u8 render_sprites(int pos, int dualpf, uae_u8 apixel, int aga)
int *shift_lookup = dualpf ? (bpldualpfpri ? dblpf_ms2 : dblpf_ms1) : dblpf_ms;
int maskshift, plfmask;
if (exthblank || exthblank_force) {
return 0;
}
if (extborder && (ce_is_borderblank(colors_for_drawing.extra) || !ce_is_bordersprite(colors_for_drawing.extra))) {
if (!sprite_visibility) {
return 0;
}
@ -3361,6 +3359,17 @@ static void setbplmode(void)
bplmode = CMODE_NORMAL;
}
static void set_sprite_visibility(void)
{
sprite_visibility = true;
if (exthblank || exthblank_force) {
sprite_visibility = false;
}
if (extborder && (ce_is_borderblank(colors_for_drawing.extra) || !ce_is_bordersprite(colors_for_drawing.extra))) {
sprite_visibility = false;
}
}
/* We only save hardware registers during the hardware frame. Now, when
* drawing the frame, we expand the data into a slightly more useful
* form. */
@ -3528,6 +3537,7 @@ static void pfield_expand_dp_bplconx (int regno, int v, int hp, int vp)
exthblanken = false;
exthblank = 0;
}
set_sprite_visibility();
return;
case 0x208: // forced hblank
if (v) {
@ -3638,6 +3648,7 @@ static void do_color_changes(line_draw_func worker_border, line_draw_func worker
exthblank = 0;
}
ehb_enable = true;
set_sprite_visibility();
for (int i = dip_for_drawing->first_color_change; i <= dip_for_drawing->last_color_change; i++) {
int regno = curr_color_changes[i].regno;
@ -3793,6 +3804,7 @@ static void do_color_changes(line_draw_func worker_border, line_draw_func worker
extborder = false;
}
}
set_sprite_visibility();
} else if (value & COLOR_CHANGE_BLANK) {
if (value & 1) {
exthblank = exthblank_set;
@ -3811,6 +3823,7 @@ static void do_color_changes(line_draw_func worker_border, line_draw_func worker
colors_for_drawing.extra |= (value & 3) == 2 ? (1 << CE_BORDERSPRITE) : 0;
colors_for_drawing.extra |= (value & 5) == 4 ? (1 << CE_BORDERNTRANS) : 0;
colors_for_drawing.extra |= (value & 8) == 8 ? (1 << CE_EXTBLANKSET) : 0;
set_sprite_visibility();
} else if (value & COLOR_CHANGE_SHRES_DELAY) {
colors_for_drawing.extra &= ~(1 << CE_SHRES_DELAY_SHIFT);
colors_for_drawing.extra &= ~(1 << (CE_SHRES_DELAY_SHIFT + 1));