diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 8f481cf4..f14cb365 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -1729,7 +1729,20 @@ rd_eval_space_read(void *u, E_Space space, void *out, Rng1U64 range) { case E_SpaceKind_FileSystem: { - + U128 key = space.u128; + U128 hash = hs_hash_from_key(key, 0); + HS_Scope *scope = hs_scope_open(); + { + String8 data = hs_data_from_hash(scope, hash); + Rng1U64 legal_range = r1u64(0, data.size); + Rng1U64 read_range = intersect_1u64(range, legal_range); + if(read_range.min < read_range.max) + { + result = 1; + MemoryCopy(out, data.str + read_range.min, dim_1u64(read_range)); + } + } + hs_scope_close(scope); }break; case RD_EvalSpaceKind_CtrlEntity: { @@ -1904,6 +1917,13 @@ internal U128 rd_key_from_eval_space_range(E_Space space, Rng1U64 range, B32 zero_terminated) { U128 result = {0}; + switch(space.kind) + { + case E_SpaceKind_FileSystem: + { + result = space.u128; + }break; + } #if 0 // TODO(rjf): @msgs RD_Entity *entity = rd_entity_from_eval_space(space); switch(entity->kind) @@ -9434,7 +9454,7 @@ rd_cmd_kind_info_from_string(String8 string) internal void rd_push_cmd(String8 name, RD_Regs *regs) { - rd_cmd_list_push_new(rd_state->cmds_arena, &rd_state->cmds, name, regs); + rd_cmd_list_push_new(rd_state->cmds_arenas[0], &rd_state->cmds[0], name, regs); } //- rjf: iterating @@ -9442,7 +9462,8 @@ rd_push_cmd(String8 name, RD_Regs *regs) internal B32 rd_next_cmd(RD_Cmd **cmd) { - RD_CmdNode *start_node = rd_state->cmds.first; + U64 slot = rd_state->cmds_gen%ArrayCount(rd_state->cmds); + RD_CmdNode *start_node = rd_state->cmds[slot].first; if(cmd[0] != 0) { start_node = CastFromMember(RD_CmdNode, cmd, cmd[0]); @@ -9490,7 +9511,10 @@ rd_init(CmdLine *cmdln) } rd_state->num_frames_requested = 2; rd_state->seconds_until_autosave = 0.5f; - rd_state->cmds_arena = arena_alloc(); + for(U64 idx = 0; idx < ArrayCount(rd_state->cmds_arenas); idx += 1) + { + rd_state->cmds_arenas[idx] = arena_alloc(); + } rd_state->entities_arena = arena_alloc(.reserve_size = GB(64), .commit_size = KB(64)); rd_state->entities_root = &d_nil_entity; rd_state->entities_base = push_array(rd_state->entities_arena, RD_Entity, 0); @@ -10122,6 +10146,7 @@ rd_frame(void) //- rjf: process top-level graphical commands // B32 panel_reset_done = 0; + if(depth == 0) { for(RD_Cmd *cmd = 0; rd_next_cmd(&cmd);) RD_RegsScope() { @@ -14044,11 +14069,51 @@ rd_frame(void) } ////////////////////////////// - //- rjf: clear commands + //- rjf: rotate command slots, bump command gen counter // + // in this step, we rotate the ring buffer of command batches (command + // arenas & lists). when the cmds_gen (the position of the ring buffer) + // is even, the command queue is in a "read/write" mode, and this is uniquely + // usable by the core - this is done so that commands in the core can push + // other commands, and have those other commands processed on the same frame. + // + // in view code, however, they can only use the current command queue in a + // "read only" mode, because new commands pushed by those views must be + // processed first by the core. so, before calling into view code, the + // cmds_gen is incremented to be *odd*. this way, the views will *write* + // commands into the 0 slot, but *read* from the 1 slot (which will contain + // this frame's commands). + // + // after view code runs, the generation number is incremented back to even. + // the commands pushed by the view will be in the queue, and the core can + // treat that queue as r/w again. + // + if(depth == 0) { - arena_clear(rd_state->cmds_arena); - MemoryZeroStruct(&rd_state->cmds); + // rjf: rotate + { + Arena *first_arena = rd_state->cmds_arenas[0]; + RD_CmdList first_cmds = rd_state->cmds[0]; + MemoryCopy(rd_state->cmds_arenas, + rd_state->cmds_arenas+1, + sizeof(rd_state->cmds_arenas[0])*(ArrayCount(rd_state->cmds_arenas)-1)); + MemoryCopy(rd_state->cmds, + rd_state->cmds+1, + sizeof(rd_state->cmds[0])*(ArrayCount(rd_state->cmds)-1)); + rd_state->cmds_arenas[ArrayCount(rd_state->cmds_arenas)-1] = first_arena; + rd_state->cmds[ArrayCount(rd_state->cmds_arenas)-1] = first_cmds; + } + + // rjf: clear next batch + { + arena_clear(rd_state->cmds_arenas[0]); + MemoryZeroStruct(&rd_state->cmds[0]); + } + + // rjf: bump + { + rd_state->cmds_gen += 1; + } } ////////////////////////////// @@ -14424,6 +14489,14 @@ rd_frame(void) rd_state->frame_index += 1; rd_state->time_in_seconds += rd_state->frame_dt; + ////////////////////////////// + //- rjf: bump command batch ring buffer generation + // + if(depth == 0) + { + rd_state->cmds_gen += 1; + } + ////////////////////////////// //- rjf: collect logs // diff --git a/src/raddbg/raddbg_core.h b/src/raddbg/raddbg_core.h index 43f23fc2..4b3bed5b 100644 --- a/src/raddbg/raddbg_core.h +++ b/src/raddbg/raddbg_core.h @@ -943,8 +943,9 @@ struct RD_State F32 seconds_until_autosave; // rjf: commands - Arena *cmds_arena; - RD_CmdList cmds; + Arena *cmds_arenas[2]; + RD_CmdList cmds[2]; + U64 cmds_gen; // rjf: popup state UI_Key popup_key; diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index 22c54a02..ff17659c 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -21,6 +21,36 @@ rd_code_view_init(RD_CodeViewState *cv, RD_View *view) internal void rd_code_view_cmds(RD_View *view, RD_CodeViewState *cv, String8 text_data, TXT_TextInfo *text_info, DASM_LineArray *dasm_lines, Rng1U64 dasm_vaddr_range, DI_Key dasm_dbgi_key) { + +} + +internal RD_CodeViewBuildResult +rd_code_view_build(Arena *arena, RD_View *view, RD_CodeViewState *cv, RD_CodeViewBuildFlags flags, Rng2F32 rect, String8 text_data, TXT_TextInfo *text_info, DASM_LineArray *dasm_lines, Rng1U64 dasm_vaddr_range, DI_Key dasm_dbgi_key) +{ + ProfBeginFunction(); + Temp scratch = scratch_begin(&arena, 1); + HS_Scope *hs_scope = hs_scope_open(); + TXT_Scope *txt_scope = txt_scope_open(); + + ////////////////////////////// + //- rjf: extract invariants + // + FNT_Tag code_font = rd_font_from_slot(RD_FontSlot_Code); + F32 code_font_size = rd_font_size_from_slot(RD_FontSlot_Code); + F32 code_tab_size = fnt_column_size_from_tag_size(code_font, code_font_size)*rd_setting_val_from_code(RD_SettingCode_TabWidth).s32; + FNT_Metrics code_font_metrics = fnt_metrics_from_tag_size(code_font, code_font_size); + F32 code_line_height = ceil_f32(fnt_line_height_from_metrics(&code_font_metrics) * 1.5f); + F32 big_glyph_advance = fnt_dim_from_tag_size_string(code_font, code_font_size, 0, 0, str8_lit("H")).x; + Vec2F32 panel_box_dim = dim_2f32(rect); + F32 scroll_bar_dim = floor_f32(ui_top_font_size()*1.5f); + Vec2F32 code_area_dim = v2f32(panel_box_dim.x - scroll_bar_dim, panel_box_dim.y - scroll_bar_dim); + S64 num_possible_visible_lines = (S64)(code_area_dim.y/code_line_height)+1; + CTRL_Entity *thread = ctrl_entity_from_handle(d_state->ctrl_entity_store, rd_regs()->thread); + CTRL_Entity *process = ctrl_entity_ancestor_from_kind(thread, CTRL_EntityKind_Process); + + ////////////////////////////// + //- rjf: process commands + // for(RD_Cmd *cmd = 0; rd_next_cmd(&cmd);) { // rjf: mismatched window/panel => skip @@ -63,31 +93,6 @@ rd_code_view_cmds(RD_View *view, RD_CodeViewState *cv, String8 text_data, TXT_Te }break; } } -} - -internal RD_CodeViewBuildResult -rd_code_view_build(Arena *arena, RD_View *view, RD_CodeViewState *cv, RD_CodeViewBuildFlags flags, Rng2F32 rect, String8 text_data, TXT_TextInfo *text_info, DASM_LineArray *dasm_lines, Rng1U64 dasm_vaddr_range, DI_Key dasm_dbgi_key) -{ - ProfBeginFunction(); - Temp scratch = scratch_begin(&arena, 1); - HS_Scope *hs_scope = hs_scope_open(); - TXT_Scope *txt_scope = txt_scope_open(); - - ////////////////////////////// - //- rjf: extract invariants - // - FNT_Tag code_font = rd_font_from_slot(RD_FontSlot_Code); - F32 code_font_size = rd_font_size_from_slot(RD_FontSlot_Code); - F32 code_tab_size = fnt_column_size_from_tag_size(code_font, code_font_size)*rd_setting_val_from_code(RD_SettingCode_TabWidth).s32; - FNT_Metrics code_font_metrics = fnt_metrics_from_tag_size(code_font, code_font_size); - F32 code_line_height = ceil_f32(fnt_line_height_from_metrics(&code_font_metrics) * 1.5f); - F32 big_glyph_advance = fnt_dim_from_tag_size_string(code_font, code_font_size, 0, 0, str8_lit("H")).x; - Vec2F32 panel_box_dim = dim_2f32(rect); - F32 scroll_bar_dim = floor_f32(ui_top_font_size()*1.5f); - Vec2F32 code_area_dim = v2f32(panel_box_dim.x - scroll_bar_dim, panel_box_dim.y - scroll_bar_dim); - S64 num_possible_visible_lines = (S64)(code_area_dim.y/code_line_height)+1; - CTRL_Entity *thread = ctrl_entity_from_handle(d_state->ctrl_entity_store, rd_regs()->thread); - CTRL_Entity *process = ctrl_entity_ancestor_from_kind(thread, CTRL_EntityKind_Process); ////////////////////////////// //- rjf: determine visible line range / count