trueno/src/editor/iprof.jai

133 lines
3.6 KiB
Plaintext

#if HAS_IPROF == false {
init_profiler :: () {}
draw_profiler :: () {}
profiler_update :: () {}
tick_profiler :: () {}
} else {
#scope_file
iprof_conf : __Iprof.Config;
iprof_font : Ui_Font;
Profiler_Mode :: enum {
CLOSED;
TEXT_ONLY;
FULL;
}
profiler_mode : Profiler_Mode = .CLOSED;
draw_text :: (x: float, y: float, text: string, color: Vector4) {
prepare_text(*iprof_font, text);
draw_prepared_text(*iprof_font, xx x, xx y, color);
}
draw_line :: (p0: Vector2, p1: Vector2, p2: Vector2, p3: Vector2, color: Vector4) {
immediate_quad(p0, p1, p2, p3, color);
}
text_width :: (text: string) -> float {
if text.count < 1 {
return 0;
}
fonsSetFont(state.fons, state.font_default.fons_font);
fonsSetSize(state.fons, xx iprof_font.character_height);
w := fonsTextBounds(state.fons, 0.0, 0.0, text.data, text.data + text.count, null);
return cast(float) w;
}
draw_rectangle_prof :: (x0: float, y0: float, x1: float, y1: float, color: Vector4) {
r := GR.Rect.{x0,y0,x1-x0,y1-y0};
draw_rectangle(r, color);
}
graph_begin :: (x: float, y: float, width: float, height: float) {
return;
}
graph_end :: (x: float, y: float, width: float, height: float) {
return;
}
iprof_cycle_active_report_mode :: () {
iprof_active_report_mode := __Iprof.displayed_quantity;
if iprof_active_report_mode == .SELF_TIME __Iprof.set_report_mode(.HIERARCHICAL_TIME);
else if iprof_active_report_mode == .HIERARCHICAL_TIME __Iprof.set_report_mode(.CALL_COUNT);
else if iprof_active_report_mode == .CALL_COUNT __Iprof.set_report_mode(.SELF_TIME);
else if iprof_active_report_mode == .CALL_GRAPH __Iprof.set_report_mode(.SELF_TIME);
else assert(false);
}
iprof_paused : bool = true;
#scope_export
init_profiler :: () {
iprof_font = state.font_default;
iprof_font.character_height = 20;
ui_init_font_fields(*iprof_font);
iprof_conf.font_character_height = xx (iprof_font.character_height + 2);
iprof_conf.line_spacing = 23;
iprof_conf.draw_text = draw_text;
iprof_conf.text_width = text_width;
iprof_conf.draw_rectangle = draw_rectangle_prof;
iprof_conf.draw_line = draw_line;
iprof_conf.graph_begin = graph_begin;
iprof_conf.graph_end = graph_end;
}
draw_profiler :: () {
if profiler_mode == .CLOSED then return;
w,h := get_window_size();
draw_rectangle(.{xx(w-700), 0, 700, xx(h) }, .{0,0,0,1});
__Iprof.draw(xx (w - 700), 20,699,xx h, *iprof_conf);
if profiler_mode == .FULL {
__Iprof.draw_graph(0,xx h,xx(w-700),200, *iprof_conf);
}
}
profiler_update :: () {
if profiler_mode == .CLOSED then return;
__Iprof.update(iprof_paused);
}
tick_profiler :: () {
if input_button_states[Key_Code.F2] & .START {
if profiler_mode == .CLOSED then profiler_mode = .TEXT_ONLY;
else if profiler_mode == .TEXT_ONLY then profiler_mode = .FULL;
else if profiler_mode == .FULL then profiler_mode = .CLOSED;
}
if profiler_mode == .CLOSED then return;
if input_button_states[Key_Code.ARROW_UP] & .START {
__Iprof.move_cursor(-1);
}
if input_button_states[Key_Code.ARROW_DOWN] & .START {
__Iprof.move_cursor(1);
}
if input_button_states[Key_Code.ARROW_LEFT] & .START {
__Iprof.select_parent();
}
if input_button_states[Key_Code.ARROW_RIGHT] & .START {
__Iprof.select();
}
if input_button_states[Key_Code.SPACEBAR] & .START {
iprof_cycle_active_report_mode();
}
if input_button_states[Key_Code.ENTER] & .START {
iprof_paused = !iprof_paused;
}
if input_button_states[Key_Code.MOUSE_BUTTON_RIGHT] & .START {
__Iprof.graph_select_sample();
}
__Iprof.set_cursor_screen_coordinates(xx input_mouse_x, xx input_mouse_y);
}
}