From fff259e1131cf84a92c3f4ce3ab762d940bf8a6c Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 28 Apr 2025 14:04:02 -0700 Subject: [PATCH] cache font setting calculations per-frame rather than recomputing all the time, fix some expandability calculations in eval visualization w/ multiple composing views --- src/eval/eval_types.c | 2 +- .../eval_visualization_core.c | 100 ++++++++++++------ .../eval_visualization_core.h | 3 +- src/raddbg/raddbg_core.c | 52 ++++----- src/raddbg/raddbg_core.h | 3 + 5 files changed, 95 insertions(+), 65 deletions(-) diff --git a/src/eval/eval_types.c b/src/eval/eval_types.c index b040e20f..7d0ee27f 100644 --- a/src/eval/eval_types.c +++ b/src/eval/eval_types.c @@ -1264,7 +1264,7 @@ e_type_data_members_from_key(Arena *arena, E_TypeKey key) U64 last_member_off = 0; for(U64 member_idx = 0; member_idx < type->count; member_idx += 1) { - if(type->members[member_idx].kind == E_MemberKind_DataField) + if(type->members[member_idx].name.size != 0 && type->members[member_idx].kind == E_MemberKind_DataField) { E_MemberNode *n = push_array(scratch.arena, E_MemberNode, 1); MemoryCopyStruct(&n->v, &type->members[member_idx]); diff --git a/src/eval_visualization/eval_visualization_core.c b/src/eval_visualization/eval_visualization_core.c index d817f242..3e2ea5f5 100644 --- a/src/eval_visualization/eval_visualization_core.c +++ b/src/eval_visualization/eval_visualization_core.c @@ -79,38 +79,65 @@ ev_hash_from_key(EV_Key key) //- rjf: type info -> expandability/editablity +internal E_TypeKey +ev_expansion_type_from_key(E_TypeKey type_key) +{ + E_TypeKey result = zero_struct; + for(E_TypeKey key = type_key; + !e_type_key_match(key, e_type_key_zero()); + key = e_type_key_direct(key)) + { + B32 done = 1; + E_TypeKind kind = e_type_kind_from_key(key); + + //- rjf: lenses -> try to see if this lens has special expansion rules. if + // so, choose the current eval + if(kind == E_TypeKind_Lens) + { + E_Type *type = e_type_from_key__cached(key); + if(type->expand.info != 0 || + ev_expand_rule_from_string(type->name)) + { + done = 1; + result = key; + } + } + + //- rjf: if we have meta-expression tags in the type chain, defer + // to the next type in the chain. + else if(E_TypeKind_FirstMeta <= kind && kind <= E_TypeKind_LastMeta) + { + done = 0; + } + + //- rjf: break if done + if(done) + { + break; + } + } + return result; +} + internal B32 ev_type_key_and_mode_is_expandable(E_TypeKey type_key, E_Mode mode) { B32 result = 0; + if(!e_type_key_match(ev_expansion_type_from_key(type_key), e_type_key_zero())) { - if(!result && e_type_kind_from_key(type_key) == E_TypeKind_Lens) + result = 1; + } + else + { + E_TypeKey default_expansion_type_key = e_default_expansion_type_from_key(type_key); + E_TypeKind kind = e_type_kind_from_key(default_expansion_type_key); + if(kind == E_TypeKind_Enum) { - for(E_Type *lens_type = e_type_from_key__cached(type_key); - lens_type->kind == E_TypeKind_Lens; - lens_type = e_type_from_key__cached(lens_type->direct_type_key)) - { - if(lens_type->expand.info != 0) - { - result = 1; - break; - } - } + result = (mode == E_Mode_Null); } - if(!result) + else if(kind != E_TypeKind_Null) { - E_TypeKey expand_type_key = e_default_expansion_type_from_key(type_key); - E_TypeKind expand_type_kind = e_type_kind_from_key(expand_type_key); - if(expand_type_kind == E_TypeKind_Struct || - expand_type_kind == E_TypeKind_Union || - expand_type_kind == E_TypeKind_Class || - expand_type_kind == E_TypeKind_Array || - expand_type_kind == E_TypeKind_Set || - e_type_kind_is_pointer_or_ref(expand_type_kind) || - (expand_type_kind == E_TypeKind_Enum && mode == E_Mode_Null)) - { - result = 1; - } + result = 1; } } return result; @@ -512,7 +539,7 @@ ev_resolved_from_expr(Arena *arena, E_Expr *expr) //~ rjf: Block Building internal EV_BlockTree -ev_block_tree_from_eval(Arena *arena, EV_View *view, String8 filter, E_Eval eval) +ev_block_tree_from_eval(Arena *arena, EV_View *view, String8 filter, E_Eval root_eval) { ProfBeginFunction(); EV_BlockTree tree = {&ev_nil_block}; @@ -528,7 +555,7 @@ ev_block_tree_from_eval(Arena *arena, EV_View *view, String8 filter, E_Eval eval MemoryCopyStruct(tree.root, &ev_nil_block); tree.root->key = root_key; tree.root->string = str8_zero(); - tree.root->eval = eval; + tree.root->eval = root_eval; tree.root->type_expand_rule = &e_type_expand_rule__default; tree.root->viz_expand_rule = &ev_nil_expand_rule; tree.root->row_count = 1; @@ -574,21 +601,26 @@ ev_block_tree_from_eval(Arena *arena, EV_View *view, String8 filter, E_Eval eval // rjf: unpack eval E_Mode mode = t->eval.irtree.mode; - E_TypeKey type_key = t->eval.irtree.type_key; + E_Eval eval = t->eval; + E_TypeKey expansion_type_key = ev_expansion_type_from_key(eval.irtree.type_key); + if(!e_type_key_match(expansion_type_key, e_type_key_zero())) + { + eval.irtree.type_key = expansion_type_key; + } // rjf: get expansion rules from type - E_TypeExpandRule *type_expand_rule = e_expand_rule_from_type_key(type_key); - EV_ExpandRule *viz_expand_rule = ev_expand_rule_from_type_key(type_key); + E_TypeExpandRule *type_expand_rule = e_expand_rule_from_type_key(eval.irtree.type_key); + EV_ExpandRule *viz_expand_rule = ev_expand_rule_from_type_key(eval.irtree.type_key); // rjf: skip if no expansion rule, & type info disallows expansion - if(viz_expand_rule == &ev_nil_expand_rule && !ev_type_key_and_mode_is_expandable(type_key, mode)) + if(viz_expand_rule == &ev_nil_expand_rule && !ev_type_key_and_mode_is_expandable(eval.irtree.type_key, mode)) { continue; } // rjf: get top-level lookup/expansion info - E_TypeExpandInfo type_expand_info = type_expand_rule->info(arena, t->eval, filter); - EV_ExpandInfo viz_expand_info = viz_expand_rule->info(arena, view, filter, t->eval.expr); + E_TypeExpandInfo type_expand_info = type_expand_rule->info(arena, eval, filter); + EV_ExpandInfo viz_expand_info = viz_expand_rule->info(arena, view, filter, eval.expr); // rjf: determine expansion info U64 expansion_row_count = type_expand_info.expr_count; @@ -615,7 +647,7 @@ ev_block_tree_from_eval(Arena *arena, EV_View *view, String8 filter, E_Eval eval expansion_block->parent = t->parent_block; expansion_block->key = key; expansion_block->split_relative_idx = t->split_relative_idx; - expansion_block->eval = t->eval; + expansion_block->eval = eval; expansion_block->type_expand_info = type_expand_info; expansion_block->type_expand_rule = type_expand_rule; expansion_block->viz_expand_info = viz_expand_info; @@ -702,7 +734,7 @@ ev_block_tree_from_eval(Arena *arena, EV_View *view, String8 filter, E_Eval eval { Rng1U64 child_range = r1u64(split_relative_idx, split_relative_idx+1); E_Eval child_eval = {0}; - type_expand_rule->range(arena, type_expand_info.user_data, t->eval, filter, r1u64(split_relative_idx, split_relative_idx+1), &child_eval); + type_expand_rule->range(arena, type_expand_info.user_data, eval, filter, r1u64(split_relative_idx, split_relative_idx+1), &child_eval); EV_Key child_key = child_keys[idx]; BlockTreeBuildTask *task = push_array(scratch.arena, BlockTreeBuildTask, 1); SLLQueuePush(first_task, last_task, task); diff --git a/src/eval_visualization/eval_visualization_core.h b/src/eval_visualization/eval_visualization_core.h index 84d2f7fb..c7ff2bc7 100644 --- a/src/eval_visualization/eval_visualization_core.h +++ b/src/eval_visualization/eval_visualization_core.h @@ -315,6 +315,7 @@ internal U64 ev_hash_from_key(EV_Key key); //~ rjf: Type Info Helpers //- rjf: type info -> expandability/editablity +internal E_TypeKey ev_expansion_type_from_key(E_TypeKey type_key); internal B32 ev_type_key_and_mode_is_expandable(E_TypeKey type_key, E_Mode mode); internal B32 ev_type_key_is_editable(E_TypeKey type_key); @@ -351,7 +352,7 @@ internal E_Expr *ev_resolved_from_expr(Arena *arena, E_Expr *expr); //////////////////////////////// //~ rjf: Block Building -internal EV_BlockTree ev_block_tree_from_eval(Arena *arena, EV_View *view, String8 filter, E_Eval eval); +internal EV_BlockTree ev_block_tree_from_eval(Arena *arena, EV_View *view, String8 filter, E_Eval root_eval); internal U64 ev_depth_from_block(EV_Block *block); //////////////////////////////// diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 65e178d3..f062c932 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -4570,6 +4570,7 @@ rd_view_ui(Rng2F32 rect) // rjf: form cell build parameters RD_CellParams cell_params = {0}; + ProfScope("form cell build parameters") { // rjf: set up base parameters cell_params.flags = (RD_CellFlag_KeyboardClickable|RD_CellFlag_NoBackground|RD_CellFlag_CodeContents); @@ -10389,35 +10390,8 @@ rd_theme_color_from_txt_token_kind_lookup_string(TXT_TokenKind kind, String8 str internal FNT_Tag rd_font_from_slot(RD_FontSlot slot) { - // rjf: determine key name for this font slot - String8 key = {0}; - switch(slot) - { - default:{}break; - case RD_FontSlot_Main:{key = str8_lit("main_font");}break; - case RD_FontSlot_Code:{key = str8_lit("code_font");}break; - } - - // rjf: determine font name - String8 font_name = rd_setting_from_name(key); - - // rjf: map name -> tag - FNT_Tag result = {0}; - if(font_name.size != 0) - { - result = fnt_tag_from_path(font_name); - } - if(font_name.size == 0 || fnt_tag_match(fnt_tag_zero(), result)) - { - switch(slot) - { - default: - case RD_FontSlot_Main: {result = fnt_tag_from_static_data_string(&rd_default_main_font_bytes);}break; - case RD_FontSlot_Code: {result = fnt_tag_from_static_data_string(&rd_default_code_font_bytes);}break; - case RD_FontSlot_Icons:{result = fnt_tag_from_static_data_string(&rd_icon_font_bytes);}break; - } - } - return result; + FNT_Tag tag = rd_state->font_slot_table[slot]; + return tag; } internal FNT_RasterFlags @@ -11609,6 +11583,26 @@ rd_frame(void) } } + ////////////////////////////// + //- rjf: get fonts from config + // + ProfScope("get fonts from config") + { + String8 main_font_name = rd_setting_from_name(str8_lit("main_font")); + String8 code_font_name = rd_setting_from_name(str8_lit("code_font")); + rd_state->font_slot_table[RD_FontSlot_Main] = fnt_tag_from_path(main_font_name); + rd_state->font_slot_table[RD_FontSlot_Code] = fnt_tag_from_path(code_font_name); + if(fnt_tag_match(rd_state->font_slot_table[RD_FontSlot_Main], fnt_tag_zero())) + { + rd_state->font_slot_table[RD_FontSlot_Main] = fnt_tag_from_static_data_string(&rd_default_main_font_bytes); + } + if(fnt_tag_match(rd_state->font_slot_table[RD_FontSlot_Code], fnt_tag_zero())) + { + rd_state->font_slot_table[RD_FontSlot_Code] = fnt_tag_from_static_data_string(&rd_default_code_font_bytes); + } + rd_state->font_slot_table[RD_FontSlot_Icons] = fnt_tag_from_static_data_string(&rd_icon_font_bytes); + } + ////////////////////////////// //- rjf: build theme from config // diff --git a/src/raddbg/raddbg_core.h b/src/raddbg/raddbg_core.h index 6097e6bf..1f0b487f 100644 --- a/src/raddbg/raddbg_core.h +++ b/src/raddbg/raddbg_core.h @@ -655,6 +655,9 @@ struct RD_State // rjf: key map (constructed from-scratch each frame) RD_KeyMap *key_map; + // rjf: slot -> font tag map (constructed from-scratch each frame) + FNT_Tag font_slot_table[RD_FontSlot_COUNT]; + // rjf: theme target (constructed from-scratch each frame) RD_Theme *theme; RD_Theme *theme_target;