#if defined(DEBUG) || defined(PROFILER) #include "profiler.h" #include "../render/gl_2d_font.h" #include "../game/vars.h" #include "string.h" CVAR* prof_overlay = var_new( "prof_overlay", 0 ); PROFILER_GLOBAL gprof; void __profiler_intern_draw_tree( PROFILER_LIST_ENTRY* e, GL_FONT* font, I32* x, I32* y ) { GL_DATA* gl = gl_instance(); static GL_SHADER_PROGRAM** gl2d = gl->programs.where( fn( GL_SHADER_PROGRAM** p ) { return STR( (*p)->name ) == "2d" ; } ); if( !gl2d ) return; STR line; if( e->parent ) { U64 parent_dur = e->parent->duration; U64 percent = (F64)parent_dur / e->duration * 100.f; line = STR( "%s -> duration: %.2fms [%.0f%%]", e->name, (F32)e->duration / TICK_RESOLUTION * 1000.f, percent ); } else { line = STR( "%s -> duration: %.2fms", e->name, (F32)e->duration / TICK_RESOLUTION * 1000.f ); } gl_font_draw( font, *gl2d, VEC2{ (F32)*x + 1, (F32)*y + 1 }, line, CLR::BLACK() ); gl_font_draw( font, *gl2d, VEC2{ (F32)*x, (F32)*y }, line, CLR::WHITE() ); *y += font->size + 1; *x += 20; for( auto& it : e->children ) __profiler_intern_draw_tree( &it, font, x, y ); *x -= 20; } void __profiler_intern_draw_overlay( struct GL_FONT* f ) { if( !var_geti( prof_overlay ) ) return; I32 x = 50, y = 50; for( auto& it : gprof.frames ) __profiler_intern_draw_tree( &it, f, &x, &y ); } #endif