diff --git a/src/pp/pp_vis/pp_vis_core.c b/src/pp/pp_vis/pp_vis_core.c index 53dae558..fef78855 100644 --- a/src/pp/pp_vis/pp_vis_core.c +++ b/src/pp/pp_vis/pp_vis_core.c @@ -5760,6 +5760,9 @@ void V_TickForever(WaveLaneCtx *lane) f64 len_px; i64 elapsed_ns; + + b32 is_collapsed; + u64 collapsed_count; }; Struct(VisTrack) @@ -5790,6 +5793,8 @@ void V_TickForever(WaveLaneCtx *lane) { V_ZoneRow *zone_row = &zone_track->rows[row_idx]; + + // Locate first chunk in view V_ZoneChunk *closest_start = zone_row->last_chunk; { for (i32 level = countof(closest_start->prevs) - 1; level >= 0; --level) @@ -5801,9 +5806,14 @@ void V_TickForever(WaveLaneCtx *lane) } } + + + i64 collapsed_zones_count = 0; + i64 collapsed_start_ns = 0; + i64 collapsed_end_ns = 0; + f32 zone_collapse_threshold_px = 10; if (closest_start->end_ns >= view_start_ns && closest_start->start_ns <= view_end_ns) { - f32 zone_collapse_threshold_px = 5; for (V_ZoneChunk *chunk = closest_start; chunk && chunk->start_ns <= view_end_ns; chunk = chunk->nexts[0]) { i64 visual_chunk_start_ns = MaxI64(chunk->start_ns, profiler->view_ns); @@ -5812,7 +5822,15 @@ void V_TickForever(WaveLaneCtx *lane) b32 should_collapse_chunk = visual_chunk_len_px <= zone_collapse_threshold_px; - if (!should_collapse_chunk) + // TODO: Larger chunks w/ binary search to locate start & end zones + + + // FIXME: Enable this + // if (!should_collapse_chunk) + + + + { b32 reached_end_of_view = 0; for (u64 chunk_zone_idx = 0; chunk_zone_idx < chunk->zones_count && !reached_end_of_view; ++chunk_zone_idx) @@ -5822,26 +5840,71 @@ void V_TickForever(WaveLaneCtx *lane) i64 zone_start_ns = zone->start_ns; i64 zone_end_ns = MinI64(zone->end_ns, frame->time_ns); i64 zone_elapsed_ns = zone_end_ns - zone_start_ns; - i64 visual_zone_start_ns = MaxI64(zone_start_ns, profiler->view_ns); i64 visual_zone_end_ns = MinI64(zone_end_ns, profiler->view_ns + view_range_len_ns); f64 visual_zone_start_px = visual_zone_start_ns / profiler->ns_per_px; f64 visual_zone_len_px = (visual_zone_end_ns - visual_zone_start_ns) / profiler->ns_per_px; - b32 zone_should_collapse = visual_zone_len_px <= zone_collapse_threshold_px; + String zone_name = zone->name; + u64 zone_id = zone->id; + Vec4 zone_color = zone->color; + + b32 should_collapse_zone = visual_zone_len_px <= zone_collapse_threshold_px; + // b32 should_collapse_zone = 0; if (visual_zone_start_ns > view_end_ns) { reached_end_of_view = 1; } - if (visual_zone_end_ns >= view_start_ns && visual_zone_start_ns <= view_end_ns && !zone_should_collapse) + if (should_collapse_zone) + { + if (collapsed_zones_count <= 0) + { + collapsed_start_ns = zone_start_ns; + } + collapsed_end_ns = zone_end_ns; + collapsed_zones_count += 1; + } + + // Draw collapsed zones + // FIXME: Draw final collapsed zones in chunk + if (collapsed_zones_count > 0 && (!should_collapse_zone || reached_end_of_view)) + { + i64 collapsed_zone_start_ns = collapsed_start_ns; + i64 collapsed_zone_end_ns = MinI64(collapsed_end_ns, frame->time_ns); + i64 collapsed_zone_elapsed_ns = collapsed_zone_end_ns - collapsed_zone_start_ns; + f64 collapsed_visual_zone_start_ns = MaxI64(collapsed_zone_start_ns, profiler->view_ns); + f64 collapsed_visual_zone_end_ns = MinI64(collapsed_zone_end_ns, profiler->view_ns + view_range_len_ns); + f64 collapsed_visual_zone_start_px = collapsed_visual_zone_start_ns / profiler->ns_per_px; + f64 collapsed_visual_zone_len_px = (collapsed_visual_zone_end_ns - collapsed_visual_zone_start_ns) / profiler->ns_per_px; + { + VisZone *vis_zone = PushStruct(frame->arena, VisZone); + SllQueuePush(vis_track->first_zone, vis_track->last_zone, vis_zone); + // vis_zone->name = StringF(frame->arena, "%F collapsed zones", FmtSint(collapsed_zones_count)); + vis_zone->name = Lit("Collapsed"); + vis_zone->id = MixU64s(zone->id, V_CollapsedZoneBasis); + vis_zone->color = VEC4(0.55, 0.15, 0.15, 1); + vis_zone->start_px = collapsed_visual_zone_start_px; + vis_zone->len_px = collapsed_visual_zone_len_px; + vis_zone->elapsed_ns = collapsed_zone_elapsed_ns; + vis_zone->depth = row_idx; + vis_zone->is_collapsed = 1; + vis_zone->collapsed_count = collapsed_zones_count; + vis_track->rows_count = MaxU32(vis_track->rows_count, vis_zone->depth + 1); + } + collapsed_zones_count = 0; + collapsed_start_ns = 0; + collapsed_end_ns = 0; + } + + if (!should_collapse_zone && visual_zone_end_ns >= view_start_ns && visual_zone_start_ns <= view_end_ns) { VisZone *vis_zone = PushStruct(frame->arena, VisZone); SllQueuePush(vis_track->first_zone, vis_track->last_zone, vis_zone); - vis_zone->name = zone->name; - vis_zone->id = zone->id; - vis_zone->color = zone->color; + vis_zone->name = zone_name; + vis_zone->id = zone_id; + vis_zone->color = zone_color; vis_zone->start_px = visual_zone_start_px; vis_zone->len_px = visual_zone_len_px; vis_zone->elapsed_ns = zone_elapsed_ns; @@ -6012,67 +6075,31 @@ void V_TickForever(WaveLaneCtx *lane) hovered_zone = zone; } + f64 zone_offset_px = zone->start_px - view_start_px; + f64 zone_len_px = zone->len_px; + Vec2 zone_pos = VEC2(zone_offset_px, 0); + UI_Size zone_width = UI_Px(zone_len_px, 1); Vec4 zone_color = zone->color; - // Vec4 zone_color_bd = Zi; Vec4 zone_color_bd = zone_color; - // Vec4 zone_color_dim = VEC4(0.15, 0.15, 0.15, 0); - // zone_color_bd.r -= zone_color_dim.r; - // zone_color_bd.g -= zone_color_dim.g; - // zone_color_bd.b -= zone_color_dim.b; - zone_color_bd = MulVec4(zone_color_bd, 0.65); zone_color_bd.a = 1; Vec4 zone_text_color = UI_Top(TextColor); zone_text_color.a *= 0.75; - - // zone_color_bd = LerpSrgb(zone_color_bd, theme.col.button_selected, UI_Hot(zone_box)); - // zone_color_bd = LerpSrgb(zone_color_bd, theme.col.button_active, UI_Hot(zone_box)); - zone_color_bd = LerpSrgb(zone_color_bd, Color_White, UI_Hot(zone_box)); - - - - - - - - - f64 zone_offset_px = zone->start_px - view_start_px; - f64 zone_len_px = zone->len_px; - - - - - - // f64 zone_len_ns = zone->end_ns - zone->start_ns; - // f64 zone_len_px = zone_len_ns / profiler->ns_per_px; - // f64 zone_offset_px = (zone->end_ns - profiler->view_ns) / profiler->ns_per_px; - - // // f64 zone_len_ns = zone->end_ns - zone->start_ns; - // // f64 zone_len_px = zone_len_ns / profiler->ns_per_px; - // // f32 zone_offset_px = (zone->start_ns - profiler->view_ns) / profiler->ns_per_px; - - - Vec2 zone_pos = VEC2(zone_offset_px, 0); - UI_Size zone_width = UI_Px(zone_len_px, 1); - - - - - // TODO: Remove this - UI_SetNext(Text, StringF(frame->arena, "ZONE %F", FmtUint(zone->id))); - - - // if (do_break && UI_IsMouseHovered(zone_box)) - if (do_break && zone->id == 0) + String zone_text = zone->name; + if (zone->is_collapsed) { - // UI_SetNext(DebugBreakFlags, UI_DebugBreakFlag_BuildFeedback | UI_DebugBreakFlag_CheckCursorHover); + zone_text = StringF(frame->arena, "%F", FmtUint(zone->collapsed_count)); + zone_text_color = theme.col.positive; + // zone_color = VEC4(0, 0, 0, 0); + zone_color = VEC4(1, 0, 1, 1); + zone_color_bd = VEC4(0, 0, 0, 0); } - + zone_color_bd = LerpSrgb(zone_color_bd, Color_White, UI_Hot(zone_box)); UI_SetNext(Width, zone_width); UI_SetNext(Height, UI_Grow(1, 0)); @@ -6083,28 +6110,38 @@ void V_TickForever(WaveLaneCtx *lane) UI_SetNext(ChildAlignment, UI_Region_Center); UI_SetNext(Flags, UI_BoxFlag_Floating | UI_BoxFlag_DontClampFloatingX | UI_BoxFlag_DontClampFloatingY | UI_BoxFlag_CaptureMouse | UI_BoxFlag_Scissor); UI_SetNext(Parent, zone_row_box); - // UI_SetNext(Flags, UI_BoxFlag_Floating | UI_BoxFlag_DontClampFloatingX | UI_BoxFlag_DontClampFloatingY); + UI_SetDF(OrFlags, UI_Top(OrFlags) | (UI_BoxFlag_DontTruncateText * !!(zone->is_collapsed))) UI_SetDF(Parent, UI_BuildRowEx(zone_box)) { - // UI_BuildSpacer(UI_Px(zone_text_padding_px, 0.25), Axis_X); - // UI_BuildSpacer(UI_Px(zone_text_padding_px, 0), Axis_X); - // UI_BuildSpacer(UI_Grow(1, 0), Axis_X); + // Collapsed line + if (zone->is_collapsed) + { + UI_SetNext(Flags, UI_BoxFlag_Floating); + UI_SetDF(Opacity, 0.25) + UI_SetDF(Parent, UI_BuildColumn()) + { + UI_BuildSpacer(UI_Grow(1, 0), Axis_Y); - // UI_SetNext(Width, UI_Shrink(0, 1)); - UI_SetNext(Width, UI_Shrink(0, 0)); - // UI_SetNext(Width, UI_Grow(1, 1)); - UI_SetNext(ChildAlignment, UI_Region_Center); - // UI_SetNext(ChildAlignment, UI_Region_Left); - UI_SetNext(FontSize, UI_Top(FontSize) * theme.h5); - UI_SetNext(TextColor, zone_text_color); - UI_SetNext(Text, zone->name); - // UI_SetNext(Flags, UI_BoxFlag_DrawText | UI_BoxFlag_DontTruncateText); - UI_SetNext(Flags, UI_BoxFlag_DrawText); - UI_BuildRow(); + UI_SetNext(Width, UI_Grow(1, 0)); + UI_SetNext(Height, UI_Fnt(0.1, 1)); + UI_SetNext(Anchor, UI_Region_Center); + UI_SetNext(BackgroundColor, theme.col.positive); + UI_BuildBox(); - // UI_BuildSpacer(UI_Px(zone_text_padding_px, 1), Axis_X); - // UI_BuildSpacer(UI_Px(zone_text_padding_px, 0), Axis_X); - // UI_BuildSpacer(UI_Grow(1, 0), Axis_X); + UI_BuildSpacer(UI_Grow(1, 0), Axis_Y); + } + } + + // Zone name + { + UI_SetNext(Width, UI_Shrink(0, 0)); + UI_SetNext(ChildAlignment, UI_Region_Center); + UI_SetNext(FontSize, UI_Top(FontSize) * theme.h5); + UI_SetNext(TextColor, zone_text_color); + UI_SetNext(Text, zone_text); + UI_SetNext(Flags, UI_BoxFlag_DrawText); + UI_BuildRow(); + } } } } @@ -6183,23 +6220,11 @@ void V_TickForever(WaveLaneCtx *lane) tooltip_pos = AddVec2(tooltip_pos, theme.tooltip_offset_px); f32 tooltip_opacity = 0.95; - - // UI_Key tooltip_box = UI_KeyF("tooltip"); - // Vec2 main_cursor_pos = SubVec2(frame->screen_cursor, UI_Anchor(main_box)); - // tooltip_pos = AddVec2(tooltip_pos, theme.tooltip_offset_px); - // Vec2 tooltip_pos = VEC2(main_cursor_pos.x, main_cursor_pos.y); - // Vec2 tooltip_pos = VEC2(main_cursor_pos.x, UI_Rect(hovered_zone_box).p0.y - UI_Rect(main_box).p0.y); - // f32 tooltip_opacity = 0.75; - - - UI_SetNext(Opacity, tooltip_opacity); UI_SetNext(BackgroundColor, theme.col.window_bg); UI_SetNext(BorderColor, theme.col.window_bd); UI_SetNext(Rounding, UI_Rpx(theme.rounding * 5)); UI_SetNext(BorderSize, 1); - // UI_SetNext(Width, UI_Fnt(15, 0)); - // UI_SetNext(Height, UI_Fnt(15, 0)); UI_SetNext(Anchor, UI_Region_TopLeft); UI_SetNext(FloatingPos, tooltip_pos); UI_SetNext(Flags, UI_BoxFlag_Floating); @@ -6232,11 +6257,19 @@ void V_TickForever(WaveLaneCtx *lane) // UI_BuildLabelF("%Fms", FmtFloat(MsFromNs(zone_elapsed_ns), .p = 2)); UI_SetDF(Parent, UI_BuildRow()) { - UI_SetNext(TextColor, theme.col.hint); - UI_BuildLabelF("%F: ", FmtString(zone->name)); - - UI_BuildLabelF("%F", FmtTimeNs(zone->elapsed_ns, .p = 2)); - + UI_BuildLabelF("%F ", FmtTimeNs(zone->elapsed_ns, .p = 2)); + if (zone->is_collapsed) + { + UI_SetNext(TextColor, theme.col.hint); + UI_BuildLabelF("Collapsed zones"); + UI_SetNext(TextColor, theme.col.positive); + UI_BuildLabelF(" (%F)", FmtUint(zone->collapsed_count)); + } + else + { + UI_SetNext(TextColor, theme.col.hint); + UI_BuildLabelF("%F", FmtString(zone->name)); + } } } diff --git a/src/pp/pp_vis/pp_vis_core.h b/src/pp/pp_vis/pp_vis_core.h index e8f45b4c..7288af5f 100644 --- a/src/pp/pp_vis/pp_vis_core.h +++ b/src/pp/pp_vis/pp_vis_core.h @@ -243,6 +243,7 @@ Struct(V_Palette) #define V_MaxZonesPerChunk 1024 #define V_MaxZoneDepth 128 #define V_ZoneChunkLevelsCount 32 +#define V_CollapsedZoneBasis 0x4a06f782d21f18af Struct(V_Zone) { diff --git a/src/ui/ui_core.c b/src/ui/ui_core.c index d544bb71..36bbdb63 100644 --- a/src/ui/ui_core.c +++ b/src/ui/ui_core.c @@ -1878,6 +1878,13 @@ void UI_EndFrame(UI_Frame *frame, i32 vsync) GC_Run elipses_run = UI_ScaleRun(frame->arena, elipses_run_unscaled, box->solved_scale); f32 truncation_offset = max_baseline_length - elipses_run.baseline_length; + + + // FIXME: OOB - final_rects[final_rects_count] = rr; + + + + // Append non-overflowed rects f32 elipses_offset = 0; final_rects = PushStructsNoZero(scratch.arena, GC_RunRect, raw_run.rects_count);