diff options
Diffstat (limited to 'src/ppu.c')
-rw-r--r-- | src/ppu.c | 54 |
1 files changed, 28 insertions, 26 deletions
@@ -16,6 +16,7 @@ WITH REGARD TO THIS SOFTWARE. | |||
16 | */ | 16 | */ |
17 | 17 | ||
18 | #define NEW_PPU 1 | 18 | #define NEW_PPU 1 |
19 | #define FLIPBUF_DMA 1 | ||
19 | 20 | ||
20 | #define FG_FRONT ((u32*)(MEM_VRAM)) | 21 | #define FG_FRONT ((u32*)(MEM_VRAM)) |
21 | #define BG_FRONT ((u32*)(MEM_VRAM + KB(20))) | 22 | #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) { | |||
722 | IWRAM_CODE | 723 | IWRAM_CODE |
723 | void | 724 | void |
724 | flipbuf() { | 725 | flipbuf() { |
725 | // Copy the fg and bg layers fully with the DMA. | 726 | u32 *fg_back = FG_BACK; |
726 | dma_copy((u32*)FG_FRONT, (u32*)FG_BACK, KB(40), 3); | 727 | u32 *bg_back = BG_BACK; |
727 | // dma_sync_copy((u32*)FG_FRONT, (u32*)FG_BACK, KB(40)); | 728 | u32 *bg_front = BG_FRONT; |
728 | // | 729 | u32 *fg_front = FG_FRONT; |
729 | // TODO: dma the dirty lines instead of per tile copying. | 730 | for (size_t j = 0; j < 20; ++j) { |
730 | // dma_copy((u32*)BG_FRONT, (u32*)BG_BACK, KB(20), 3); | 731 | if (dirty_tiles[j] == 0) { |
731 | // dma_sync_copy((u32*)FG_FRONT, (u32*)FG_BACK, KB(20)); | 732 | continue; |
732 | // dma_sync_copy((u32*)BG_FRONT, (u32*)BG_BACK, KB(20)); | 733 | } |
733 | // Tile *mem_fg = FG_FRONT; | 734 | #if FLIPBUF_DMA == 1 |
734 | // Tile *mem_bg = BG_FRONT; | 735 | u32 offset = j * 32 * 8; |
735 | // for (size_t j = 0; j < 20; ++j) { | 736 | dma_copy(fg_front + offset, fg_back + offset, 32 * 8 * 4, 3); |
736 | // if (dirty_tiles[j] == 0) { | 737 | dma_copy(bg_front + offset, bg_back + offset, 32 * 8 * 4, 3); |
737 | // continue; | 738 | #else |
738 | // } | 739 | size_t k = 1; |
739 | 740 | for (size_t i = 0; i < 30; ++i, k <<= 1) { | |
740 | // // size_t k = 1; | 741 | if (dirty_tiles[j] & k) { |
741 | // // for (size_t i = 0; i < 30; ++i, k <<= 1) { | 742 | Tile *mem_fg = FG_FRONT; |
742 | // // if (dirty_tiles[j] & k) { | 743 | Tile *mem_bg = BG_FRONT; |
743 | // // Tile *tile_fg = FG_BACK; | 744 | Tile *tile_fg = FG_BACK; |
744 | // // Tile *tile_bg = BG_BACK; | 745 | Tile *tile_bg = BG_BACK; |
745 | // // mem_fg[i + j * 32] = tile_fg[i + j * 32]; | 746 | mem_fg[i + j * 32] = tile_fg[i + j * 32]; |
746 | // // mem_bg[i + j * 32] = tile_bg[i + j * 32]; | 747 | mem_bg[i + j * 32] = tile_bg[i + j * 32]; |
747 | // // } | 748 | } |
748 | // // } | 749 | } |
749 | // dirty_tiles[j] = 0; | 750 | #endif |
750 | // } | 751 | dirty_tiles[j] = 0; |
752 | } | ||
751 | } | 753 | } |
752 | 754 | ||
753 | typedef struct KeyboardChar { | 755 | typedef struct KeyboardChar { |