diff --git a/benchmark.c b/benchmark.c index f6a21da97d..082348ec18 100644 --- a/benchmark.c +++ b/benchmark.c @@ -26,6 +26,26 @@ #include #endif +#define MAX_COUNTERS 64 +static struct rarch_perf_counter *perf_counters[MAX_COUNTERS]; +static unsigned perf_ptr; + +void rarch_perf_register(struct rarch_perf_counter *perf) +{ + if (perf_ptr >= MAX_COUNTERS) + return; + + perf_counters[perf_ptr++] = perf; + perf->registered = true; +} + +void rarch_perf_log(void) +{ + RARCH_LOG("[PERF]: Performance counters:\n"); + for (unsigned i = 0; i < perf_ptr; i++) + RARCH_PERFORMANCE_LOG(perf_counters[i]->ident, *perf_counters[i]); +} + rarch_perf_tick_t rarch_get_perf_counter(void) { rarch_perf_tick_t time = 0; diff --git a/benchmark.h b/benchmark.h index c46c60a628..31375181ce 100644 --- a/benchmark.h +++ b/benchmark.h @@ -28,23 +28,45 @@ typedef unsigned long long rarch_perf_tick_t; typedef struct rarch_perf_counter { + const char *ident; rarch_perf_tick_t start; rarch_perf_tick_t total; - unsigned call_cnt; + uint64_t call_cnt; + + bool registered; } rarch_perf_counter_t; rarch_perf_tick_t rarch_get_perf_counter(void); +void rarch_perf_register(struct rarch_perf_counter *perf); +void rarch_perf_log(void); #ifdef PERF_TEST -#define RARCH_PERFORMANCE_INIT(X) static rarch_perf_counter_t X -#define RARCH_PERFORMANCE_START(X) ((X).start = rarch_get_perf_counter()) -#define RARCH_PERFORMANCE_STOP(X) do { (X).total += rarch_get_perf_counter() - (X).start; (X).call_cnt++; } while(0) /* TODO: we should increment at PERFORMANCE_START instead of PERFORMANCE_STOP since sometimes we cannot assume that we don't prematurely exit out of the function */ +#define RARCH_PERFORMANCE_INIT(X) static rarch_perf_counter_t X = {#X}; \ + do { \ + if (!(X).registered) \ + rarch_perf_register(&(X)); \ + } while(0) + +#define RARCH_PERFORMANCE_START(X) do { \ + (X).call_cnt++; \ + (X).start = rarch_get_perf_counter(); \ +} while(0) + +#define RARCH_PERFORMANCE_STOP(X) do { \ + (X).total += rarch_get_perf_counter() - (X).start; \ +} while(0) #ifdef _WIN32 -#define RARCH_PERFORMANCE_LOG(functionname, X) RARCH_LOG("[PERF]: Avg (%s): %I64u ticks.\n", functionname, (X).total / (X).call_cnt) +#define RARCH_PERFORMANCE_LOG(functionname, X) RARCH_LOG("[PERF]: Avg (%s): %I64u ticks, %I64u runs.\n", \ + functionname, \ + (X).total / (X).call_cnt, \ + (X).call_cnt) #else -#define RARCH_PERFORMANCE_LOG(functionname, X) RARCH_LOG("[PERF]: Avg (%s): %llu ticks.\n", functionname, (X).total / (X).call_cnt) +#define RARCH_PERFORMANCE_LOG(functionname, X) RARCH_LOG("[PERF]: Avg (%s): %llu ticks, %llu runs.\n", \ + functionname, \ + (long long unsigned)((X).total / (X).call_cnt), \ + (long long unsigned)((X).call_cnt)) #endif #else diff --git a/gfx/gl.c b/gfx/gl.c index 797ec5fd40..c758166612 100644 --- a/gfx/gl.c +++ b/gfx/gl.c @@ -1107,7 +1107,6 @@ static bool gl_frame(void *data, const void *frame, unsigned width, unsigned hei RARCH_PERFORMANCE_START(copy_frame); gl_copy_frame(gl, frame, width, height, pitch); RARCH_PERFORMANCE_STOP(copy_frame); - RARCH_PERFORMANCE_LOG("gl_copy_frame", copy_frame); } struct gl_tex_info tex_info = {0}; @@ -1144,7 +1143,6 @@ static bool gl_frame(void *data, const void *frame, unsigned width, unsigned hei #endif RARCH_PERFORMANCE_STOP(frame_run); - RARCH_PERFORMANCE_LOG("gl_frame", frame_run); #ifdef RARCH_CONSOLE if (!gl->block_swap) diff --git a/gfx/scaler/scaler.c b/gfx/scaler/scaler.c index bd92a7c95b..5f2bc6d978 100644 --- a/gfx/scaler/scaler.c +++ b/gfx/scaler/scaler.c @@ -192,9 +192,6 @@ void scaler_ctx_gen_reset(struct scaler_ctx *ctx) void scaler_ctx_scale(struct scaler_ctx *ctx, void *output, const void *input) { - RARCH_PERFORMANCE_INIT(scaler_perf); - RARCH_PERFORMANCE_START(scaler_perf); - if (ctx->unscaled) // Just perform straight pixel conversion. { ctx->direct_pixconv(output, input, @@ -262,8 +259,5 @@ void scaler_ctx_scale(struct scaler_ctx *ctx, else ctx->scaler_vert(ctx, output, ctx->out_stride); } - - RARCH_PERFORMANCE_STOP(scaler_perf); - RARCH_PERFORMANCE_LOG("Scaler", scaler_perf); } diff --git a/gfx/vg.c b/gfx/vg.c index 582e314df6..792f557270 100644 --- a/gfx/vg.c +++ b/gfx/vg.c @@ -397,7 +397,6 @@ static bool vg_frame(void *data, const void *frame, unsigned width, unsigned hei RARCH_PERFORMANCE_START(vg_image); vg_copy_frame(vg, frame, width, height, pitch); RARCH_PERFORMANCE_STOP(vg_image); - RARCH_PERFORMANCE_LOG("vg_copy_frame", vg_image); vgDrawImage(vg->mImage); @@ -409,8 +408,6 @@ static bool vg_frame(void *data, const void *frame, unsigned width, unsigned hei #endif RARCH_PERFORMANCE_STOP(vg_fr); - RARCH_PERFORMANCE_LOG("vg_frame", vg_fr); - vg->driver->swap_buffers(); return true; diff --git a/retroarch.c b/retroarch.c index 428758cdad..e9a5f441b9 100644 --- a/retroarch.c +++ b/retroarch.c @@ -272,7 +272,6 @@ static void video_frame(const void *data, unsigned width, unsigned height, size_ data = driver.scaler_out; pitch = driver.scaler.out_stride; RARCH_PERFORMANCE_STOP(video_frame_conv); - RARCH_PERFORMANCE_LOG("video_frame_conv()", video_frame_conv); } // Slightly messy code, @@ -2772,6 +2771,11 @@ int rarch_main(int argc, char *argv[]) while (rarch_main_iterate()); rarch_main_deinit(); rarch_deinit_msg_queue(); + +#ifdef PERF_TEST + rarch_perf_log(); +#endif + rarch_main_clear_state(); return 0; }