From: Toni Wilen Date: Fri, 2 Feb 2024 18:49:52 +0000 (+0200) Subject: Small sprite optimization X-Git-Tag: 5200~34 X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=88c17d9f0ad842bf40ccadaf61b670a034e26e39;p=francis%2Fwinuae.git Small sprite optimization --- diff --git a/drawing.cpp b/drawing.cpp index bafccb0a..2af21ba9 100644 --- a/drawing.cpp +++ b/drawing.cpp @@ -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));