summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2023-04-22 13:19:48 +0200
committerBad Diode <bd@badd10de.dev>2023-04-22 13:19:48 +0200
commitf40e5520fbe9726b26daf04d95c567ed3afdc28b (patch)
tree6750a8688e5b5f8965513418de31619192277fb2
parent2359a27c292514c70f28d337adaee346a23c74be (diff)
downloadgba-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.c42
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