From 773cd197a323d2f9b701addd63e30d54e43c74f5 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Thu, 20 Apr 2023 11:37:34 +0200 Subject: Add optional DMA usage on flipbuf This will copy an entire row of tiles instead of per tile copy, but for applications that clear the screen on each frame it will be more efficient. --- src/ppu.c | 54 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 28 insertions(+), 26 deletions(-) (limited to 'src/ppu.c') diff --git a/src/ppu.c b/src/ppu.c index d68ab8f..bc6f503 100644 --- a/src/ppu.c +++ b/src/ppu.c @@ -16,6 +16,7 @@ WITH REGARD TO THIS SOFTWARE. */ #define NEW_PPU 1 +#define FLIPBUF_DMA 1 #define FG_FRONT ((u32*)(MEM_VRAM)) #define BG_FRONT ((u32*)(MEM_VRAM + KB(20))) @@ -722,32 +723,33 @@ putfontchar(u32 *layer, u16 tile_x, u16 tile_y, u8 ch, u8 color) { IWRAM_CODE void flipbuf() { - // Copy the fg and bg layers fully with the DMA. - dma_copy((u32*)FG_FRONT, (u32*)FG_BACK, KB(40), 3); - // dma_sync_copy((u32*)FG_FRONT, (u32*)FG_BACK, KB(40)); - // - // TODO: dma the dirty lines instead of per tile copying. - // dma_copy((u32*)BG_FRONT, (u32*)BG_BACK, KB(20), 3); - // dma_sync_copy((u32*)FG_FRONT, (u32*)FG_BACK, KB(20)); - // dma_sync_copy((u32*)BG_FRONT, (u32*)BG_BACK, KB(20)); - // Tile *mem_fg = FG_FRONT; - // Tile *mem_bg = BG_FRONT; - // for (size_t j = 0; j < 20; ++j) { - // if (dirty_tiles[j] == 0) { - // continue; - // } - - // // size_t k = 1; - // // for (size_t i = 0; i < 30; ++i, k <<= 1) { - // // if (dirty_tiles[j] & k) { - // // Tile *tile_fg = FG_BACK; - // // Tile *tile_bg = BG_BACK; - // // mem_fg[i + j * 32] = tile_fg[i + j * 32]; - // // mem_bg[i + j * 32] = tile_bg[i + j * 32]; - // // } - // // } - // dirty_tiles[j] = 0; - // } + u32 *fg_back = FG_BACK; + u32 *bg_back = BG_BACK; + u32 *bg_front = BG_FRONT; + u32 *fg_front = FG_FRONT; + for (size_t j = 0; j < 20; ++j) { + if (dirty_tiles[j] == 0) { + continue; + } +#if FLIPBUF_DMA == 1 + u32 offset = j * 32 * 8; + dma_copy(fg_front + offset, fg_back + offset, 32 * 8 * 4, 3); + dma_copy(bg_front + offset, bg_back + offset, 32 * 8 * 4, 3); +#else + size_t k = 1; + for (size_t i = 0; i < 30; ++i, k <<= 1) { + if (dirty_tiles[j] & k) { + Tile *mem_fg = FG_FRONT; + Tile *mem_bg = BG_FRONT; + Tile *tile_fg = FG_BACK; + Tile *tile_bg = BG_BACK; + mem_fg[i + j * 32] = tile_fg[i + j * 32]; + mem_bg[i + j * 32] = tile_bg[i + j * 32]; + } + } +#endif + dirty_tiles[j] = 0; + } } typedef struct KeyboardChar { -- cgit v1.2.1