move interaction register stack into frontend layer

This commit is contained in:
Ryan Fleury
2024-09-11 14:24:16 -07:00
parent be6458690f
commit af5825c89a
5 changed files with 295 additions and 9 deletions
+68
View File
@@ -28,6 +28,74 @@
@expand(D_CfgSrcTable a) `DF_CmdKind_$(a.apply_cmd)`;
}
////////////////////////////////
//~ rjf: Registers Type Table
@table(c_type name_lower name)
DF_RegTable:
{
// rjf: entity slots
{D_Handle machine Machine }
{D_Handle module Module }
{D_Handle process Process }
{D_Handle thread Thread }
{D_Handle window Window }
{D_Handle panel Panel }
{D_Handle view View }
{D_Handle prev_view PrevView }
{D_Handle dst_panel DstPanel }
{D_Handle entity Entity }
{D_HandleList entity_list EntityList }
// rjf: frame selection
{U64 unwind_count UnwindCount }
{U64 inline_depth InlineDepth }
// rjf: code / address location info
{String8 file_path FilePath }
{TxtPt cursor Cursor }
{TxtPt mark Mark }
{U128 text_key TextKey }
{TXT_LangKind lang_kind LangKind }
{D_LineList lines Lines }
{DI_Key dbgi_key DbgiKey }
{Rng1U64 vaddr_range VaddrRange }
{Rng1U64 voff_range VoffRange }
// rjf: general parameters
{U32 pid PID }
{B32 force_confirm ForceConfirm }
{B32 prefer_disasm PreferDisasm }
{Dir2 dir2 Dir2 }
{String8 string String }
{`MD_Node *` params_tree ParamsTree }
}
@enum DF_RegSlot:
{
Null,
@expand(DF_RegTable a) `$(a.name)`,
COUNT,
}
@struct DF_Regs:
{
@expand(DF_RegTable a) `$(a.c_type) $(a.name_lower)`
}
@data(Rng1U64) df_reg_slot_range_table:
{
`{0}`,
@expand(DF_RegTable a) `{OffsetOf(DF_Regs, $(a.name_lower)), OffsetOf(DF_Regs, $(a.name_lower)) + sizeof($(a.c_type))}`
}
@gen
{
`#define df_regs_lit_init_top \\`
@expand(DF_RegTable a) `.$(a.name_lower) = df_regs()->$(a.name_lower),\\`
``;
}
////////////////////////////////
//~ rjf: Command Table
+60 -4
View File
@@ -7393,6 +7393,54 @@ df_request_frame(void)
df_state->num_frames_requested = 4;
}
////////////////////////////////
//~ rjf: Main State Accessors
internal Arena *
df_frame_arena(void)
{
return df_state->frame_arenas[df_state->frame_index%ArrayCount(df_state->frame_arenas)];
}
////////////////////////////////
//~ rjf: Registers
internal DF_Regs *
df_regs(void)
{
DF_Regs *regs = &df_state->top_regs->v;
return regs;
}
internal DF_Regs *
df_base_regs(void)
{
DF_Regs *regs = &df_state->base_regs.v;
return regs;
}
internal DF_Regs *
df_push_regs(void)
{
DF_Regs *top = df_regs();
DF_RegsNode *n = push_array(df_frame_arena(), DF_RegsNode, 1);
MemoryCopyStruct(&n->v, top);
SLLStackPush(df_state->top_regs, n);
return &n->v;
}
internal DF_Regs *
df_pop_regs(void)
{
DF_Regs *regs = &df_state->top_regs->v;
SLLStackPop(df_state->top_regs);
if(df_state->top_regs == 0)
{
df_state->top_regs = &df_state->base_regs;
}
return regs;
}
////////////////////////////////
//~ rjf: Commands
@@ -7464,6 +7512,10 @@ df_init(CmdLine *cmdln)
Arena *arena = arena_alloc();
df_state = push_array(arena, DF_State, 1);
df_state->arena = arena;
for(U64 idx = 0; idx < ArrayCount(df_state->frame_arenas); idx += 1)
{
df_state->frame_arenas[idx] = arena_alloc();
}
df_state->num_frames_requested = 2;
df_state->seconds_until_autosave = 0.5f;
df_state->cmds_arena = arena_alloc();
@@ -7648,10 +7700,10 @@ df_frame(void)
//
// TODO(rjf): maximize target, given all windows and their monitors
F32 target_hz = os_get_gfx_info()->default_refresh_rate;
if(df_state->frame_time_us_history_idx > 32)
if(df_state->frame_index > 32)
{
// rjf: calculate average frame time out of the last N
U64 num_frames_in_history = Min(ArrayCount(df_state->frame_time_us_history), df_state->frame_time_us_history_idx);
U64 num_frames_in_history = Min(ArrayCount(df_state->frame_time_us_history), df_state->frame_index);
U64 frame_time_history_sum_us = 0;
for(U64 idx = 0; idx < num_frames_in_history; idx += 1)
{
@@ -12208,8 +12260,12 @@ df_frame(void)
//
U64 end_time_us = os_now_microseconds();
U64 frame_time_us = end_time_us-begin_time_us;
df_state->frame_time_us_history[df_state->frame_time_us_history_idx%ArrayCount(df_state->frame_time_us_history)] = frame_time_us;
df_state->frame_time_us_history_idx += 1;
df_state->frame_time_us_history[df_state->frame_index%ArrayCount(df_state->frame_time_us_history)] = frame_time_us;
//////////////////////////////
//- rjf: bump frame index
//
df_state->frame_index += 1;
di_scope_close(di_scope);
scratch_end(scratch);
+36 -5
View File
@@ -404,6 +404,16 @@ struct DF_MsgKindInfo
#include "generated/dbg_frontend.meta.h"
////////////////////////////////
//~ rjf: Context Register Types
typedef struct DF_RegsNode DF_RegsNode;
struct DF_RegsNode
{
DF_RegsNode *next;
DF_Regs v;
};
////////////////////////////////
//~ rjf: Theme Types
@@ -641,10 +651,21 @@ struct DF_EvalVizViewCacheSlot
typedef struct DF_State DF_State;
struct DF_State
{
// rjf: arenas
// rjf: top-level state
Arena *arena;
B32 quit;
// rjf: frame state
U64 frame_index;
Arena *frame_arenas[2];
// rjf: frame time history
U64 frame_time_us_history[64];
// rjf: registers stack
DF_RegsNode base_regs;
DF_RegsNode *top_regs;
// rjf: commands
Arena *cmds_arena;
D_CmdList cmds;
@@ -739,10 +760,6 @@ struct DF_State
// rjf: icon texture
R_Handle icon_texture;
// rjf: frame time history
U64 frame_time_us_history[64];
U64 frame_time_us_history_idx;
};
////////////////////////////////
@@ -995,6 +1012,20 @@ internal String8 df_stop_explanation_string_icon_from_ctrl_event(Arena *arena, C
internal void df_request_frame(void);
////////////////////////////////
//~ rjf: Main State Accessors
internal Arena *df_frame_arena(void);
////////////////////////////////
//~ rjf: Registers
internal DF_Regs *df_regs(void);
internal DF_Regs *df_base_regs(void);
internal DF_Regs *df_push_regs(void);
internal DF_Regs *df_pop_regs(void);
#define DF_RegsScope DeferLoop(df_push_regs(), df_pop_regs())
////////////////////////////////
//~ rjf: Commands
@@ -28,6 +28,39 @@ DF_CmdKind_Null,
DF_CmdKind_Null,
};
Rng1U64 df_reg_slot_range_table[29] =
{
{0},
{OffsetOf(DF_Regs, machine), OffsetOf(DF_Regs, machine) + sizeof(D_Handle)},
{OffsetOf(DF_Regs, module), OffsetOf(DF_Regs, module) + sizeof(D_Handle)},
{OffsetOf(DF_Regs, process), OffsetOf(DF_Regs, process) + sizeof(D_Handle)},
{OffsetOf(DF_Regs, thread), OffsetOf(DF_Regs, thread) + sizeof(D_Handle)},
{OffsetOf(DF_Regs, window), OffsetOf(DF_Regs, window) + sizeof(D_Handle)},
{OffsetOf(DF_Regs, panel), OffsetOf(DF_Regs, panel) + sizeof(D_Handle)},
{OffsetOf(DF_Regs, view), OffsetOf(DF_Regs, view) + sizeof(D_Handle)},
{OffsetOf(DF_Regs, prev_view), OffsetOf(DF_Regs, prev_view) + sizeof(D_Handle)},
{OffsetOf(DF_Regs, dst_panel), OffsetOf(DF_Regs, dst_panel) + sizeof(D_Handle)},
{OffsetOf(DF_Regs, entity), OffsetOf(DF_Regs, entity) + sizeof(D_Handle)},
{OffsetOf(DF_Regs, entity_list), OffsetOf(DF_Regs, entity_list) + sizeof(D_HandleList)},
{OffsetOf(DF_Regs, unwind_count), OffsetOf(DF_Regs, unwind_count) + sizeof(U64)},
{OffsetOf(DF_Regs, inline_depth), OffsetOf(DF_Regs, inline_depth) + sizeof(U64)},
{OffsetOf(DF_Regs, file_path), OffsetOf(DF_Regs, file_path) + sizeof(String8)},
{OffsetOf(DF_Regs, cursor), OffsetOf(DF_Regs, cursor) + sizeof(TxtPt)},
{OffsetOf(DF_Regs, mark), OffsetOf(DF_Regs, mark) + sizeof(TxtPt)},
{OffsetOf(DF_Regs, text_key), OffsetOf(DF_Regs, text_key) + sizeof(U128)},
{OffsetOf(DF_Regs, lang_kind), OffsetOf(DF_Regs, lang_kind) + sizeof(TXT_LangKind)},
{OffsetOf(DF_Regs, lines), OffsetOf(DF_Regs, lines) + sizeof(D_LineList)},
{OffsetOf(DF_Regs, dbgi_key), OffsetOf(DF_Regs, dbgi_key) + sizeof(DI_Key)},
{OffsetOf(DF_Regs, vaddr_range), OffsetOf(DF_Regs, vaddr_range) + sizeof(Rng1U64)},
{OffsetOf(DF_Regs, voff_range), OffsetOf(DF_Regs, voff_range) + sizeof(Rng1U64)},
{OffsetOf(DF_Regs, pid), OffsetOf(DF_Regs, pid) + sizeof(U32)},
{OffsetOf(DF_Regs, force_confirm), OffsetOf(DF_Regs, force_confirm) + sizeof(B32)},
{OffsetOf(DF_Regs, prefer_disasm), OffsetOf(DF_Regs, prefer_disasm) + sizeof(B32)},
{OffsetOf(DF_Regs, dir2), OffsetOf(DF_Regs, dir2) + sizeof(Dir2)},
{OffsetOf(DF_Regs, string), OffsetOf(DF_Regs, string) + sizeof(String8)},
{OffsetOf(DF_Regs, params_tree), OffsetOf(DF_Regs, params_tree) + sizeof(MD_Node *)},
};
D_CmdSpecInfo df_cmd_kind_spec_info_table[220] =
{
{0},
@@ -6,6 +6,40 @@
#ifndef DBG_FRONTEND_META_H
#define DBG_FRONTEND_META_H
typedef enum DF_RegSlot
{
DF_RegSlot_Null,
DF_RegSlot_Machine,
DF_RegSlot_Module,
DF_RegSlot_Process,
DF_RegSlot_Thread,
DF_RegSlot_Window,
DF_RegSlot_Panel,
DF_RegSlot_View,
DF_RegSlot_PrevView,
DF_RegSlot_DstPanel,
DF_RegSlot_Entity,
DF_RegSlot_EntityList,
DF_RegSlot_UnwindCount,
DF_RegSlot_InlineDepth,
DF_RegSlot_FilePath,
DF_RegSlot_Cursor,
DF_RegSlot_Mark,
DF_RegSlot_TextKey,
DF_RegSlot_LangKind,
DF_RegSlot_Lines,
DF_RegSlot_DbgiKey,
DF_RegSlot_VaddrRange,
DF_RegSlot_VoffRange,
DF_RegSlot_PID,
DF_RegSlot_ForceConfirm,
DF_RegSlot_PreferDisasm,
DF_RegSlot_Dir2,
DF_RegSlot_String,
DF_RegSlot_ParamsTree,
DF_RegSlot_COUNT,
} DF_RegSlot;
typedef enum DF_CmdKind
{
DF_CmdKind_Null,
@@ -462,6 +496,69 @@ DF_SettingCode_HintCodeText,
DF_SettingCode_COUNT,
} DF_SettingCode;
typedef struct DF_Regs DF_Regs;
struct DF_Regs
{
D_Handle machine;
D_Handle module;
D_Handle process;
D_Handle thread;
D_Handle window;
D_Handle panel;
D_Handle view;
D_Handle prev_view;
D_Handle dst_panel;
D_Handle entity;
D_HandleList entity_list;
U64 unwind_count;
U64 inline_depth;
String8 file_path;
TxtPt cursor;
TxtPt mark;
U128 text_key;
TXT_LangKind lang_kind;
D_LineList lines;
DI_Key dbgi_key;
Rng1U64 vaddr_range;
Rng1U64 voff_range;
U32 pid;
B32 force_confirm;
B32 prefer_disasm;
Dir2 dir2;
String8 string;
MD_Node * params_tree;
};
#define df_regs_lit_init_top \
.machine = df_regs()->machine,\
.module = df_regs()->module,\
.process = df_regs()->process,\
.thread = df_regs()->thread,\
.window = df_regs()->window,\
.panel = df_regs()->panel,\
.view = df_regs()->view,\
.prev_view = df_regs()->prev_view,\
.dst_panel = df_regs()->dst_panel,\
.entity = df_regs()->entity,\
.entity_list = df_regs()->entity_list,\
.unwind_count = df_regs()->unwind_count,\
.inline_depth = df_regs()->inline_depth,\
.file_path = df_regs()->file_path,\
.cursor = df_regs()->cursor,\
.mark = df_regs()->mark,\
.text_key = df_regs()->text_key,\
.lang_kind = df_regs()->lang_kind,\
.lines = df_regs()->lines,\
.dbgi_key = df_regs()->dbgi_key,\
.vaddr_range = df_regs()->vaddr_range,\
.voff_range = df_regs()->voff_range,\
.pid = df_regs()->pid,\
.force_confirm = df_regs()->force_confirm,\
.prefer_disasm = df_regs()->prefer_disasm,\
.dir2 = df_regs()->dir2,\
.string = df_regs()->string,\
.params_tree = df_regs()->params_tree,\
DF_VIEW_SETUP_FUNCTION_DEF(null);
DF_VIEW_SETUP_FUNCTION_DEF(empty);
DF_VIEW_SETUP_FUNCTION_DEF(getting_started);
@@ -581,6 +678,7 @@ C_LINKAGE_BEGIN
extern DF_CmdKind d_cfg_src_load_cmd_kind_table[4];
extern DF_CmdKind d_cfg_src_write_cmd_kind_table[4];
extern DF_CmdKind d_cfg_src_apply_cmd_kind_table[4];
extern Rng1U64 df_reg_slot_range_table[29];
extern DF_StringBindingPair df_g_default_binding_table[110];
extern String8 df_g_binding_version_remap_old_name_table[7];
extern String8 df_g_binding_version_remap_new_name_table[7];