p2r: hoist comp unit contributions bucketing out from per-unit path

This commit is contained in:
Ryan Fleury
2025-06-04 13:23:56 -07:00
parent 0512b61d95
commit 3e1bc21f95
5 changed files with 142 additions and 487 deletions
+41 -17
View File
@@ -439,6 +439,27 @@ rdim_rng1u64_list_push(RDIM_Arena *arena, RDIM_Rng1U64List *list, RDIM_Rng1U64 r
}
}
RDI_PROC void
rdim_rng1u64_chunk_list_push(RDIM_Arena *arena, RDIM_Rng1U64ChunkList *list, RDI_U64 chunk_cap, RDIM_Rng1U64 r)
{
RDIM_Rng1U64ChunkNode *n = list->last;
if(n == 0 || n->count >= n->cap)
{
n = rdim_push_array(arena, RDIM_Rng1U64ChunkNode, 1);
RDIM_SLLQueuePush(list->first, list->last, n);
n->cap = chunk_cap;
n->v = rdim_push_array_no_zero(arena, RDIM_Rng1U64, n->cap);
list->chunk_count += 1;
}
n->v[n->count] = r;
n->count += 1;
list->total_count += 1;
if(list->total_count == 1 || r.min < list->min)
{
list->min = r.min;
}
}
////////////////////////////////
//~ Data Model
@@ -2767,7 +2788,7 @@ rdim_bake_unit_vmap(RDIM_Arena *arena, RDIM_UnitChunkList *units)
for(RDI_U64 idx = 0; idx < n->count; idx += 1)
{
RDIM_Unit *unit = &n->v[idx];
voff_range_count += unit->voff_ranges.count;
voff_range_count += unit->voff_ranges.total_count;
}
}
@@ -2788,24 +2809,27 @@ rdim_bake_unit_vmap(RDIM_Arena *arena, RDIM_UnitChunkList *units)
for(RDI_U64 idx = 0; idx < unit_chunk_n->count; idx += 1)
{
RDIM_Unit *unit = &unit_chunk_n->v[idx];
for(RDIM_Rng1U64Node *n = unit->voff_ranges.first; n != 0; n = n->next)
for(RDIM_Rng1U64ChunkNode *n = unit->voff_ranges.first; n != 0; n = n->next)
{
RDIM_Rng1U64 range = n->v;
if(range.min < range.max)
for(RDI_U64 chunk_idx = 0; chunk_idx < n->count; chunk_idx += 1)
{
key_ptr->key = range.min;
key_ptr->val = marker_ptr;
marker_ptr->idx = unit_idx;
marker_ptr->begin_range = 1;
key_ptr += 1;
marker_ptr += 1;
key_ptr->key = range.max;
key_ptr->val = marker_ptr;
marker_ptr->idx = unit_idx;
marker_ptr->begin_range = 0;
key_ptr += 1;
marker_ptr += 1;
RDIM_Rng1U64 range = n->v[chunk_idx];
if(range.min < range.max)
{
key_ptr->key = range.min;
key_ptr->val = marker_ptr;
marker_ptr->idx = unit_idx;
marker_ptr->begin_range = 1;
key_ptr += 1;
marker_ptr += 1;
key_ptr->key = range.max;
key_ptr->val = marker_ptr;
marker_ptr->idx = unit_idx;
marker_ptr->begin_range = 0;
key_ptr += 1;
marker_ptr += 1;
}
}
}
unit_idx += 1;
+22 -2
View File
@@ -337,6 +337,25 @@ struct RDIM_Rng1U64List
RDI_U64 min;
};
typedef struct RDIM_Rng1U64ChunkNode RDIM_Rng1U64ChunkNode;
struct RDIM_Rng1U64ChunkNode
{
RDIM_Rng1U64ChunkNode *next;
RDIM_Rng1U64 *v;
RDI_U64 count;
RDI_U64 cap;
};
typedef struct RDIM_Rng1U64ChunkList RDIM_Rng1U64ChunkList;
struct RDIM_Rng1U64ChunkList
{
RDIM_Rng1U64ChunkNode *first;
RDIM_Rng1U64ChunkNode *last;
RDI_U64 chunk_count;
RDI_U64 total_count;
RDI_U64 min;
};
//- rjf: u64 -> pointer map
typedef struct RDIM_U64ToPtrNode RDIM_U64ToPtrNode;
@@ -570,7 +589,7 @@ struct RDIM_Unit
RDIM_String8 build_path;
RDI_Language language;
RDIM_LineTable *line_table;
RDIM_Rng1U64List voff_ranges;
RDIM_Rng1U64ChunkList voff_ranges;
};
typedef struct RDIM_UnitChunkNode RDIM_UnitChunkNode;
@@ -1362,8 +1381,9 @@ RDI_PROC RDIM_String8 rdim_str8_list_join(RDIM_Arena *arena, RDIM_String8List *l
//- rjf: sortable range sorting
RDI_PROC RDIM_SortKey *rdim_sort_key_array(RDIM_Arena *arena, RDIM_SortKey *keys, RDI_U64 count);
//- rjf: rng1u64 list
//- rjf: rng1u64 lists
RDI_PROC void rdim_rng1u64_list_push(RDIM_Arena *arena, RDIM_Rng1U64List *list, RDIM_Rng1U64 r);
RDI_PROC void rdim_rng1u64_chunk_list_push(RDIM_Arena *arena, RDIM_Rng1U64ChunkList *list, RDI_U64 chunk_cap, RDIM_Rng1U64 r);
////////////////////////////////
//~ Data Model