continue work on ctrl entity visualization in watch views & further progress on new scheduler

This commit is contained in:
Ryan Fleury
2024-10-01 09:36:29 -07:00
parent 152cc709ce
commit 04815b4265
5 changed files with 116 additions and 85 deletions
+2 -1
View File
@@ -143,7 +143,8 @@ struct_members(CTRL_ProcessMetaEval)
struct_members(CTRL_ModuleMetaEval)
{
member_lit_comp(CTRL_MetaEval, type(U32), color, .pretty_name = str8_lit_comp("Color")),
member_lit_comp(CTRL_MetaEval, type(CTRL_CodeString8), label, .pretty_name = str8_lit_comp("Executable")),
member_lit_comp(CTRL_MetaEval, type(CTRL_CodeString8), label, .pretty_name = str8_lit_comp("Name")),
member_lit_comp(CTRL_MetaEval, type(CTRL_PlainString8),exe, .pretty_name = str8_lit_comp("Executable Path")),
member_lit_comp(CTRL_MetaEval, type(CTRL_PlainString8),dbg, .pretty_name = str8_lit_comp("Debug Info Path")),
member_lit_comp(CTRL_MetaEval, type(Rng1U64), vaddr_range, .pretty_name = str8_lit_comp("Address Range")),
};
+23 -4
View File
@@ -1857,7 +1857,7 @@ rd_name_from_ctrl_entity(Arena *arena, CTRL_Entity *entity)
}
internal DR_FancyStringList
rd_title_fstrs_from_ctrl_entity(Arena *arena, CTRL_Entity *entity, Vec4F32 secondary_color, F32 size)
rd_title_fstrs_from_ctrl_entity(Arena *arena, CTRL_Entity *entity, Vec4F32 secondary_color, F32 size, B32 include_extras)
{
DR_FancyStringList result = {0};
RD_IconKind icon_kind = RD_IconKind_Null;
@@ -1874,9 +1874,24 @@ rd_title_fstrs_from_ctrl_entity(Arena *arena, CTRL_Entity *entity, Vec4F32 secon
dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Icons), size, secondary_color, rd_icon_kind_text_table[icon_kind]);
}
dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, secondary_color, str8_lit(" "));
if(entity->kind == CTRL_EntityKind_Thread)
{
CTRL_EntityList processes = ctrl_entity_list_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Process);
if(processes.count > 1)
{
CTRL_Entity *process = ctrl_entity_ancestor_from_kind(entity, CTRL_EntityKind_Process);
String8 process_name = rd_name_from_ctrl_entity(arena, process);
Vec4F32 process_color = rd_rgba_from_ctrl_entity(process);
if(process_name.size != 0)
{
dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, process_color, process_name);
dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, secondary_color, str8_lit(" / "));
}
}
}
String8 name = rd_name_from_ctrl_entity(arena, entity);
dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, color, name);
if(entity->kind == CTRL_EntityKind_Thread)
if(entity->kind == CTRL_EntityKind_Thread && include_extras)
{
F32 ext_size = size*0.95f;
dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, secondary_color, str8_lit(" "));
@@ -3274,7 +3289,7 @@ rd_window_frame(RD_Window *ws)
String8 arch_str = string_from_arch(arch);
DR_FancyStringList fstrs = rd_title_fstrs_from_ctrl_entity(scratch.arena, thread,
rd_rgba_from_theme_color(RD_ThemeColor_TextWeak),
ui_top_font_size());
ui_top_font_size(), 0);
// TODO(rjf): @msgs show stop info (just icon or shortened description)
@@ -3826,7 +3841,7 @@ rd_window_frame(RD_Window *ws)
UI_TextAlignment(UI_TextAlign_Center)
UI_TextPadding(ui_top_font_size()*1.5f)
{
DR_FancyStringList fstrs = rd_title_fstrs_from_ctrl_entity(scratch.arena, ctrl_entity, ui_top_palette()->text_weak, ui_top_font_size());
DR_FancyStringList fstrs = rd_title_fstrs_from_ctrl_entity(scratch.arena, ctrl_entity, ui_top_palette()->text_weak, ui_top_font_size(), 0);
UI_Box *title_box = ui_build_box_from_key(UI_BoxFlag_DrawText, ui_key_zero());
ui_box_equip_display_fancy_strings(title_box, &fstrs);
if(ctrl_entity->kind == CTRL_EntityKind_Thread)
@@ -13493,6 +13508,7 @@ rd_frame(void)
}
// rjf: retry on stopped, pending debug info
// TODO(rjf): CANNOT RETRY IN THIS WAY, NEED TO DEFER TO NEXT FRAME
if(!d_ctrl_targets_running() && (dbgi_pending || missing_rip))
{
rd_cmd(RD_CmdKind_FindThread, .thread = thread->handle);
@@ -14476,6 +14492,9 @@ rd_frame(void)
if(rd_regs()->unwind_count < rich_unwind.frames.concrete_frame_count)
{
D_UnwindFrame *frame = &rich_unwind.frames.v[rd_regs()->unwind_count];
U64 rip_vaddr = regs_rip_from_arch_block(thread->arch, frame->regs);
CTRL_Entity *module = ctrl_module_from_process_vaddr(process, rip_vaddr);
rd_state->base_regs.v.module = module->handle;
rd_state->base_regs.v.unwind_count = rd_regs()->unwind_count;
rd_state->base_regs.v.inline_depth = 0;
if(rd_regs()->inline_depth <= frame->inline_frame_count)
+1 -1
View File
@@ -1176,7 +1176,7 @@ internal DR_FancyStringList rd_title_fstrs_from_entity(Arena *arena, RD_Entity *
internal Vec4F32 rd_rgba_from_ctrl_entity(CTRL_Entity *entity);
internal String8 rd_name_from_ctrl_entity(Arena *arena, CTRL_Entity *entity);
internal DR_FancyStringList rd_title_fstrs_from_ctrl_entity(Arena *arena, CTRL_Entity *entity, Vec4F32 secondary_color, F32 size);
internal DR_FancyStringList rd_title_fstrs_from_ctrl_entity(Arena *arena, CTRL_Entity *entity, Vec4F32 secondary_color, F32 size, B32 include_extras);
////////////////////////////////
//~ rjf: Evaluation Spaces
+89 -79
View File
@@ -1089,6 +1089,10 @@ rd_string_from_eval_viz_row_column(Arena *arena, EV_View *ev, EV_Row *row, RD_Wa
result = str8_lit("???");
}
}
else
{
result = str8_lit("???");
}
di_scope_close(di_scope);
scratch_end(scratch);
}break;
@@ -1209,9 +1213,10 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo
}
RD_WatchViewRowCtrl row_ctrls_[] =
{
{RD_EntityKind_Target, RD_CmdKind_LaunchAndRun },
{RD_EntityKind_Target, RD_CmdKind_LaunchAndInit },
{RD_EntityKind_Target, RD_CmdKind_SelectEntity },
{RD_EntityKind_Target, CTRL_EntityKind_Null, RD_CmdKind_LaunchAndRun },
{RD_EntityKind_Target, CTRL_EntityKind_Null, RD_CmdKind_LaunchAndInit },
{RD_EntityKind_Target, CTRL_EntityKind_Null, RD_CmdKind_SelectEntity },
{RD_EntityKind_Nil, CTRL_EntityKind_Thread, RD_CmdKind_FreezeThread },
};
RD_WatchViewRowCtrl *row_ctrls = row_ctrls_;
U64 row_ctrls_count = ArrayCount(row_ctrls_);
@@ -1375,7 +1380,16 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo
RD_WatchViewRowKind row_kind = rd_watch_view_row_kind_from_flags_row_info(flags, mark_rows.first, &row_info);
if(row_kind == RD_WatchViewRowKind_PrettyEntityControls)
{
cursor_x_range = r1s64(1, 1+row_ctrls_count);
U64 row_ctrl_count = 0;
for EachIndex(idx, row_ctrls_count)
{
if(row_ctrls[idx].entity_kind == row_info.collection_entity->kind &&
row_ctrls[idx].ctrl_entity_kind == row_info.collection_ctrl_entity->kind)
{
row_ctrl_count += 1;
}
}
cursor_x_range = r1s64(1, 1+row_ctrl_count);
}
}
cursor_tbl_range = r2s64(v2s64(cursor_x_range.min, 0), v2s64(cursor_x_range.max, block_tree.total_item_count-1));
@@ -1540,7 +1554,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo
}
}break;
case RD_WatchViewRowKind_PrettyEntityControls:
if(!rd_entity_is_nil(row_info.collection_entity) && selection_tbl.min.x == 1 && selection_tbl.max.x == 1)
if((!rd_entity_is_nil(row_info.collection_entity) || row_info.collection_ctrl_entity != &ctrl_entity_nil) && selection_tbl.min.x == 1 && selection_tbl.max.x == 1)
{
kind = OpKind_DoExpand;
}break;
@@ -2157,6 +2171,23 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo
B32 row_selected = (selection_tbl.min.y <= global_row_idx && global_row_idx <= selection_tbl.max.y);
B32 row_expanded = ev_expansion_from_key(eval_view, row->key);
E_Eval row_eval = e_eval_from_expr(scratch.arena, row->expr);
CTRL_Entity *row_ctrl_entity = rd_ctrl_entity_from_eval_space(row_eval.space);
CTRL_Entity *row_module = ctrl_entity_from_handle(d_state->ctrl_entity_store, rd_regs()->module);
switch(row_ctrl_entity->kind)
{
default:
case CTRL_EntityKind_Process:
if(row_eval.mode == E_Mode_Offset)
{
row_module = ctrl_module_from_process_vaddr(row_ctrl_entity, row_eval.value.u64);
}break;
case CTRL_EntityKind_Thread:
if(row_eval.mode == E_Mode_Value)
{
CTRL_Entity *process = ctrl_process_from_entity(row_ctrl_entity);
row_module = ctrl_module_from_process_vaddr(process, row_eval.value.u64);
}break;
}
E_Type *row_type = e_type_from_key(scratch.arena, row_eval.type_key);
B32 row_is_expandable = ev_row_is_expandable(row);
B32 row_is_editable = ev_row_is_editable(row);
@@ -2243,7 +2274,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo
//////////////////////
//- rjf: build row contents
//
UI_Parent(row_box) switch(row_kind)
RD_RegsScope(.module = row_module->handle) UI_Parent(row_box) switch(row_kind)
{
////////////////////
//- rjf: header row
@@ -2434,6 +2465,10 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo
{
palette = rd_palette_from_code(RD_PaletteCode_NeutralPopButton);
}
if(ctrl_entity->kind == RD_EntityKind_Thread && ctrl_handle_match(ctrl_entity->handle, rd_regs()->thread))
{
palette = rd_palette_from_code(RD_PaletteCode_NeutralPopButton);
}
//- rjf: build add-new buttons
if(rd_entity_is_nil(entity) && collection_entity_kind == RD_EntityKind_Target)
@@ -2447,8 +2482,20 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo
}
//- rjf: build entity box
if(!rd_entity_is_nil(entity))
if(!rd_entity_is_nil(entity) || ctrl_entity != &ctrl_entity_nil)
{
//- rjf: unpack entity info
DR_FancyStringList fstrs = {0};
if(!rd_entity_is_nil(entity))
{
fstrs = rd_title_fstrs_from_entity(scratch.arena, entity, ui_top_palette()->text_weak, ui_top_font_size());
}
else if(ctrl_entity != &ctrl_entity_nil)
{
fstrs = rd_title_fstrs_from_ctrl_entity(scratch.arena, ctrl_entity, ui_top_palette()->text_weak, ui_top_font_size(), 1);
}
//- rjf: build
ui_set_next_hover_cursor(OS_Cursor_HandPoint);
UI_Box *entity_box = &ui_nil_box;
UI_FocusHot(entity_box_selected ? UI_FocusKind_On : UI_FocusKind_Off) UI_Palette(palette)
@@ -2458,7 +2505,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo
UI_BoxFlag_DrawBackground|
UI_BoxFlag_DrawHotEffects|
UI_BoxFlag_DrawActiveEffects,
"###entity_%p", entity);
"###entity_%p_%p", entity, ctrl_entity);
}
{
UI_Parent(entity_box)
@@ -2467,7 +2514,6 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo
{
next_row_expanded = !row_expanded;
}
DR_FancyStringList fstrs = rd_title_fstrs_from_entity(scratch.arena, entity, ui_top_palette()->text_weak, ui_top_font_size());
UI_Box *title_box = ui_build_box_from_key(UI_BoxFlag_DrawText, ui_key_zero());
ui_box_equip_display_fancy_strings(title_box, &fstrs);
UI_Signal sig = ui_signal_from_box(entity_box);
@@ -2490,27 +2536,43 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo
for EachIndex(idx, row_ctrls_count)
{
RD_WatchViewRowCtrl *ctrl = &row_ctrls[idx];
if(ctrl->entity_kind == entity->kind)
if(ctrl->entity_kind == entity->kind &&
ctrl->ctrl_entity_kind == ctrl_entity->kind)
{
UI_FocusHot(row_selected && selection_tbl.min.x <= ctrl_idx+1 && ctrl_idx+1 <= selection_tbl.max.x ? UI_FocusKind_On : UI_FocusKind_Off)
{
B32 is_frozen = ctrl_entity_tree_is_frozen(ctrl_entity);
RD_IconKind icon_kind = rd_cmd_kind_info_table[ctrl->kind].icon_kind;
UI_Palette *palette = ui_top_palette();
if(ctrl->kind == RD_CmdKind_SelectEntity)
{
icon_kind = entity->disabled ? RD_IconKind_CheckHollow : RD_IconKind_CheckFilled;
}
UI_Signal sig = rd_icon_buttonf(icon_kind, 0, "###row_ctrl_%I64x", idx);
if(ui_clicked(sig))
if(ctrl->kind == RD_CmdKind_FreezeThread)
{
if(ctrl->kind == RD_CmdKind_SelectEntity)
icon_kind = is_frozen ? RD_IconKind_Locked : RD_IconKind_Unlocked;
palette = rd_palette_from_code(is_frozen ? RD_PaletteCode_NegativePopButton : RD_PaletteCode_PositivePopButton);
}
UI_Palette(palette)
{
UI_Signal sig = rd_icon_buttonf(icon_kind, 0, "###row_ctrl_%I64x", idx);
if(ui_clicked(sig))
{
rd_cmd(sig.event_flags & OS_Modifier_Ctrl && entity->disabled ? RD_CmdKind_EnableEntity :
sig.event_flags & OS_Modifier_Ctrl && !entity->disabled ? RD_CmdKind_DisableEntity :
RD_CmdKind_SelectEntity, .entity = rd_handle_from_entity(entity));
}
else
{
rd_cmd(ctrl->kind, .entity = rd_handle_from_entity(entity));
if(ctrl->kind == RD_CmdKind_SelectEntity)
{
rd_cmd(sig.event_flags & OS_Modifier_Ctrl && entity->disabled ? RD_CmdKind_EnableEntity :
sig.event_flags & OS_Modifier_Ctrl && !entity->disabled ? RD_CmdKind_DisableEntity :
RD_CmdKind_SelectEntity, .entity = rd_handle_from_entity(entity));
}
else if(ctrl->kind == RD_CmdKind_FreezeThread)
{
rd_cmd(is_frozen ? RD_CmdKind_ThawThread : RD_CmdKind_FreezeThread,
.ctrl_entity = ctrl_entity->handle);
}
else
{
rd_cmd(ctrl->kind, .entity = rd_handle_from_entity(entity));
}
}
}
}
@@ -2519,45 +2581,6 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo
}
}
}
//- rjf: build ctrl entity box
if(ctrl_entity != &ctrl_entity_nil)
{
ui_set_next_hover_cursor(OS_Cursor_HandPoint);
UI_Box *entity_box = &ui_nil_box;
UI_FocusHot(entity_box_selected ? UI_FocusKind_On : UI_FocusKind_Off) UI_Palette(palette)
{
entity_box = ui_build_box_from_stringf(UI_BoxFlag_Clickable|
UI_BoxFlag_DrawBorder|
UI_BoxFlag_DrawBackground|
UI_BoxFlag_DrawHotEffects|
UI_BoxFlag_DrawActiveEffects,
"###entity_%p", ctrl_entity);
}
{
UI_Parent(entity_box)
{
// rjf: build expander, title
UI_PrefWidth(ui_em(2.f, 1.f)) if(ui_pressed(ui_expander(row_expanded, str8_lit("###expanded"))))
{
next_row_expanded = !row_expanded;
}
DR_FancyStringList fstrs = rd_title_fstrs_from_ctrl_entity(scratch.arena, ctrl_entity, ui_top_palette()->text_weak, ui_top_font_size());
UI_Box *title_box = ui_build_box_from_key(UI_BoxFlag_DrawText, ui_key_zero());
ui_box_equip_display_fancy_strings(title_box, &fstrs);
UI_Signal sig = ui_signal_from_box(entity_box);
if(ui_clicked(sig))
{
if(entity->kind == RD_EntityKind_Target)
{
rd_cmd(sig.event_flags & OS_Modifier_Ctrl && entity->disabled ? RD_CmdKind_EnableEntity :
sig.event_flags & OS_Modifier_Ctrl && !entity->disabled ? RD_CmdKind_DisableEntity :
RD_CmdKind_SelectEntity, .entity = rd_handle_from_entity(entity));
}
}
}
}
}
}break;
////////////////////
@@ -6170,22 +6193,6 @@ RD_VIEW_RULE_UI_FUNCTION_DEF(disasm)
default: break;
case RD_CmdKind_GoToAddress:
{
RD_Entity *process = &d_nil_entity;
{
RD_Entity *entity = rd_entity_from_handle(cmd->regs->entity);
if(!rd_entity_is_nil(entity) &&
(entity->kind == RD_EntityKind_Process ||
entity->kind == RD_EntityKind_Thread ||
entity->kind == RD_EntityKind_Module))
{
process = entity;
if(entity->kind == RD_EntityKind_Thread ||
entity->kind == RD_EntityKind_Module)
{
process = rd_entity_ancestor_from_kind(process, RD_EntityKind_Process);
}
}
}
dv->goto_vaddr = cmd->regs->vaddr;
}break;
case RD_CmdKind_ToggleCodeBytesVisibility: {dv->style_flags ^= DASM_StyleFlag_CodeBytes;}break;
@@ -6204,13 +6211,16 @@ RD_VIEW_RULE_UI_FUNCTION_DEF(disasm)
//////////////////////////////
//- rjf: do goto vaddr
//
if(!is_loading && has_disasm && dv->goto_vaddr != 0)
if(!is_loading && has_disasm && dv->goto_vaddr != 0 && contains_1u64(range, dv->goto_vaddr))
{
U64 vaddr = dv->goto_vaddr;
dv->goto_vaddr = 0;
U64 line_idx = dasm_line_array_idx_from_code_off__linear_scan(&dasm_info.lines, vaddr-range.min);
S64 line_num = (S64)(line_idx+1);
cv->goto_line_num = line_num;
if(line_idx < dasm_info.lines.count)
{
S64 line_num = (S64)(line_idx+1);
dv->goto_vaddr = 0;
cv->goto_line_num = line_num;
}
}
//////////////////////////////
+1
View File
@@ -97,6 +97,7 @@ typedef struct RD_WatchViewRowCtrl RD_WatchViewRowCtrl;
struct RD_WatchViewRowCtrl
{
RD_EntityKind entity_kind;
CTRL_EntityKind ctrl_entity_kind;
RD_CmdKind kind;
};