From 1d1e1123f8b76c40ba57427367f34b6f5c61de85 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Thu, 20 Apr 2023 11:14:02 +0200 Subject: Clean up old ppu struct due to being unused --- src/main.c | 76 +++++++++++++++++++-------------------------- src/ppu.c | 102 +++++++++++++++++++++++++++---------------------------------- 2 files changed, 76 insertions(+), 102 deletions(-) diff --git a/src/main.c b/src/main.c index 2f9d023..86a9376 100644 --- a/src/main.c +++ b/src/main.c @@ -28,9 +28,9 @@ // #if !defined(TEXT_MODE) || TEXT_MODE == 0 -#define TEXT_LAYER ppu.fg +#define TEXT_LAYER FG_BACK #else -#define TEXT_LAYER ppu.bg +#define TEXT_LAYER BG_BACK #endif #ifndef CONTROL_METHODS @@ -46,6 +46,12 @@ #elif PROF_ENABLE == 1 #define TEXT_ENABLE 1 #define PROF(F,VAR) (profile_start(),(F),(VAR) = MAX(profile_stop(), (VAR))) +#elif PROF_ENABLE == 2 +#define TEXT_ENABLE 1 +// TODO: allow measuring inside a PROF function using profile_measure to store +// temporary values and calcualting the difference. +// TODO: allow per frame or per 60 second averaging of cycle measurement. +// TODO: calculate fps based on frame timing. #endif #ifndef PROF_SHOW_X #define PROF_SHOW_X 0 @@ -53,45 +59,26 @@ #ifndef PROF_SHOW_Y #define PROF_SHOW_Y 0 #endif -/* -// #define PROF_SHOW() \ -// do { \ -// txt_position((PROF_SHOW_X), (PROF_SHOW_Y));\ -// txt_printf("INPUT: %lu ", input_cycles);\ -// txt_position((PROF_SHOW_X), (PROF_SHOW_Y)+1);\ -// txt_printf("EVAL: %lu ", eval_cycles);\ -// txt_position((PROF_SHOW_X), (PROF_SHOW_Y)+2);\ -// txt_printf("FLIP: %lu ", flip_cycles);\ -// txt_position((PROF_SHOW_X), (PROF_SHOW_Y)+3);\ -// txt_printf("MIX: %lu ", mix_cycles);\ -// } while (0) -// #define PROF_SHOW() \ -// do { \ -// txt_position((PROF_SHOW_X), (PROF_SHOW_Y));\ -// txt_printf("PIX: %lu ", ppu_pixel_cycles);\ -// txt_position((PROF_SHOW_X), (PROF_SHOW_Y)+1);\ -// txt_printf("1BPP: %lu ", ppu_icn_cycles);\ -// txt_position((PROF_SHOW_X), (PROF_SHOW_Y)+2);\ -// txt_printf("2BPP: %lu ", ppu_chr_cycles);\ -// txt_position((PROF_SHOW_X), (PROF_SHOW_Y)+3);\ -// txt_printf("FLIP: %lu ", flip_cycles);\ -// } while (0) -// */ #define PROF_SHOW() \ do { \ txt_position((PROF_SHOW_X), (PROF_SHOW_Y));\ - txt_printf("1BPP: %.8lu\n2BPP: %.8lu\nFILL: %.8lu", ppu_icn_cycles, ppu_chr_cycles, ppu_fill_cycles);\ + txt_printf("FLIP: %.8lu\n", flip_cycles);\ + txt_printf("EVAL: %.8lu\n", eval_cycles);\ + screen_fill(BG_BACK, 0, 0, 15 * 8, 2 * 8, 0);\ + flipbuf();\ } while (0) -static u32 ppu_pixel_cycles = 0; -static u32 ppu_fill_cycles = 0; -static u32 ppu_chr_cycles = 0; -static u32 ppu_icn_cycles = 0; + +// static u32 ppu_pixel_cycles = 0; +// static u32 ppu_fill_cycles = 0; +// static u32 ppu_chr_cycles = 0; +// static u32 ppu_icn_cycles = 0; static u32 flip_cycles = 0; static u32 eval_cycles = 0; static u32 input_cycles = 0; static u32 mix_cycles = 0; - +#define FRAME_START() ; // TODO +#define FRAME_END() ; // TODO #else #define PROF(F,VAR) (F) #define PROF_SHOW() @@ -120,7 +107,6 @@ EWRAM_BSS static u8 umem[0x10300]; static Uxn u; -static Ppu ppu; static Mouse mouse = {SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2}; @@ -155,17 +141,15 @@ screen_deo(u8 *ram, u8 *d, u8 port) { u8 color = ctrl & 0x3; u16 x0 = PEEK2(d + 0x8); u16 y0 = PEEK2(d + 0xa); - u8 *layer = (ctrl & 0x40) ? ppu.fg : ppu.bg; + u8 *layer = (ctrl & 0x40) ? FG_BACK : BG_BACK; if(ctrl & 0x80) { u16 x1 = SCREEN_WIDTH - 1; u16 y1 = SCREEN_HEIGHT - 1; if(ctrl & 0x10) x1 = x0, x0 = 0; if(ctrl & 0x20) y1 = y0, y0 = 0; - PROF(screen_fill(layer, x0, y0, x1, y1, color), ppu_fill_cycles); + screen_fill(layer, x0, y0, x1, y1, color); } else { - u16 width = SCREEN_WIDTH; - u16 height = SCREEN_HEIGHT; - PROF(ppu_pixel(layer, x0, y0, color), ppu_pixel_cycles); + ppu_pixel(layer, x0, y0, color); if(d[0x6] & 0x1) POKE2(d + 0x8, x0 + 1); /* auto x+1 */ if(d[0x6] & 0x2) POKE2(d + 0xa, y0 + 1); /* auto y+1 */ } @@ -183,16 +167,16 @@ screen_deo(u8 *ram, u8 *d, u8 port) { if(addr > 0x10000 - ((n + 1) << (3 + twobpp))) { return; } - u8 *layer = (d[0xf] & 0x40) ? ppu.fg : ppu.bg; + u8 *layer = (d[0xf] & 0x40) ? FG_BACK : BG_BACK; u8 color = d[0xf] & 0xf; u8 flipx = d[0xf] & 0x10; u8 flipy = d[0xf] & 0x20; for(size_t i = 0; i <= n; i++) { u8 *sprite = &ram[addr]; if (twobpp) { - PROF(ppu_2bpp(layer, x + dy * i, y + dx * i, sprite, color, flipx, flipy), ppu_chr_cycles); + ppu_2bpp(layer, x + dy * i, y + dx * i, sprite, color, flipx, flipy); } else { - PROF(ppu_1bpp(layer, x + dy * i, y + dx * i, sprite, color, flipx, flipy), ppu_icn_cycles); + ppu_1bpp(layer, x + dy * i, y + dx * i, sprite, color, flipx, flipy); } addr += (d[0x6] & 0x04) << (1 + twobpp); } @@ -614,7 +598,7 @@ main(void) { irs_set(IRQ_VBLANK, sound_vsync); // Initialize PPU. - initppu(&ppu, 30, 20); + video_init(); // Initialize text engine. #ifdef TEXT_ENABLE @@ -632,17 +616,19 @@ main(void) { uxn_eval(&u, PAGE_PROGRAM); u8 frame_counter = 0; while(true) { - bios_vblank_wait(); + FRAME_START(); PROF(handle_input(&u), input_cycles); PROF(uxn_eval(&u, PEEK2(&u.dev[0x20])), eval_cycles); PROF(sound_mix(), mix_cycles); - PROF_SHOW(); - PROF(flipbuf(&ppu), flip_cycles); + bios_vblank_wait(); + PROF(flipbuf(), flip_cycles); frame_counter++; if (frame_counter == 60) { seconds++; frame_counter = 0; } + PROF_SHOW(); + FRAME_END(); } return 0; diff --git a/src/ppu.c b/src/ppu.c index 1d29725..d68ab8f 100644 --- a/src/ppu.c +++ b/src/ppu.c @@ -214,21 +214,17 @@ static u32 dirty_tiles[21] = {0}; void putcolors(u8 *addr) { - int i; - for(i = 0; i < 4; ++i) { - u8 - r = (*(addr + i / 2) >> (!(i % 2) << 2)) & 0x0f, - g = (*(addr + 2 + i / 2) >> (!(i % 2) << 2)) & 0x0f, - b = (*(addr + 4 + i / 2) >> (!(i % 2) << 2)) & 0x0f; - PAL_BUFFER_BG[i] = rgb15( + for(size_t i = 0; i < 4; ++i) { + u8 r = (*(addr + 0 + i / 2) >> (!(i % 2) << 2)) & 0x0f; + u8 g = (*(addr + 2 + i / 2) >> (!(i % 2) << 2)) & 0x0f; + u8 b = (*(addr + 4 + i / 2) >> (!(i % 2) << 2)) & 0x0f; + Color color = rgb15( (r << 1) | (r >> 3), (g << 1) | (g >> 3), (b << 1) | (b >> 3)); + PAL_BUFFER_BG[i] = color; for (size_t j = 0; j < 16; ++j) { - PAL_BUFFER_SPRITES[i * 16 + j] = rgb15( - (r << 1) | (r >> 3), - (g << 1) | (g >> 3), - (b << 1) | (b >> 3)); + PAL_BUFFER_SPRITES[i * 16 + j] = color; } } } @@ -241,9 +237,10 @@ ppu_pixel(u32 *layer, u16 x, u16 y, u8 clr) { size_t tile_y = y / 8; size_t start_col = x % 8; size_t start_row = y % 8; - size_t pos = (start_row + ((tile_x + tile_y * 32) * 8)); - size_t shift = start_col * 4; - layer[pos] = (layer[pos] & (~(0xF << shift))) | (clr << shift); + size_t shift_left = start_col * 4; + u32 *dst = &layer[start_row + (tile_x + tile_y * 32) * 8]; + u32 mask = 0xF << shift_left; + *dst = (*dst & ~mask) | (clr << shift_left); dirty_tiles[tile_y] |= 1 << tile_x; } @@ -318,7 +315,9 @@ screen_fill(u32 *layer, u16 x0, u16 y0, u16 x1, u16 y1, u8 clr) { // Special condition. If the screen is to be completely filled, use the DMA // instead. - if (x0 == 0 && x1 >= (SCREEN_WIDTH - 1) && y0 == 0 && y1 >= (SCREEN_HEIGHT - 1)) { + u16 max_width = SCREEN_WIDTH - 1; + u16 max_height = SCREEN_HEIGHT - 1; + if (x0 == 0 && x1 >= max_width && y0 == 0 && y1 >= max_height) { clear_screen(layer, clr); return; } @@ -722,25 +721,33 @@ putfontchar(u32 *layer, u16 tile_x, u16 tile_y, u8 ch, u8 color) { IWRAM_CODE void -flipbuf(Ppu *p) { - 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 = p->fg; - Tile *tile_bg = p->bg; - mem_fg[i + j * 32] = tile_fg[i + j * 32]; - mem_bg[i + j * 32] = tile_bg[i + j * 32]; - } - } - dirty_tiles[j] = 0; - } +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; + // } } typedef struct KeyboardChar { @@ -781,12 +788,10 @@ update_cursor(u8 pos) { | OBJ_X_COORD(keyboard[cursor_position].x); } -int -initppu(Ppu *p, u8 hor, u8 ver) { - p->hor = hor; - p->ver = ver; - p->width = (8 * p->hor); - p->height = (8 * p->ver); +void +video_init() { + // Clear VRAM. + // dma_fill((u32*)MEM_VRAM, 0, KB(96), 3); // Initialize display mode and bg palette. DISP_CTRL = DISP_MODE_0 | DISP_BG_0 | DISP_BG_1 | DISP_OBJ; @@ -799,21 +804,6 @@ initppu(Ppu *p, u8 hor, u8 ver) { BG_CTRL(0) = BG_CHARBLOCK(cb_fg) | BG_SCREENBLOCK(sb_fg) | BG_PRIORITY(1); BG_CTRL(1) = BG_CHARBLOCK(cb_bg) | BG_SCREENBLOCK(sb_bg) | BG_PRIORITY(2); - // Clear front buffer. - p->fg = FG_FRONT; - p->bg = BG_FRONT; - - // Use DMA to clear VRAM. - u32 fill = 0; - dma_fill(p->fg, fill, KB(20), 3); - dma_fill(p->bg, fill, KB(20), 3); - - // Clear back buffer. - p->fg = FG_BACK; - p->bg = BG_BACK; - dma_fill(p->fg, fill, KB(20), 3); - dma_fill(p->bg, fill, KB(20), 3); - // Initialize default palette. PAL_BUFFER_BG[0] = COLOR_BLACK; PAL_BUFFER_BG[1] = COLOR_WHITE; @@ -856,6 +846,4 @@ initppu(Ppu *p, u8 hor, u8 ver) { OBJ_ATTR_0(127) = OBJ_SHAPE_SQUARE | OBJ_Y_COORD(keyboard[cursor_position].y) | OBJ_HIDDEN; OBJ_ATTR_1(127) = OBJ_SIZE_SMALL | OBJ_X_COORD(keyboard[cursor_position].x); OBJ_ATTR_2(127) = (SPRITE_START_IDX + 0xdb) | OBJ_PAL_BANK(3); - - return 1; } -- cgit v1.2.1