further progress on integrating new demon layer

This commit is contained in:
Ryan Fleury
2024-03-21 11:28:47 -07:00
parent 1269b93588
commit e0e84c2ee3
9 changed files with 105 additions and 63 deletions
+31 -31
View File
@@ -933,7 +933,7 @@ ctrl_stored_hash_from_process_vaddr_range(CTRL_MachineID machine_id, DMN_Handle
{ {
result = range_n->hash; result = range_n->hash;
is_good = 1; is_good = 1;
is_stale = (range_n->memgen_idx < ctrl_memgen_idx()); is_stale = (range_n->mem_gen != dmn_mem_gen());
goto read_cache__break_all; goto read_cache__break_all;
} }
} }
@@ -1169,6 +1169,20 @@ ctrl_query_cached_data_from_process_vaddr_range(Arena *arena, CTRL_MachineID mac
result.data.size = dim_1u64(range); result.data.size = dim_1u64(range);
result.byte_bad_flags = byte_bad_flags; result.byte_bad_flags = byte_bad_flags;
result.byte_changed_flags = byte_changed_flags; result.byte_changed_flags = byte_changed_flags;
if(byte_bad_flags != 0)
{
for(U64 idx = 0; idx < (dim_1u64(range)+63)/64; idx += 1)
{
result.any_byte_bad = result.any_byte_bad || !!result.byte_bad_flags[idx];
}
}
if(byte_changed_flags != 0)
{
for(U64 idx = 0; idx < (dim_1u64(range)+63)/64; idx += 1)
{
result.any_byte_changed = result.any_byte_changed || !!result.byte_changed_flags[idx];
}
}
hs_scope_close(scope); hs_scope_close(scope);
scratch_end(scratch); scratch_end(scratch);
@@ -1199,12 +1213,6 @@ ctrl_process_write(CTRL_MachineID machine_id, DMN_Handle process, Rng1U64 range,
ProfBeginFunction(); ProfBeginFunction();
B32 result = dmn_process_write(process, range, src); B32 result = dmn_process_write(process, range, src);
//- rjf: success -> increment memgen
if(result)
{
ins_atomic_u64_inc_eval(&ctrl_state->memgen_idx);
}
//- rjf: success -> wait for cache updates, for small regions - prefer relatively seamless //- rjf: success -> wait for cache updates, for small regions - prefer relatively seamless
// writes within calling frame's "view" of the memory, at the expense of a small amount of // writes within calling frame's "view" of the memory, at the expense of a small amount of
// time. // time.
@@ -1335,10 +1343,10 @@ ctrl_query_cached_reg_block_from_thread(Arena *arena, CTRL_MachineID machine_id,
// rjf: copy from node // rjf: copy from node
if(node) if(node)
{ {
U64 current_reggen_idx = ctrl_reggen_idx(); U64 current_reg_gen = dmn_reg_gen();
if(node->reggen_idx != current_reggen_idx && dmn_thread_read_reg_block(thread, node->block)) if(node->reg_gen != current_reg_gen && dmn_thread_read_reg_block(thread, node->block))
{ {
node->reggen_idx = current_reggen_idx; node->reg_gen = current_reg_gen;
} }
MemoryCopy(result, node->block, reg_block_size); MemoryCopy(result, node->block, reg_block_size);
} }
@@ -1381,7 +1389,6 @@ internal B32
ctrl_thread_write_reg_block(CTRL_MachineID machine_id, DMN_Handle thread, void *block) ctrl_thread_write_reg_block(CTRL_MachineID machine_id, DMN_Handle thread, void *block)
{ {
B32 good = dmn_thread_write_reg_block(thread, block); B32 good = dmn_thread_write_reg_block(thread, block);
ins_atomic_u64_inc_eval(&ctrl_state->reggen_idx);
return good; return good;
} }
@@ -1421,7 +1428,7 @@ ctrl_unwind_from_thread(Arena *arena, CTRL_EntityStore *store, CTRL_MachineID ma
{ {
CTRL_ProcessMemorySlice stack_memory_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, machine_id, process_entity->handle, r1u64(stack_top, stack_top+stack_size), endt_us); CTRL_ProcessMemorySlice stack_memory_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, machine_id, process_entity->handle, r1u64(stack_top, stack_top+stack_size), endt_us);
String8 stack_memory = stack_memory_slice.data; String8 stack_memory = stack_memory_slice.data;
if(stack_memory.size != 0) if(stack_memory.size != 0 && !stack_memory_slice.any_byte_bad)
{ {
stack_memview_good = 1; stack_memview_good = 1;
stack_memview.data = stack_memory.str; stack_memview.data = stack_memory.str;
@@ -1517,26 +1524,26 @@ ctrl_halt(void)
//////////////////////////////// ////////////////////////////////
//~ rjf: Shared Accessor Functions //~ rjf: Shared Accessor Functions
//- rjf: run indices //- rjf: run generation counter
internal U64 internal U64
ctrl_run_idx(void) ctrl_run_gen(void)
{ {
U64 result = ins_atomic_u64_eval(&ctrl_state->run_idx); U64 result = dmn_run_gen();
return result; return result;
} }
internal U64 internal U64
ctrl_memgen_idx(void) ctrl_mem_gen(void)
{ {
U64 result = ins_atomic_u64_eval(&ctrl_state->memgen_idx); U64 result = dmn_mem_gen();
return result; return result;
} }
internal U64 internal U64
ctrl_reggen_idx(void) ctrl_reg_gen(void)
{ {
U64 result = ins_atomic_u64_eval(&ctrl_state->reggen_idx); U64 result = dmn_reg_gen();
return result; return result;
} }
@@ -2054,13 +2061,6 @@ ctrl_thread__next_dmn_event(Arena *arena, CTRL_Msg *msg, DMN_RunCtrls *run_ctrls
{ {
dmn_process_write(spoof->process, r1u64(spoof->vaddr, spoof->vaddr+size_of_spoof), &spoof_old_ip_value); dmn_process_write(spoof->process, r1u64(spoof->vaddr, spoof->vaddr+size_of_spoof), &spoof_old_ip_value);
} }
// rjf: inc generation counters
{
ins_atomic_u64_inc_eval(&ctrl_state->run_idx);
ins_atomic_u64_inc_eval(&ctrl_state->memgen_idx);
ins_atomic_u64_inc_eval(&ctrl_state->reggen_idx);
}
} }
} }
@@ -3651,7 +3651,7 @@ ctrl_mem_stream_thread__entry_point(void *p)
//- rjf: take task //- rjf: take task
B32 got_task = 0; B32 got_task = 0;
U64 preexisting_memgen_idx = 0; U64 preexisting_mem_gen = 0;
U128 preexisting_hash = {0}; U128 preexisting_hash = {0};
Rng1U64 vaddr_range_clamped = {0}; Rng1U64 vaddr_range_clamped = {0};
OS_MutexScopeW(process_stripe->rw_mutex) OS_MutexScopeW(process_stripe->rw_mutex)
@@ -3667,7 +3667,7 @@ ctrl_mem_stream_thread__entry_point(void *p)
if(MemoryMatchStruct(&range_n->vaddr_range, &vaddr_range) && range_n->zero_terminated == zero_terminated) if(MemoryMatchStruct(&range_n->vaddr_range, &vaddr_range) && range_n->zero_terminated == zero_terminated)
{ {
got_task = !ins_atomic_u32_eval_cond_assign(&range_n->is_taken, 1, 0); got_task = !ins_atomic_u32_eval_cond_assign(&range_n->is_taken, 1, 0);
preexisting_memgen_idx = range_n->memgen_idx; preexisting_mem_gen = range_n->mem_gen;
preexisting_hash = range_n->hash; preexisting_hash = range_n->hash;
vaddr_range_clamped = range_n->vaddr_range_clamped; vaddr_range_clamped = range_n->vaddr_range_clamped;
goto take_task__break_all; goto take_task__break_all;
@@ -3683,8 +3683,8 @@ ctrl_mem_stream_thread__entry_point(void *p)
Arena *range_arena = 0; Arena *range_arena = 0;
void *range_base = 0; void *range_base = 0;
U64 zero_terminated_size = 0; U64 zero_terminated_size = 0;
U64 memgen_idx = ctrl_memgen_idx(); U64 mem_gen = dmn_mem_gen();
if(got_task && memgen_idx != preexisting_memgen_idx) if(got_task && mem_gen != preexisting_mem_gen)
{ {
range_size = dim_1u64(vaddr_range_clamped); range_size = dim_1u64(vaddr_range_clamped);
U64 arena_size = AlignPow2(range_size + ARENA_HEADER_SIZE, os_page_size()); U64 arena_size = AlignPow2(range_size + ARENA_HEADER_SIZE, os_page_size());
@@ -3746,7 +3746,7 @@ ctrl_mem_stream_thread__entry_point(void *p)
if(!u128_match(u128_zero(), hash)) if(!u128_match(u128_zero(), hash))
{ {
range_n->hash = hash; range_n->hash = hash;
range_n->memgen_idx = memgen_idx; range_n->mem_gen = mem_gen;
} }
ins_atomic_u32_eval_assign(&range_n->is_taken, 0); ins_atomic_u32_eval_assign(&range_n->is_taken, 0);
goto commit__break_all; goto commit__break_all;
+8 -9
View File
@@ -376,7 +376,7 @@ struct CTRL_ProcessMemoryRangeHashNode
B32 zero_terminated; B32 zero_terminated;
Rng1U64 vaddr_range_clamped; Rng1U64 vaddr_range_clamped;
U128 hash; U128 hash;
U64 memgen_idx; U64 mem_gen;
U64 last_time_requested_us; U64 last_time_requested_us;
B32 is_taken; B32 is_taken;
}; };
@@ -429,6 +429,8 @@ struct CTRL_ProcessMemorySlice
String8 data; String8 data;
U64 *byte_bad_flags; U64 *byte_bad_flags;
U64 *byte_changed_flags; U64 *byte_changed_flags;
B32 any_byte_bad;
B32 any_byte_changed;
}; };
//////////////////////////////// ////////////////////////////////
@@ -443,7 +445,7 @@ struct CTRL_ThreadRegCacheNode
DMN_Handle thread; DMN_Handle thread;
U64 block_size; U64 block_size;
void *block; void *block;
U64 reggen_idx; U64 reg_gen;
}; };
typedef struct CTRL_ThreadRegCacheSlot CTRL_ThreadRegCacheSlot; typedef struct CTRL_ThreadRegCacheSlot CTRL_ThreadRegCacheSlot;
@@ -483,9 +485,6 @@ struct CTRL_State
{ {
Arena *arena; Arena *arena;
CTRL_WakeupFunctionType *wakeup_hook; CTRL_WakeupFunctionType *wakeup_hook;
U64 run_idx;
U64 memgen_idx;
U64 reggen_idx;
// rjf: name -> register/alias hash tables for eval // rjf: name -> register/alias hash tables for eval
EVAL_String2NumMap arch_string2reg_tables[Architecture_COUNT]; EVAL_String2NumMap arch_string2reg_tables[Architecture_COUNT];
@@ -672,10 +671,10 @@ internal void ctrl_halt(void);
//////////////////////////////// ////////////////////////////////
//~ rjf: Shared Accessor Functions //~ rjf: Shared Accessor Functions
//- rjf: run indices //- rjf: generation counters
internal U64 ctrl_run_idx(void); internal U64 ctrl_run_gen(void);
internal U64 ctrl_memgen_idx(void); internal U64 ctrl_mem_gen(void);
internal U64 ctrl_reggen_idx(void); internal U64 ctrl_reg_gen(void);
//- rjf: name -> register/alias hash tables, for eval //- rjf: name -> register/alias hash tables, for eval
internal EVAL_String2NumMap *ctrl_string2reg_from_arch(Architecture arch); internal EVAL_String2NumMap *ctrl_string2reg_from_arch(Architecture arch);
+7
View File
@@ -165,6 +165,13 @@ internal DMN_Event *dmn_event_list_push(Arena *arena, DMN_EventList *list);
internal void dmn_init(void); internal void dmn_init(void);
////////////////////////////////
//~ rjf: @dmn_os_hooks Run/Memory/Register Counters
internal U64 dmn_run_gen(void);
internal U64 dmn_mem_gen(void);
internal U64 dmn_reg_gen(void);
//////////////////////////////// ////////////////////////////////
//~ rjf: @dmn_os_hooks Running/Halting (Implemented Per-OS) //~ rjf: @dmn_os_hooks Running/Halting (Implemented Per-OS)
+29 -1
View File
@@ -343,6 +343,7 @@ dmn_w32_process_write(HANDLE process, Rng1U64 range, void *src)
ptr += actual_write; ptr += actual_write;
cursor += actual_write; cursor += actual_write;
} }
ins_atomic_u64_inc_eval(&dmn_w32_shared->mem_gen);
return result; return result;
} }
@@ -953,6 +954,7 @@ dmn_w32_thread_write_reg_block(Architecture arch, HANDLE thread, void *reg_block
//- rjf: bad context -> abort //- rjf: bad context -> abort
if(ctx == 0) if(ctx == 0)
{ {
DWORD error = GetLastError();
break; break;
} }
@@ -1043,6 +1045,7 @@ dmn_w32_thread_write_reg_block(Architecture arch, HANDLE thread, void *reg_block
scratch_end(scratch); scratch_end(scratch);
}break; }break;
} }
ins_atomic_u64_inc_eval(&dmn_w32_shared->reg_gen);
return result; return result;
} }
@@ -1104,6 +1107,30 @@ dmn_init(void)
} }
} }
////////////////////////////////
//~ rjf: @dmn_os_hooks Run/Memory/Register Counters
internal U64
dmn_run_gen(void)
{
U64 result = ins_atomic_u64_eval(&dmn_w32_shared->run_gen);
return result;
}
internal U64
dmn_mem_gen(void)
{
U64 result = ins_atomic_u64_eval(&dmn_w32_shared->mem_gen);
return result;
}
internal U64
dmn_reg_gen(void)
{
U64 result = ins_atomic_u64_eval(&dmn_w32_shared->reg_gen);
return result;
}
//////////////////////////////// ////////////////////////////////
//~ rjf: @dmn_os_hooks Running/Halting (Implemented Per-OS) //~ rjf: @dmn_os_hooks Running/Halting (Implemented Per-OS)
@@ -1366,6 +1393,7 @@ dmn_run(Arena *arena, DMN_RunCtrls *ctrls)
dmn_w32_shared->resume_pid = evt.dwProcessId; dmn_w32_shared->resume_pid = evt.dwProcessId;
dmn_w32_shared->resume_tid = evt.dwThreadId; dmn_w32_shared->resume_tid = evt.dwThreadId;
} }
ins_atomic_u64_inc_eval(&dmn_w32_shared->run_gen);
} }
} }
@@ -1776,7 +1804,7 @@ dmn_run(Arena *arena, DMN_RunCtrls *ctrls)
{ {
post_trap_rip = regs_rip_from_arch_block(thread->arch, regs_block); post_trap_rip = regs_rip_from_arch_block(thread->arch, regs_block);
regs_arch_block_write_rip(thread->arch, regs_block, instruction_pointer); regs_arch_block_write_rip(thread->arch, regs_block, instruction_pointer);
dmn_w32_thread_write_reg_block(thread->arch, thread, regs_block); dmn_w32_thread_write_reg_block(thread->arch, thread->handle, regs_block);
} }
temp_end(temp); temp_end(temp);
} }
+5
View File
@@ -194,6 +194,11 @@ struct DMN_W32_Shared
Arena *arena; Arena *arena;
String8List env_strings; String8List env_strings;
// rjf: run/mem/reg gens
U64 run_gen;
U64 mem_gen;
U64 reg_gen;
// rjf: detaching info // rjf: detaching info
Arena *detach_arena; Arena *detach_arena;
DMN_HandleList detach_processes; DMN_HandleList detach_processes;
+19 -16
View File
@@ -2895,7 +2895,7 @@ df_trap_net_from_thread__step_over_line(Arena *arena, DF_Entity *thread)
String8 machine_code = {0}; String8 machine_code = {0};
if(good_line_info) if(good_line_info)
{ {
CTRL_ProcessMemorySlice machine_code_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, line_vaddr_rng, os_now_microseconds()+5000); CTRL_ProcessMemorySlice machine_code_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, line_vaddr_rng, os_now_microseconds()+50000);
machine_code = machine_code_slice.data; machine_code = machine_code_slice.data;
} }
@@ -3656,7 +3656,7 @@ internal CTRL_Unwind
df_push_unwind_from_thread(Arena *arena, DF_Entity *thread) df_push_unwind_from_thread(Arena *arena, DF_Entity *thread)
{ {
DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process); DF_Entity *process = df_entity_ancestor_from_kind(thread, DF_EntityKind_Process);
CTRL_Unwind unwind = ctrl_unwind_from_thread(arena, df_state->ctrl_entity_store, thread->ctrl_machine_id, thread->ctrl_handle, 0); CTRL_Unwind unwind = ctrl_unwind_from_thread(arena, df_state->ctrl_entity_store, thread->ctrl_machine_id, thread->ctrl_handle, os_now_microseconds()+5000);
return unwind; return unwind;
} }
@@ -6545,8 +6545,8 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt)
Temp scratch = scratch_begin(&arena, 1); Temp scratch = scratch_begin(&arena, 1);
//- rjf: grab next reggen/memgen //- rjf: grab next reggen/memgen
U64 new_memgen_idx = ctrl_memgen_idx(); U64 new_mem_gen = ctrl_mem_gen();
U64 new_reggen_idx = ctrl_reggen_idx(); U64 new_reg_gen = ctrl_reg_gen();
//- rjf: consume & process events //- rjf: consume & process events
CTRL_EventList events = ctrl_c2u_pop_events(scratch.arena); CTRL_EventList events = ctrl_c2u_pop_events(scratch.arena);
@@ -6908,8 +6908,8 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt)
} }
//- rjf: refresh unwind cache //- rjf: refresh unwind cache
if((df_state->unwind_cache_memgen_idx != new_memgen_idx || if((df_state->unwind_cache_memgen_idx != new_mem_gen ||
df_state->unwind_cache_reggen_idx != new_reggen_idx) && df_state->unwind_cache_reggen_idx != new_reg_gen) &&
!df_ctrl_targets_running()) ProfScope("per-thread unwind gather") !df_ctrl_targets_running()) ProfScope("per-thread unwind gather")
{ {
B32 good = 1; B32 good = 1;
@@ -6935,41 +6935,44 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt)
break; break;
} }
} }
df_state->unwind_cache_memgen_idx = new_memgen_idx; if(good)
df_state->unwind_cache_reggen_idx = new_reggen_idx; {
df_state->unwind_cache_memgen_idx = new_mem_gen;
df_state->unwind_cache_reggen_idx = new_reg_gen;
}
} }
//- rjf: clear tls base cache //- rjf: clear tls base cache
if((df_state->tls_base_cache_reggen_idx != new_reggen_idx || if((df_state->tls_base_cache_reggen_idx != new_reg_gen ||
df_state->tls_base_cache_memgen_idx != new_memgen_idx) && df_state->tls_base_cache_memgen_idx != new_mem_gen) &&
!df_ctrl_targets_running()) !df_ctrl_targets_running())
{ {
DF_RunTLSBaseCache *cache = &df_state->tls_base_cache; DF_RunTLSBaseCache *cache = &df_state->tls_base_cache;
arena_clear(cache->arena); arena_clear(cache->arena);
cache->slots_count = 0; cache->slots_count = 0;
cache->slots = 0; cache->slots = 0;
df_state->tls_base_cache_reggen_idx = new_reggen_idx; df_state->tls_base_cache_reggen_idx = new_reg_gen;
df_state->tls_base_cache_memgen_idx = new_memgen_idx; df_state->tls_base_cache_memgen_idx = new_mem_gen;
} }
//- rjf: clear locals cache //- rjf: clear locals cache
if(df_state->locals_cache_reggen_idx != new_reggen_idx && !df_ctrl_targets_running()) if(df_state->locals_cache_reggen_idx != new_reg_gen && !df_ctrl_targets_running())
{ {
DF_RunLocalsCache *cache = &df_state->locals_cache; DF_RunLocalsCache *cache = &df_state->locals_cache;
arena_clear(cache->arena); arena_clear(cache->arena);
cache->table_size = 0; cache->table_size = 0;
cache->table = 0; cache->table = 0;
df_state->locals_cache_reggen_idx = new_reggen_idx; df_state->locals_cache_reggen_idx = new_reg_gen;
} }
//- rjf: clear members cache //- rjf: clear members cache
if(df_state->member_cache_reggen_idx != new_reggen_idx && !df_ctrl_targets_running()) if(df_state->member_cache_reggen_idx != new_reg_gen && !df_ctrl_targets_running())
{ {
DF_RunLocalsCache *cache = &df_state->member_cache; DF_RunLocalsCache *cache = &df_state->member_cache;
arena_clear(cache->arena); arena_clear(cache->arena);
cache->table_size = 0; cache->table_size = 0;
cache->table = 0; cache->table = 0;
df_state->member_cache_reggen_idx = new_reggen_idx; df_state->member_cache_reggen_idx = new_reg_gen;
} }
scratch_end(scratch); scratch_end(scratch);
+2 -2
View File
@@ -3111,8 +3111,8 @@ df_window_update_and_render(Arena *arena, OS_EventList *events, DF_Window *ws, D
avg_ui_hash_chain_length = chain_length_sum / chain_count; avg_ui_hash_chain_length = chain_length_sum / chain_count;
} }
ui_labelf("Target Hz: %.2f", 1.f/df_dt()); ui_labelf("Target Hz: %.2f", 1.f/df_dt());
ui_labelf("Ctrl Run Index: %I64u", ctrl_run_idx()); ui_labelf("Ctrl Run Index: %I64u", ctrl_run_gen());
ui_labelf("Ctrl Mem Gen Index: %I64u", ctrl_memgen_idx()); ui_labelf("Ctrl Mem Gen Index: %I64u", ctrl_mem_gen());
ui_labelf("Window %p", window); ui_labelf("Window %p", window);
ui_set_next_pref_width(ui_children_sum(1)); ui_set_next_pref_width(ui_children_sum(1));
ui_set_next_pref_height(ui_children_sum(1)); ui_set_next_pref_height(ui_children_sum(1));
+3 -3
View File
@@ -565,7 +565,7 @@ DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(rgba)
Vec4F32 rgba = {0}; Vec4F32 rgba = {0};
Vec4F32 hsva = {0}; Vec4F32 hsva = {0};
{ {
if(state->memgen_idx >= ctrl_memgen_idx()) if(state->memgen_idx >= ctrl_mem_gen())
{ {
hsva = state->hsva; hsva = state->hsva;
rgba = rgba_from_hsva(hsva); rgba = rgba_from_hsva(hsva);
@@ -575,7 +575,7 @@ DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(rgba)
DF_Eval value_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, eval); DF_Eval value_eval = df_value_mode_eval_from_eval(parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, eval);
rgba = df_view_rule_hooks__rgba_from_eval(value_eval, parse_ctx->type_graph, parse_ctx->rdi, process); rgba = df_view_rule_hooks__rgba_from_eval(value_eval, parse_ctx->type_graph, parse_ctx->rdi, process);
state->hsva = hsva = hsva_from_rgba(rgba); state->hsva = hsva = hsva_from_rgba(rgba);
state->memgen_idx = ctrl_memgen_idx(); state->memgen_idx = ctrl_mem_gen();
} }
} }
Vec4F32 initial_hsva = hsva; Vec4F32 initial_hsva = hsva;
@@ -624,7 +624,7 @@ DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(rgba)
{ {
Vec4F32 rgba = rgba_from_hsva(hsva); Vec4F32 rgba = rgba_from_hsva(hsva);
df_view_rule_hooks__eval_commit_rgba(eval, parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, rgba); df_view_rule_hooks__eval_commit_rgba(eval, parse_ctx->type_graph, parse_ctx->rdi, ctrl_ctx, rgba);
state->memgen_idx = ctrl_memgen_idx(); state->memgen_idx = ctrl_mem_gen();
} }
//- rjf: commit possible edited value to state //- rjf: commit possible edited value to state
+1 -1
View File
@@ -7756,7 +7756,7 @@ DF_VIEW_UI_FUNCTION_DEF(Memory)
U8 *visible_memory = 0; U8 *visible_memory = 0;
{ {
Rng1U64 chunk_aligned_range_bytes = r1u64(AlignDownPow2(viz_range_bytes.min, KB(4)), AlignPow2(viz_range_bytes.max, KB(4))); Rng1U64 chunk_aligned_range_bytes = r1u64(AlignDownPow2(viz_range_bytes.min, KB(4)), AlignPow2(viz_range_bytes.max, KB(4)));
U64 current_memgen_idx = ctrl_memgen_idx(); U64 current_memgen_idx = ctrl_mem_gen();
B32 range_changed = (chunk_aligned_range_bytes.min != mv->last_viewed_memory_cache_range.min || B32 range_changed = (chunk_aligned_range_bytes.min != mv->last_viewed_memory_cache_range.min ||
chunk_aligned_range_bytes.max != mv->last_viewed_memory_cache_range.max); chunk_aligned_range_bytes.max != mv->last_viewed_memory_cache_range.max);
B32 mem_changed = (current_memgen_idx != mv->last_viewed_memory_cache_memgen_idx); B32 mem_changed = (current_memgen_idx != mv->last_viewed_memory_cache_memgen_idx);