]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Small sprite optimization
authorToni Wilen <twilen@winuae.net>
Fri, 2 Feb 2024 18:49:52 +0000 (20:49 +0200)
committerToni Wilen <twilen@winuae.net>
Fri, 2 Feb 2024 18:49:52 +0000 (20:49 +0200)
drawing.cpp

index bafccb0a731edcd09fd6a2ae2cc93bcc1ab717a3..2af21ba969ec9e725410947536f77d5beecba344 100644 (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));