diff options
Diffstat (limited to 'src/ppu.c')
-rw-r--r-- | src/ppu.c | 21 |
1 files changed, 13 insertions, 8 deletions
@@ -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 | ||
250 | static inline | ||
251 | void | ||
252 | redraw(void) { | ||
253 | for (size_t i = 0; i < 21; i++) { | ||
254 | dirty_tiles[i] = 0xFFFFFFFF; | ||
255 | } | ||
256 | } | ||
257 | |||
250 | IWRAM_CODE | 258 | IWRAM_CODE |
251 | void clear_screen(u32 *layer, u8 clr) { | 259 | void 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 | ||
257 | IWRAM_CODE | 266 | IWRAM_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 | ||
300 | IWRAM_CODE | 313 | IWRAM_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 | ||
734 | void | ||
735 | redraw(void) { | ||
736 | for (size_t i = 0; i < 21; i++) { | ||
737 | dirty_tiles[i] = 0xFFFFFFFF; | ||
738 | } | ||
739 | } | ||
740 | |||
741 | typedef struct KeyboardChar { | 746 | typedef struct KeyboardChar { |
742 | int x; | 747 | int x; |
743 | int y; | 748 | int y; |