summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2023-04-16 17:26:41 +0200
committerBad Diode <bd@badd10de.dev>2023-04-16 17:26:41 +0200
commitfa6f892eab58e172827abeaefa75d981085dc06b (patch)
tree04de94d2d241edab8f78da7eafd07c0fdef88e93
parentaf479588c285d6690d7bed6e0eb266751beb9f6c (diff)
downloadgba-renderers-fa6f892eab58e172827abeaefa75d981085dc06b.tar.gz
gba-renderers-fa6f892eab58e172827abeaefa75d981085dc06b.zip
Fix performance of vline
-rw-r--r--src/renderer_m0.c21
1 files changed, 17 insertions, 4 deletions
diff --git a/src/renderer_m0.c b/src/renderer_m0.c
index c0416ea..8f23376 100644
--- a/src/renderer_m0.c
+++ b/src/renderer_m0.c
@@ -129,10 +129,23 @@ void
129draw_vline(size_t x0, size_t y0, size_t y1, u8 clr) { 129draw_vline(size_t x0, size_t y0, size_t y1, u8 clr) {
130 BOUNDCHECK_SCREEN(x0, y0); 130 BOUNDCHECK_SCREEN(x0, y0);
131 BOUNDCHECK_SCREEN(x0, y1); 131 BOUNDCHECK_SCREEN(x0, y1);
132 132 size_t tile_x = x0 / 8;
133 // TODO: perf 133 size_t tile_y = y0 / 8;
134 for (size_t y = y0; y <= y1; y++) { 134 size_t start_row = y0 % 8;
135 draw_pixel(x0, y, clr); 135 size_t start_col = x0 % 8;
136 size_t shift_left = start_col * 4;
137 u32 *dst = &backbuf[tile_x * 8 + tile_y * 8 * 32 + start_row];
138 u32 cur_row = start_row;
139 u32 mask = 0x0000000F;
140 for (size_t i = 0; i <= y1 - y0; i++) {
141 *dst = (*dst & ~(mask << shift_left)) | (clr << shift_left);
142 if (cur_row == 7) {
143 dst += 8 * 31 + 1;
144 cur_row = 0;
145 } else {
146 cur_row++;
147 dst++;
148 }
136 } 149 }
137} 150}
138 151