#ifndef PROF_ENABLE #define PROF_ENABLE 0 #endif #if PROF_ENABLE > 0 && PROF_ENABLE < 3 #ifndef PROF_N_FRAMES #define PROF_N_FRAMES 15 #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) // 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 #ifndef PROF_SHOW_X #define PROF_SHOW_X 0 #endif #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 %.8lu\n", avg_input_cycles);\ txt_printf("EVAL %.8lu\n", avg_eval_cycles);\ txt_printf("VIDEO\n");\ txt_printf(">PIX %.8lu\n", avg_ppu_pixel_cycles);\ txt_printf(">FILL %.8lu\n", avg_ppu_fill_cycles);\ txt_printf(">1BPP %.8lu\n", avg_ppu_icn_cycles);\ txt_printf(">2BPP %.8lu\n", avg_ppu_chr_cycles);\ txt_printf(">FLIP %.8lu\n", avg_flip_cycles);\ txt_printf("AUDIO %.8lu\n", avg_mix_cycles);\ txt_printf("TOTAL %.8lu\n", avg_frame_cycles);\ 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);\ txt_printf("TIME %.8lu\n", frame_time >> 2);\ txt_printf("FPS %.8lu\n", (fps >> 2) + 1);\ screen_fill(BG_BACK, 0, 0, 8 * 16, 8 * 12, 2);\ } while (0) static u32 prof_frame_counter = 0; static u32 frame_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; static u32 avg_ppu_pixel_cycles = 0; static u32 avg_ppu_fill_cycles = 0; static u32 avg_ppu_chr_cycles = 0; static u32 avg_ppu_icn_cycles = 0; static u32 avg_flip_cycles = 0; static u32 avg_eval_cycles = 0; static u32 avg_input_cycles = 0; static u32 avg_mix_cycles = 0; static u32 avg_frame_cycles = 0; #if PROF_ENABLE == 1 #define FRAME_START()\ do { \ if (prof_frame_counter == PROF_N_FRAMES) {\ avg_ppu_pixel_cycles = ppu_pixel_cycles / prof_frame_counter;\ avg_ppu_fill_cycles = ppu_fill_cycles / prof_frame_counter;\ avg_ppu_chr_cycles = ppu_chr_cycles / prof_frame_counter;\ avg_ppu_icn_cycles = ppu_icn_cycles / prof_frame_counter;\ avg_flip_cycles = flip_cycles / prof_frame_counter;\ avg_eval_cycles = eval_cycles / prof_frame_counter;\ avg_input_cycles = input_cycles / prof_frame_counter;\ avg_mix_cycles = mix_cycles / prof_frame_counter;\ avg_frame_cycles = frame_cycles / prof_frame_counter;\ prof_frame_counter = 0;\ frame_cycles = 0;\ ppu_pixel_cycles = 0;\ ppu_fill_cycles = 0;\ ppu_chr_cycles = 0;\ ppu_icn_cycles = 0;\ flip_cycles = 0;\ eval_cycles = 0;\ input_cycles = 0;\ mix_cycles = 0;\ }\ profile_start();\ } while (0) #elif PROF_ENABLE == 2 #define FRAME_START()\ do { \ if (prof_frame_counter == PROF_N_FRAMES) {\ avg_ppu_pixel_cycles = ppu_pixel_cycles;\ avg_ppu_fill_cycles = ppu_fill_cycles;\ avg_ppu_chr_cycles = ppu_chr_cycles;\ avg_ppu_icn_cycles = ppu_icn_cycles;\ avg_flip_cycles = flip_cycles;\ avg_eval_cycles = eval_cycles;\ avg_input_cycles = input_cycles;\ avg_mix_cycles = mix_cycles;\ avg_frame_cycles = frame_cycles / prof_frame_counter;\ prof_frame_counter = 0;\ frame_cycles = 0;\ ppu_pixel_cycles = 0;\ ppu_fill_cycles = 0;\ ppu_chr_cycles = 0;\ ppu_icn_cycles = 0;\ flip_cycles = 0;\ eval_cycles = 0;\ input_cycles = 0;\ mix_cycles = 0;\ }\ profile_start();\ } while (0) #endif #define FRAME_END() \ do { \ prof_frame_counter++;\ frame_cycles += profile_stop();\ } while (0) #else // No profiling. #define PROF(F,VAR) (F) #define PROF_SHOW() #define FRAME_START() #define FRAME_END() #endif