aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2023-04-20 09:20:44 +0200
committerBad Diode <bd@badd10de.dev>2023-04-20 09:20:44 +0200
commitd15d5599ab01ac1774f879d92dbec71e2654741e (patch)
treefd65d5c646125817eddf10ca7ba1e4b68af0e818
parent402a74bf60e6e00e625364628e2d1ffe28d225ca (diff)
downloaduxngba-d15d5599ab01ac1774f879d92dbec71e2654741e.tar.gz
uxngba-d15d5599ab01ac1774f879d92dbec71e2654741e.zip
Add dirty tiles to screen fill functions
-rw-r--r--src/ppu.c21
1 files 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) {
247 dirty_tiles[tile_y] |= 1 << tile_x; 247 dirty_tiles[tile_y] |= 1 << tile_x;
248} 248}
249 249
250static inline
251void
252redraw(void) {
253 for (size_t i = 0; i < 21; i++) {
254 dirty_tiles[i] = 0xFFFFFFFF;
255 }
256}
257
250IWRAM_CODE 258IWRAM_CODE
251void clear_screen(u32 *layer, u8 clr) { 259void clear_screen(u32 *layer, u8 clr) {
252 // We have to make sure we leave the last tile blank to use as alpha channel 260 // We have to make sure we leave the last tile blank to use as alpha channel
253 // when moving the BG during double buffering in case we are using that. 261 // when moving the BG during double buffering in case we are using that.
254 dma_fill(layer, 0x11111111 * clr, KB(20) - 32, 3); 262 dma_fill(layer, 0x11111111 * clr, KB(20) - 32, 3);
263 redraw();
255} 264}
256 265
257IWRAM_CODE 266IWRAM_CODE
@@ -267,6 +276,7 @@ draw_hline(u32 *layer, size_t x0, size_t x1, size_t y0, u8 clr) {
267 size_t start_col = x0 % 8; 276 size_t start_col = x0 % 8;
268 size_t end_col = x1 % 8; 277 size_t end_col = x1 % 8;
269 size_t start_row = y0 % 8; 278 size_t start_row = y0 % 8;
279 u32 dirtyflag = (1 << tile_x0) | (1 << tile_x1);
270 280
271 // Horizontal line. There are 3 cases: 281 // Horizontal line. There are 3 cases:
272 // 1. Lines fit on a single tile. 282 // 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) {
290 *dst = (*dst & ~(mask << shift_left)) | (row << shift_left); 300 *dst = (*dst & ~(mask << shift_left)) | (row << shift_left);
291 dst += 8; 301 dst += 8;
292 for (size_t i = 1; i < dtx; i++) { 302 for (size_t i = 1; i < dtx; i++) {
303 dirtyflag |= (1 << (tile_x0 + i));
293 *dst = row; 304 *dst = row;
294 dst += 8; 305 dst += 8;
295 } 306 }
296 *dst = (*dst & ~(mask >> shift_right)) | (row >> shift_right); 307 *dst = (*dst & ~(mask >> shift_right)) | (row >> shift_right);
297 } 308 }
309
310 dirty_tiles[tile_y] |= dirtyflag;
298} 311}
299 312
300IWRAM_CODE 313IWRAM_CODE
@@ -314,7 +327,6 @@ screen_fill(u32 *layer, u16 x0, u16 y0, u16 x1, u16 y1, u8 clr) {
314 for (size_t y = y0; y <= y1; y++) { 327 for (size_t y = y0; y <= y1; y++) {
315 draw_hline(layer, x0, x1, y, clr); 328 draw_hline(layer, x0, x1, y, clr);
316 } 329 }
317 // TODO: dirty?
318} 330}
319 331
320#if NEW_PPU == 0 332#if NEW_PPU == 0
@@ -731,13 +743,6 @@ flipbuf(Ppu *p) {
731 } 743 }
732} 744}
733 745
734void
735redraw(void) {
736 for (size_t i = 0; i < 21; i++) {
737 dirty_tiles[i] = 0xFFFFFFFF;
738 }
739}
740
741typedef struct KeyboardChar { 746typedef struct KeyboardChar {
742 int x; 747 int x;
743 int y; 748 int y;