diff options
author | Bad Diode <bd@badd10de.dev> | 2023-04-22 13:19:48 +0200 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2023-04-22 13:19:48 +0200 |
commit | f40e5520fbe9726b26daf04d95c567ed3afdc28b (patch) | |
tree | 6750a8688e5b5f8965513418de31619192277fb2 | |
parent | 2359a27c292514c70f28d337adaee346a23c74be (diff) | |
download | gba-link-cable-tester-f40e5520fbe9726b26daf04d95c567ed3afdc28b.tar.gz gba-link-cable-tester-f40e5520fbe9726b26daf04d95c567ed3afdc28b.zip |
Add double buffering with dirty squares flip option
-rw-r--r-- | src/renderer_m0.c | 42 |
1 files changed, 40 insertions, 2 deletions
diff --git a/src/renderer_m0.c b/src/renderer_m0.c index 745c0f9..6c509f9 100644 --- a/src/renderer_m0.c +++ b/src/renderer_m0.c | |||
@@ -14,7 +14,7 @@ | |||
14 | 14 | ||
15 | #define SUBPIXEL_LINES 1 | 15 | #define SUBPIXEL_LINES 1 |
16 | #define DEC_BIG_LUT 1 | 16 | #define DEC_BIG_LUT 1 |
17 | #define FLIP_TYPE 2 | 17 | #define FLIP_TYPE 3 |
18 | 18 | ||
19 | // Front/back buffers for double buffering. | 19 | // Front/back buffers for double buffering. |
20 | #define BUF_0 ((u32*)(MEM_VRAM)) | 20 | #define BUF_0 ((u32*)(MEM_VRAM)) |
@@ -662,7 +662,6 @@ flip_buffer(void) { | |||
662 | if (dirty_tiles[j] == 0) { | 662 | if (dirty_tiles[j] == 0) { |
663 | continue; | 663 | continue; |
664 | } | 664 | } |
665 | u32 offset = j * 32 * 8; | ||
666 | size_t k = 1; | 665 | size_t k = 1; |
667 | for (size_t i = 0; i < 30; ++i, k <<= 1) { | 666 | for (size_t i = 0; i < 30; ++i, k <<= 1) { |
668 | if (dirty_tiles[j] & k) { | 667 | if (dirty_tiles[j] & k) { |
@@ -673,6 +672,45 @@ flip_buffer(void) { | |||
673 | } | 672 | } |
674 | dirty_tiles[j] = 0; | 673 | dirty_tiles[j] = 0; |
675 | } | 674 | } |
675 | |||
676 | // Mode 3: Double buffering with dirty tiles, copying the dirty tiles if needed | ||
677 | // after flipping buffers. | ||
678 | #elif FLIP_TYPE == 3 | ||
679 | bool should_flip = false; | ||
680 | for (size_t j = 0; j < 20; ++j) { | ||
681 | if (dirty_tiles[j] == 0) { | ||
682 | continue; | ||
683 | } | ||
684 | should_flip = true; | ||
685 | break; | ||
686 | } | ||
687 | if (!should_flip) { | ||
688 | return; | ||
689 | } | ||
690 | u32 *frontbuf = backbuf; | ||
691 | if (backbuf == BUF_0) { | ||
692 | backbuf = BUF_1; | ||
693 | BG_H_SCROLL_0 = 0; | ||
694 | BG_H_SCROLL_1 = -240; | ||
695 | } else { | ||
696 | backbuf = BUF_0; | ||
697 | BG_H_SCROLL_0 = -240; | ||
698 | BG_H_SCROLL_1 = 0; | ||
699 | } | ||
700 | for (size_t j = 0; j < 20; ++j) { | ||
701 | if (dirty_tiles[j] == 0) { | ||
702 | continue; | ||
703 | } | ||
704 | size_t k = 1; | ||
705 | for (size_t i = 0; i < 30; ++i, k <<= 1) { | ||
706 | if (dirty_tiles[j] & k) { | ||
707 | Tile *mem_front = frontbuf; | ||
708 | Tile *mem_back = backbuf; | ||
709 | mem_back[i + j * 32] = mem_front[i + j * 32]; | ||
710 | } | ||
711 | } | ||
712 | dirty_tiles[j] = 0; | ||
713 | } | ||
676 | #endif | 714 | #endif |
677 | } | 715 | } |
678 | 716 | ||