From 396b10dd5e206462ebeab5fed368ba3ae25c6a51 Mon Sep 17 00:00:00 2001 From: Peter Fors Date: Sat, 25 Oct 2025 21:56:37 +0200 Subject: Better benchmarking, some small optimizations --- mknes.c | 34 ++++++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 8 deletions(-) (limited to 'mknes.c') diff --git a/mknes.c b/mknes.c index a6d224d..f8850b0 100644 --- a/mknes.c +++ b/mknes.c @@ -37,8 +37,8 @@ #define CIRAM_SIZE 0x1000 #define CHR_RAM_SIZE 0x4000 -uint32_t buffer[BUFFER_WIDTH * BUFFER_HEIGHT] __attribute__((section(".bss"), aligned(4096))); -uint32_t display_buffer[BUFFER_WIDTH * BUFFER_HEIGHT] __attribute__((section(".bss"), aligned(4096))); +static uint32_t buffer[BUFFER_WIDTH * BUFFER_HEIGHT] __attribute__((section(".bss"), aligned(4096))); +static uint32_t display_buffer[BUFFER_WIDTH * BUFFER_HEIGHT] __attribute__((section(".bss"), aligned(4096))); static void audio_callback(int16_t *data, size_t frames) { } @@ -54,6 +54,14 @@ static void audio_callback(int16_t *data, size_t frames) { } // #include "audio.c" #include "incbin.h" +#ifdef BENCHMARK +// Embed the ROM for benchmarking to eliminate file I/O overhead +// Uncomment the ROM you want to benchmark: +INCBIN_BYTES(benchmark_rom, "data/Life Force (USA).nes"); +// INCBIN_BYTES(benchmark_rom, "data/0000/Super Mario Bros. (World) (HVC-SM).nes"); +// INCBIN_BYTES(benchmark_rom, "data/0003/Gradius (USA).zip"); +#endif + #include "platform_gl_loader.c" @@ -152,7 +160,7 @@ struct main_state state __attribute__((aligned(64))); #include "mkfw.h" #include "platform_opengl.c" - +static size_t sprite_counts[8]; static uint32_t frames; // debug information // static int32_t tas_frame_count; @@ -235,12 +243,17 @@ int main(int argc, char **argv) { memset(nstate, 0, sizeof(struct nes_state)); ppu_reset(nstate); +#ifdef BENCHMARK + // Use embedded ROM for consistent benchmarking without file I/O overhead + ines2_load_from_memory(nstate, benchmark_rom, INCBIN_SIZE(benchmark_rom)); + +#else // ines2_load(nstate, "data/0000/10-Yard Fight (USA, Europe).nes"); // ines2_load(nstate, "data/0000/Balloon Fight (USA).nes"); // ines2_load(nstate, "data/0000/Excitebike (Japan, USA).nes"); // ines2_load(nstate, "data/0000/Ice Climber (USA, Europe, Korea).nes"); // ines2_load(nstate, "data/0000/Kung Fu (Japan, USA).nes"); - ines2_load(nstate, "data/0000/Super Mario Bros. (World) (HVC-SM).nes"); + // ines2_load(nstate, "data/0000/Super Mario Bros. (World) (HVC-SM).nes"); // ines2_load(nstate, "data/Super Mario Bros. (W) (V1.0) [!].nes"); // ines2_load(nstate, "data/Super Mario Bros. (JU) [!].nes"); // ines2_load(nstate, "data/0000/Urban Champion (World).nes"); @@ -253,7 +266,7 @@ int main(int argc, char **argv) { // ines2_load(nstate, "data/0000/raster_demos/RasterTest3.NES"); // ines2_load(nstate, "data/0000/raster_demos/RasterTest3a.NES"); // ines2_load(nstate, "data/0000/raster_demos/RasterTest3b.NES"); - ines2_load(nstate, "data/0000/raster_demos/RasterTest3c.NES"); + // ines2_load(nstate, "data/0000/raster_demos/RasterTest3c.NES"); // ines2_load(nstate, "data/0000/raster_demos/RasterTest3d.NES"); // ines2_load(nstate, "data/0000/raster_demos/RasterTest3e.NES"); // ines2_load(nstate, "data/0000/NEStress.NES"); @@ -262,7 +275,7 @@ int main(int argc, char **argv) { // ines2_load(nstate, "data/0000/Xevious - The Avenger (USA).zip"); // ines2_load(nstate, "data/tv.nes"); - // ines2_load(nstate, "data/Life Force (USA).zip"); // 2002 + ines2_load(nstate, "data/Life Force (USA).nes"); // 2002 // ines2_load(nstate, "data/0003/Flipull - An Exciting Cube Game (Japan) (En).zip"); // ines2_load(nstate, "data/0003/Friday the 13th (USA).zip"); @@ -286,12 +299,13 @@ int main(int argc, char **argv) { // ines2_load(nstate, "data/Blaster Master (USA).zip"); // mapper 1 // ines2_load(nstate, "AccuracyCoin.nes"); // mapper 1 +#endif mapper_setup(nstate); cpu_reset(nstate); -#if 0 - for(uint32_t i = 0; i < 0x5000; ++i) { +#ifdef BENCHMARK + for(uint32_t i = 0; i < 0x1000; ++i) { while(!nstate->ppu.frame_ready) { // PROFILE_NAMED("nes emulator"); cpu_tick(nstate); @@ -300,10 +314,14 @@ int main(int argc, char **argv) { frames++; } + // for(size_t i = 0; i < 9; ++i) { + // printf("count %d: %lld\n", i, sprite_counts[i]); + // } // for(size_t i = 0; i < 256; ++i) { // printf("instr %2.2x: %lld\n", i, instr_count[i]); // } + return 0; #else -- cgit v1.2.3