From d15d5599ab01ac1774f879d92dbec71e2654741e Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Thu, 20 Apr 2023 09:20:44 +0200 Subject: Add dirty tiles to screen fill functions --- src/ppu.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/ppu.c b/src/ppu.c index 8e1710c..1d29725 100644 --- a/src/ppu.c +++ b/src/ppu.c @@ -247,11 +247,20 @@ ppu_pixel(u32 *layer, u16 x, u16 y, u8 clr) { dirty_tiles[tile_y] |= 1 << tile_x; } +static inline +void +redraw(void) { + for (size_t i = 0; i < 21; i++) { + dirty_tiles[i] = 0xFFFFFFFF; + } +} + IWRAM_CODE void clear_screen(u32 *layer, u8 clr) { // We have to make sure we leave the last tile blank to use as alpha channel // when moving the BG during double buffering in case we are using that. dma_fill(layer, 0x11111111 * clr, KB(20) - 32, 3); + redraw(); } IWRAM_CODE @@ -267,6 +276,7 @@ draw_hline(u32 *layer, size_t x0, size_t x1, size_t y0, u8 clr) { size_t start_col = x0 % 8; size_t end_col = x1 % 8; size_t start_row = y0 % 8; + u32 dirtyflag = (1 << tile_x0) | (1 << tile_x1); // Horizontal line. There are 3 cases: // 1. Lines fit on a single tile. @@ -290,11 +300,14 @@ draw_hline(u32 *layer, size_t x0, size_t x1, size_t y0, u8 clr) { *dst = (*dst & ~(mask << shift_left)) | (row << shift_left); dst += 8; for (size_t i = 1; i < dtx; i++) { + dirtyflag |= (1 << (tile_x0 + i)); *dst = row; dst += 8; } *dst = (*dst & ~(mask >> shift_right)) | (row >> shift_right); } + + dirty_tiles[tile_y] |= dirtyflag; } IWRAM_CODE @@ -314,7 +327,6 @@ screen_fill(u32 *layer, u16 x0, u16 y0, u16 x1, u16 y1, u8 clr) { for (size_t y = y0; y <= y1; y++) { draw_hline(layer, x0, x1, y, clr); } - // TODO: dirty? } #if NEW_PPU == 0 @@ -731,13 +743,6 @@ flipbuf(Ppu *p) { } } -void -redraw(void) { - for (size_t i = 0; i < 21; i++) { - dirty_tiles[i] = 0xFFFFFFFF; - } -} - typedef struct KeyboardChar { int x; int y; -- cgit v1.2.1