diff options
author | Bad Diode <bd@badd10de.dev> | 2023-04-16 17:26:41 +0200 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2023-04-16 17:26:41 +0200 |
commit | fa6f892eab58e172827abeaefa75d981085dc06b (patch) | |
tree | 04de94d2d241edab8f78da7eafd07c0fdef88e93 | |
parent | af479588c285d6690d7bed6e0eb266751beb9f6c (diff) | |
download | gba-renderers-fa6f892eab58e172827abeaefa75d981085dc06b.tar.gz gba-renderers-fa6f892eab58e172827abeaefa75d981085dc06b.zip |
Fix performance of vline
-rw-r--r-- | src/renderer_m0.c | 21 |
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 | |||
129 | draw_vline(size_t x0, size_t y0, size_t y1, u8 clr) { | 129 | draw_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 | ||