aboutsummaryrefslogtreecommitdiffstats
path: root/src/uxn/devices/ppu.c
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2021-05-20 23:02:34 +0200
committerBad Diode <bd@badd10de.dev>2021-05-20 23:02:34 +0200
commit431b35d85fa590d199acadbeaf638711eb10c6af (patch)
tree89ab90bbe2081ed7181ec6c4493bd8f377efa7ca /src/uxn/devices/ppu.c
parentd255b720641edecfde93fbbe7dcbd452b71db0f4 (diff)
downloaduxngba-431b35d85fa590d199acadbeaf638711eb10c6af.tar.gz
uxngba-431b35d85fa590d199acadbeaf638711eb10c6af.zip
Apply asie's patch 4 for performance modifications
This patch removes the need for a backbuffer on EWRAM and instead store them on the VRAM.
Diffstat (limited to 'src/uxn/devices/ppu.c')
-rw-r--r--src/uxn/devices/ppu.c32
1 files changed, 21 insertions, 11 deletions
diff --git a/src/uxn/devices/ppu.c b/src/uxn/devices/ppu.c
index 97b5e4f..61e4d26 100644
--- a/src/uxn/devices/ppu.c
+++ b/src/uxn/devices/ppu.c
@@ -142,10 +142,6 @@ static Uint32 unpack_icon_lut_flipx[256] = {
142 0x11111111 142 0x11111111
143}; 143};
144 144
145EWRAM_BSS
146static u32 *backbuffer_bg0[32 * 20 * sizeof(Tile) / 4];
147EWRAM_BSS
148static u32 *backbuffer_bg1[32 * 20 * sizeof(Tile) / 4];
149static u32 dirty_tiles[20] = {0}; 145static u32 dirty_tiles[20] = {0};
150 146
151void 147void
@@ -194,13 +190,13 @@ puticn(Ppu *p, Uint32 *layer, Uint16 x, Uint16 y, Uint8 *sprite, Uint8 color, Ui
194 190
195 if (flipy) flipy = 7; 191 if (flipy) flipy = 7;
196 192
197 if (x >= 240 || y >= 160) return; 193 if (x >= SCREEN_WIDTH || y >= SCREEN_HEIGHT) return;
198 194
199 if (color != 0x05 && color != 0x0a && color != 0x0f) { 195 if (color != 0x05 && color != 0x0a && color != 0x0f) {
200 u64 mask = ~((u64)0xFFFFFFFF << shift); 196 u64 mask = ~((u64)0xFFFFFFFF << shift);
201 197
202 for (v = 0; v < 8; v++, layerptr++) { 198 for (v = 0; v < 8; v++, layerptr++) {
203 if ((y + v) >= 160) break; 199 if ((y + v) >= SCREEN_HEIGHT) break;
204 200
205 sprline = sprite[v ^ flipy]; 201 sprline = sprite[v ^ flipy];
206 u64 data = (u64)(lut_expand[sprline] * (color & 3)) << shift; 202 u64 data = (u64)(lut_expand[sprline] * (color & 3)) << shift;
@@ -213,7 +209,7 @@ puticn(Ppu *p, Uint32 *layer, Uint16 x, Uint16 y, Uint8 *sprite, Uint8 color, Ui
213 } 209 }
214 } else { 210 } else {
215 for (v = 0; v < 8; v++, layerptr++) { 211 for (v = 0; v < 8; v++, layerptr++) {
216 if ((y + v) >= 160) break; 212 if ((y + v) >= SCREEN_HEIGHT) break;
217 213
218 sprline = sprite[v ^ flipy]; 214 sprline = sprite[v ^ flipy];
219 u64 mask = ~((u64)(lut_expand[sprline] * 0xF) << shift); 215 u64 mask = ~((u64)(lut_expand[sprline] * 0xF) << shift);
@@ -246,13 +242,13 @@ putchr(Ppu *p, Uint32 *layer, Uint16 x, Uint16 y, Uint8 *sprite, Uint8 color,
246 242
247 if (flipy) flipy = 7; 243 if (flipy) flipy = 7;
248 244
249 if (x >= 240 || y >= 160) return; 245 if (x >= SCREEN_WIDTH || y >= SCREEN_HEIGHT) return;
250 246
251 u64 mask = ~((u64)0xFFFFFFFF << shift); 247 u64 mask = ~((u64)0xFFFFFFFF << shift);
252 u32 colconst = (color >> 2) * 0x11111111; 248 u32 colconst = (color >> 2) * 0x11111111;
253 249
254 for (v = 0; v < 8; v++, layerptr++) { 250 for (v = 0; v < 8; v++, layerptr++) {
255 if ((y + v) >= 160) break; 251 if ((y + v) >= SCREEN_HEIGHT) break;
256 252
257 sprline1 = sprite[v ^ flipy]; 253 sprline1 = sprite[v ^ flipy];
258 sprline2 = sprite[(v ^ flipy) | 8]; 254 sprline2 = sprite[(v ^ flipy) | 8];
@@ -315,13 +311,27 @@ initppu(Ppu *p, Uint8 hor, Uint8 ver, Uint8 pad) {
315 BG_CTRL(1) = BG_CHARBLOCK(cb_bg) | BG_SCREENBLOCK(sb_idx) | BG_PRIORITY(2); 311 BG_CTRL(1) = BG_CHARBLOCK(cb_bg) | BG_SCREENBLOCK(sb_idx) | BG_PRIORITY(2);
316 312
317 // Clear tile memory. 313 // Clear tile memory.
318 p->fg = backbuffer_bg0;
319 p->bg = backbuffer_bg1;
320 for (size_t i = 0; i < 32 * 20 * 8; ++i) { 314 for (size_t i = 0; i < 32 * 20 * 8; ++i) {
321 p->fg[i] = 0; 315 p->fg[i] = 0;
322 p->bg[i] = 0; 316 p->bg[i] = 0;
323 } 317 }
324 318
319 // Use DMA to clear VRAM.
320 u32 fill = 0;
321 u32 tile_clear_ctrl = (32 * 20 * 8) | DMA_DST_INC | DMA_SRC_FIXED | DMA_NOW | DMA_CHUNK_32 | DMA_ENABLE;
322 DMA_SRC(3) = &fill;
323 DMA_DST(3) = p->fg;
324 DMA_CTRL(3) = tile_clear_ctrl;
325 DMA_DST(3) = p->bg;
326 DMA_CTRL(3) = tile_clear_ctrl;
327
328 p->fg = (u32*) (MEM_VRAM + (56 * 1024));
329 p->bg = (u32*) (MEM_VRAM + (76 * 1024));
330 DMA_DST(3) = p->fg;
331 DMA_CTRL(3) = tile_clear_ctrl;
332 DMA_DST(3) = p->bg;
333 DMA_CTRL(3) = tile_clear_ctrl;
334
325 // Initialize default palette. 335 // Initialize default palette.
326 PAL_BUFFER_BG[0] = COLOR_BLACK; 336 PAL_BUFFER_BG[0] = COLOR_BLACK;
327 PAL_BUFFER_BG[1] = COLOR_WHITE; 337 PAL_BUFFER_BG[1] = COLOR_WHITE;