From 30d0a8aedbb4a31cdd4f6d284eaa3310d874dc07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franti=C5=A1ek=20Jahoda?= Date: Sun, 17 Dec 2017 00:00:50 +0100 Subject: [PATCH 1/3] Speedup api_circle. --- src/machine.h | 1 + src/tic.c | 46 +++++++++++++++++++++++++++++++++++----------- 2 files changed, 36 insertions(+), 11 deletions(-) diff --git a/src/machine.h b/src/machine.h index b96f1c2..f04f489 100644 --- a/src/machine.h +++ b/src/machine.h @@ -92,6 +92,7 @@ typedef struct void (*setpix)(tic_mem* memory, s32 x, s32 y, u8 color); u8 (*getpix)(tic_mem* memory, s32 x, s32 y); + void (*drawhline)(tic_mem* memory, s32 xl, s32 xr, s32 y, u8 color); bool synced; bool initialized; diff --git a/src/tic.c b/src/tic.c index 10f8e45..512da47 100644 --- a/src/tic.c +++ b/src/tic.c @@ -40,7 +40,8 @@ #define BASE_NOTE_POS 49 #define ENVELOPE_FREQ_SCALE 2 #define NOTES_PER_MUNUTE (TIC_FRAMERATE / NOTES_PER_BEET * 60) -#define min(a,b) (a < b ? a : b) +#define min(a,b) ((a) < (b) ? (a) : (b)) +#define max(a,b) ((a) > (b) ? (a) : (b)) typedef enum { @@ -212,15 +213,30 @@ static u8 getPixel(tic_machine* machine, s32 x, s32 y) return machine->state.getpix(&machine->memory, x, y); } +static void drawHLineDma(tic_mem* memory, s32 xl, s32 xr, s32 y, u8 color) +{ + for(s32 x = xl; x < xr; ++x) { + tic_tool_poke4(&memory->ram.vram.screen.data, y * TIC80_WIDTH + x, color); + } +} + +static void drawHLineOvr(tic_mem* tic, s32 x1, s32 x2, s32 y, u8 color) +{ + tic_machine* machine = (tic_machine*)tic; + u32 final_color = *(machine->state.ovr.palette + color); + for(s32 x = x1; x < x2; ++x) { + *getOvrAddr(tic, x, y) = final_color; + } +} + + static void drawHLine(tic_machine* machine, s32 x, s32 y, s32 width, u8 color) { - if(y < 0 || y >= TIC80_HEIGHT) return; - - s32 xl = x < 0 ? 0 : x; - s32 xr = x + width >= TIC80_WIDTH ? TIC80_WIDTH : x + width; - - for(s32 i = xl; i < xr; ++i) - setPixel(machine, i, y, color); + if(y < machine->state.clip.t || machine->state.clip.b <= y) return; + u8 final_color = mapColor(&machine->memory, color); + s32 xl = max(x, machine->state.clip.l); + s32 xr = min(x + width, machine->state.clip.r); + machine->state.drawhline(&machine->memory, xl, xr, y, final_color); } static void drawVLine(tic_machine* machine, s32 x, s32 y, s32 height, u8 color) @@ -499,6 +515,7 @@ static void api_reset(tic_mem* memory) machine->state.setpix = setPixelDma; machine->state.getpix = getPixelDma; + machine->state.drawhline = drawHLineDma; updateSaveid(memory); } @@ -839,9 +856,14 @@ static void api_circle(tic_mem* memory, s32 xm, s32 ym, u32 radius, u8 color) if (r > x || err > y) err += ++x*2+1; } while (x < 0); - for(s32 y = 0; y < TIC80_HEIGHT; y++) - for(s32 x = SidesBuffer.Left[y]; x <= SidesBuffer.Right[y]; ++x) - setPixel(machine, x, y, color); + s32 yt = max(machine->state.clip.t, ym-r); + s32 yb = min(machine->state.clip.b, ym+r+1); + u8 final_color = mapColor(&machine->memory, color); + for(s32 y = yt; y < yb; y++) { + s32 xl = max(SidesBuffer.Left[y], machine->state.clip.l); + s32 xr = min(SidesBuffer.Right[y], machine->state.clip.r); + machine->state.drawhline(&machine->memory, xl, xr, y, final_color); + } } static void api_circle_border(tic_mem* memory, s32 xm, s32 ym, u32 radius, u8 color) @@ -1233,6 +1255,7 @@ static void api_tick_start(tic_mem* memory, const tic_sfx* sfxsrc, const tic_mus machine->state.setpix = setPixelDma; machine->state.getpix = getPixelDma; + machine->state.drawhline = drawHLineDma; machine->state.synced = false; } @@ -1260,6 +1283,7 @@ static void api_tick_end(tic_mem* memory) machine->state.setpix = setPixelOvr; machine->state.getpix = getPixelOvr; + machine->state.drawhline = drawHLineOvr; memcpy(machine->state.ovr.palette, tic_palette_blit(&memory->cart.palette), sizeof machine->state.ovr.palette); } From 2da54945b6ac551f64a086a5c25847d963499856 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franti=C5=A1ek=20Jahoda?= Date: Sun, 17 Dec 2017 00:54:57 +0100 Subject: [PATCH 2/3] Expand drawHLineDma loop. --- src/tic.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/tic.c b/src/tic.c index 512da47..c719632 100644 --- a/src/tic.c +++ b/src/tic.c @@ -215,8 +215,17 @@ static u8 getPixel(tic_machine* machine, s32 x, s32 y) static void drawHLineDma(tic_mem* memory, s32 xl, s32 xr, s32 y, u8 color) { - for(s32 x = xl; x < xr; ++x) { - tic_tool_poke4(&memory->ram.vram.screen.data, y * TIC80_WIDTH + x, color); + color = color << 4 | color; + if (xl >= xr) return; + if (xl & 1) { + tic_tool_poke4(&memory->ram.vram.screen.data, y * TIC80_WIDTH + xl, color); + xl++; + } + for(s32 x = xl; x + 1 < xr; x+=2) { + memory->ram.vram.screen.data[(y * TIC80_WIDTH + x) >> 1] = color; + } + if (xr & 1) { + tic_tool_poke4(&memory->ram.vram.screen.data, y * TIC80_WIDTH + xr - 1, color); } } From aa1cc5ae2b0321b51437e4e59252c7ca8425ff04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franti=C5=A1ek=20Jahoda?= Date: Sun, 17 Dec 2017 12:31:25 +0100 Subject: [PATCH 3/3] Simplify loop. --- src/tic.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/tic.c b/src/tic.c index c719632..692f762 100644 --- a/src/tic.c +++ b/src/tic.c @@ -221,9 +221,9 @@ static void drawHLineDma(tic_mem* memory, s32 xl, s32 xr, s32 y, u8 color) tic_tool_poke4(&memory->ram.vram.screen.data, y * TIC80_WIDTH + xl, color); xl++; } - for(s32 x = xl; x + 1 < xr; x+=2) { - memory->ram.vram.screen.data[(y * TIC80_WIDTH + x) >> 1] = color; - } + s32 count = (xr - xl) >> 1; + u8 *screen = memory->ram.vram.screen.data + ((y * TIC80_WIDTH + xl) >> 1); + for(s32 i = 0; i < count; i++) *screen++ = color; if (xr & 1) { tic_tool_poke4(&memory->ram.vram.screen.data, y * TIC80_WIDTH + xr - 1, color); }