From a7ce765b1b57ec8a528263420852ed36da6d9d84 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Tue, 23 Jan 2024 10:30:54 +0100 Subject: Update profiling macros --- src/profiling.c | 253 ++++++++++++++++++++------------------------------------ 1 file changed, 90 insertions(+), 163 deletions(-) (limited to 'src/profiling.c') diff --git a/src/profiling.c b/src/profiling.c index 0255552..6b073ed 100644 --- a/src/profiling.c +++ b/src/profiling.c @@ -6,184 +6,111 @@ #define PROF_ENABLE 0 #endif -#if PROF_ENABLE > 0 && PROF_ENABLE < 3 +#if PROF_ENABLE > 0 -#ifndef PROF_N_FRAMES -#define PROF_N_FRAMES 30 +#ifndef PROF_RESET_MINMAX +#define PROF_RESET_MINMAX false #endif -// Profile method 1: Average per N frames. -#if PROF_ENABLE == 1 -#define TEXT_ENABLE 1 -#define PROF(F,VAR) \ - do { \ - u32 __tmp_prof = profile_measure();\ - F;\ - (VAR) += profile_measure() - __tmp_prof;\ - } while (0) +// Maximum number of profiling to monitor. +typedef enum ProfType { + PROF_INPUT, + PROF_UPDATE, + PROF_RENDER, + PROF_FLIP, + PROF_FILL, + PROF_NUM, +} ProfType; -// Profile method 2: Maximum in N frames. -#elif PROF_ENABLE == 2 -#define TEXT_ENABLE 1 -#define PROF(F,VAR) \ - do { \ - u32 __tmp_prof = profile_measure();\ - (F);\ - (VAR) = MAX(profile_measure() - __tmp_prof, (VAR));\ - } while (0) -#endif +char *prof_type_str[PROF_NUM] = { + "INPUT ", + "UPDATE ", + "RENDER ", + "FLIPBUF", + "SCRFILL", +}; -#ifndef PROF_SHOW_X -#define PROF_SHOW_X 0 -#endif -#ifndef PROF_SHOW_Y -#define PROF_SHOW_Y 0 -#endif +u32 prof_frame_time = 0; +u32 prof_frame_count = 0; +u32 prof_frame_avg = -1; +u32 prof_frame_time_max = 0; +u32 prof_times[PROF_NUM] = {0}; +u32 prof_count[PROF_NUM] = {0}; +u32 prof_avg[PROF_NUM] = {0}; +u32 prof_max[PROF_NUM] = {0}; +u32 prof_min[PROF_NUM] = {0}; -static bool profile_show = true; +bool prof_reset_minmax = PROF_RESET_MINMAX; +bool prof_show = true; -#define PROF_SHOW() \ - do { \ - if (key_tap(KEY_START)) {\ - profile_show ^= 1;\ - }\ - if (profile_show) {\ - txt_color(1);\ - txt_position((PROF_SHOW_X), (PROF_SHOW_Y));\ - draw_filled_rect((PROF_SHOW_X), (PROF_SHOW_X), 8 * 14, 8 * 10, 0);\ - txt_printf("VIDEO\n");\ - txt_printf(">CLEAR %.8lu\n", avg_clear_cycles);\ - txt_printf(">FLIP %.8lu\n", avg_flip_cycles);\ - txt_printf("SEQUENCER RENDER\n");\ - txt_printf(">TRIGS %.8lu\n", avg_draw_trigs_cycles);\ - txt_printf(">BTNS %.8lu\n", avg_draw_btns_cycles);\ - txt_printf(">PARAM %.8lu\n", avg_draw_param_cycles);\ - txt_printf(">PIANO %.8lu\n", avg_draw_piano_cycles);\ - txt_printf(">CURSOR %.8lu\n", avg_draw_cursor_cycles);\ - txt_printf("UPDATE %.8lu\n", avg_update_cycles);\ - txt_printf("INPUT %.8lu\n", avg_input_cycles);\ - txt_printf("RENDER %.8lu\n", avg_render_cycles);\ - txt_printf("TOTAL %.8lu\n", avg_frame_cycles);\ - txt_render();\ - }\ - u32 frame_time =\ - FP_DIV(\ - FP_NUM(avg_frame_cycles + 1, 2),\ - FP_NUM(2809, 2),\ - 2) * 166;\ - u32 fps =\ - FP_DIV(\ - FP_NUM(280896 * 60, 2),\ - FP_NUM(avg_frame_cycles + 1, 2),\ - 2);\ - draw_filled_rect(8 * 18, 0, 239, 16, 0);\ - txt_drawf("TIME: %.6lu", 8 * 18, 0, 1, frame_time >> 2);\ - txt_drawf("MAX FPS: %.4lu", 8 * 18, 8, 1, (fps >> 2) + 1);\ - } while (0) +#define PROF_INIT() do { \ + for (size_t i = 0; i < PROF_NUM; i++) { \ + prof_min[i] = -1; \ + } \ +} while(0); -static u32 prof_frame_counter = 0; +#define PROF(func, idx) do { \ + u32 time_before = profile_measure(); \ + (func); \ + u32 time_after = profile_measure(); \ + u32 time_current = time_after - time_before; \ + prof_times[idx] += time_current; \ + prof_count[idx]++; \ + prof_max[idx] = MAX(time_current, prof_max[idx]);\ + prof_min[idx] = MIN(time_current, prof_min[idx]);\ +} while(0); -static u32 frame_cycles = 0; -static u32 flip_cycles = 0; -static u32 clear_cycles = 0; -static u32 input_cycles = 0; -static u32 draw_trigs_cycles = 0; -static u32 draw_btn_cycles = 0; -static u32 draw_piano_cycles = 0; -static u32 draw_param_cycles = 0; -static u32 draw_cursor_cycles = 0; -static u32 render_cycles = 0; -static u32 update_cycles = 0; +#define FRAME_START() do { \ + profile_start();\ +} while(0) -static u32 avg_frame_cycles = 0; -static u32 avg_flip_cycles = 0; -static u32 avg_clear_cycles = 0; -static u32 avg_input_cycles = 0; -static u32 avg_draw_trigs_cycles = 0; -static u32 avg_draw_btns_cycles = 0; -static u32 avg_draw_piano_cycles = 0; -static u32 avg_draw_param_cycles = 0; -static u32 avg_draw_cursor_cycles = 0; -static u32 avg_render_cycles = 0; -static u32 avg_update_cycles = 0; +#define FRAME_END() do { \ + prof_frame_count++;\ + prof_frame_time_max = MAX(prof_frame_time_max, profile_measure());\ + prof_frame_time += profile_stop();\ + if (prof_show) { \ + draw_filled_rect(0, 0, SCREEN_WIDTH - 1, 8 * (PROF_NUM + 1), 0); \ + txt_drawf_small("FRAME TIME/FPS: %.9l/%.2l", 0, 0, COL_FG, \ + prof_frame_avg, \ + (u32)((u64)280896 * 60 / (prof_frame_avg + 1)));\ + txt_drawf_small("MAX: %.9l/%l", 8 * 19, 0, COL_FG, \ + prof_frame_time_max,280896);\ + for (size_t idx = 0; idx < PROF_NUM; idx++) { \ + txt_drawf_small("%s %.9l (%.9l %.9l) %08x:%08x", 0, 8 * (idx + 1), COL_FG, \ + prof_type_str[idx], \ + prof_avg[idx], \ + prof_min[idx], \ + prof_max[idx], \ + prof_avg[idx], \ + prof_max[idx]);\ + }; \ + } \ + if (prof_frame_count >= PROF_ENABLE) { \ + for (size_t idx = 0; idx < PROF_NUM; idx++) { \ + prof_avg[idx] = prof_times[idx] / prof_frame_count; \ + if (prof_reset_minmax) { \ + prof_min[idx] = -1; \ + prof_max[idx] = 0; \ + } \ + prof_times[idx] = 0; \ + prof_count[idx] = 0; \ + }; \ + prof_frame_avg = prof_frame_time / prof_frame_count; \ + prof_frame_count = 0; \ + prof_frame_time = 0; \ + } \ + } while(0) -#if PROF_ENABLE == 1 -#define FRAME_START()\ - do { \ - if (prof_frame_counter == PROF_N_FRAMES) {\ - avg_frame_cycles = frame_cycles / prof_frame_counter;\ - avg_flip_cycles = flip_cycles / prof_frame_counter;\ - avg_clear_cycles = clear_cycles / prof_frame_counter;\ - avg_draw_trigs_cycles = draw_trigs_cycles / prof_frame_counter;\ - avg_draw_btns_cycles = draw_btn_cycles / prof_frame_counter;\ - avg_draw_piano_cycles = draw_piano_cycles / prof_frame_counter;\ - avg_draw_param_cycles = draw_param_cycles / prof_frame_counter;\ - avg_draw_cursor_cycles = draw_cursor_cycles / prof_frame_counter;\ - avg_input_cycles = input_cycles / prof_frame_counter;\ - avg_render_cycles = render_cycles / prof_frame_counter;\ - avg_update_cycles = update_cycles / prof_frame_counter;\ - frame_cycles = 0;\ - flip_cycles = 0;\ - clear_cycles = 0;\ - input_cycles = 0;\ - render_cycles = 0;\ - update_cycles = 0;\ - draw_trigs_cycles = 0;\ - draw_param_cycles = 0;\ - draw_cursor_cycles = 0;\ - draw_btn_cycles = 0;\ - draw_piano_cycles = 0;\ - prof_frame_counter = 0;\ - }\ - profile_start();\ - } while (0) -#elif PROF_ENABLE == 2 -#define FRAME_START()\ - do { \ - if (prof_frame_counter == PROF_N_FRAMES) {\ - avg_frame_cycles = frame_cycles;\ - avg_flip_cycles = flip_cycles;\ - avg_clear_cycles = clear_cycles;\ - avg_line_cycles = line_cycles;\ - avg_rect_cycles = rect_cycles;\ - avg_fill_rect_cycles = fill_rect_cycles;\ - avg_chr_cycles = chr_cycles;\ - avg_icn_cycles = icn_cycles;\ - avg_txt_drawf_cycles = txt_drawf_cycles;\ - avg_txt_printf_cycles = txt_printf_cycles;\ - avg_txt_render_cycles = txt_render_cycles;\ - avg_txt_clear_cycles = txt_clear_cycles;\ - avg_input_cycles = input_cycles;\ - frame_cycles = 0;\ - flip_cycles = 0;\ - clear_cycles = 0;\ - line_cycles = 0;\ - rect_cycles = 0;\ - fill_rect_cycles = 0;\ - chr_cycles = 0;\ - icn_cycles = 0;\ - txt_drawf_cycles = 0;\ - txt_printf_cycles = 0;\ - txt_render_cycles = 0;\ - txt_clear_cycles = 0;\ - input_cycles = 0;\ - prof_frame_counter = 0;\ - }\ - profile_start();\ - } while (0) -#endif - -#define FRAME_END() \ - do { \ - prof_frame_counter++;\ - frame_cycles += profile_stop();\ - } while (0) +#define PROF_SHOW() do { \ + prof_show ^= 1; \ +} while(0) #else // No profiling. -#define PROF(F,VAR) (F) -#define PROF_SHOW() +#define PROF_INIT() +#define PROF(F,VAR) do {F;} while(0) #define FRAME_START() #define FRAME_END() +#define PROF_SHOW() #endif -- cgit v1.2.1