ogl_beamforming

Ultrasound Beamforming Implemented with OpenGL
git clone anongit@rnpnr.xyz:ogl_beamforming.git
Log | Files | Refs | Feed | Submodules | README | LICENSE

Commit: e02e26c0454bb28a59675ab7e812d99d1c9e4c72
Parent: 39b2d73eaaa13b7475bd1dc07b62040f789a6338
Author: Randy Palamar
Date:   Sat, 13 Sep 2025 15:01:02 -0600

build: meta: simplify shader local flag packing

No need for these to be stored in an array when they just get ored
togethor at the end anyways

Diffstat:
Mbuild.c | 104+++++++++++++++++++++++++++++++++++++------------------------------------------
1 file changed, 49 insertions(+), 55 deletions(-)

diff --git a/build.c b/build.c @@ -1256,9 +1256,8 @@ typedef struct { typedef struct { u32 *global_flags; - u8 *local_flags; - u8 global_flags_count; - u8 local_flags_count; + u16 local_flags; + u16 global_flags_count; } MetaShaderPermutation; DA_STRUCT(MetaShaderPermutation, MetaShaderPermutation); @@ -1307,6 +1306,41 @@ typedef struct { MetaShaderDescriptor *shader_descriptors; } MetaContext; + +function u32 +metagen_pack_permutation(MetaContext *ctx, MetaEnumeration e) +{ + u32 result = ((u32)(e.kind & 0xFFFFu) << 16u) | (u32)(e.variation & 0xFFFFu); + return result; +} + +function MetaEnumeration +metagen_unpack_permutation(MetaContext *ctx, u32 packed) +{ + MetaEnumeration result; + result.kind = (iz)(packed >> 16u); + result.variation = (iz)(packed & 0xFFFFu); + assert(result.kind < ctx->enumeration_kinds.count); + assert(result.variation < ctx->enumeration_members.data[result.kind].count); + return result; +} + +function s8 +metagen_permutation_kind(MetaContext *ctx, u32 packed) +{ + MetaEnumeration p = metagen_unpack_permutation(ctx, packed); + s8 result = ctx->enumeration_kinds.data[p.kind]; + return result; +} + +function s8 +metagen_permutation_variation(MetaContext *ctx, u32 packed) +{ + MetaEnumeration p = metagen_unpack_permutation(ctx, packed); + s8 result = ctx->enumeration_members.data[p.kind].data[p.variation]; + return result; +} + function iz meta_lookup_string_slow(s8_list *sv, s8 s) { @@ -1412,12 +1446,10 @@ typedef struct { function void meta_pack_shader_permutation(MetaContext *ctx, MetaShaderPermutation *sp, MetaShader *base_shader, - u32 local_flags, MetaShaderPermutationStack *stack, MetaEntry *last, - u32 frame_cursor) + MetaShaderPermutationStack *stack, MetaEntry *last, u32 frame_cursor) { //////////////////////////////////// // NOTE: fill ids from up the stack - u32 local_flag_index = 0; u32 global_flag_index = 0; for (iz i = 0; i < stack->count; i++) { MetaShaderPermutationStackFrame *f = stack->data + i; @@ -1434,7 +1466,7 @@ meta_pack_shader_permutation(MetaContext *ctx, MetaShaderPermutation *sp, MetaSh } f->permutation_id = packed; } - sp->local_flags[local_flag_index++] = (u8)f->permutation_id; + sp->local_flags |= (u8)f->permutation_id; }break; case MetaEntryKind_Permute:{ if (f->permutation_id == U32_MAX) { @@ -1453,18 +1485,16 @@ meta_pack_shader_permutation(MetaContext *ctx, MetaShaderPermutation *sp, MetaSh MetaEntryArgument *a = last->arguments; switch (last->kind) { case MetaEntryKind_PermuteFlags:{ - u32 packed = local_flags; - u32 test = frame_cursor; + u32 packed = 0, test = frame_cursor; for EachBit(test, flag) { u32 flag_index = meta_commit_shader_flag(ctx, base_shader->flag_list_id, a->strings[flag], last); packed |= (1u << flag_index); } - sp->local_flags[local_flag_index++] = (u8)packed; + sp->local_flags |= (u8)packed; }break; case MetaEntryKind_Permute:{ MetaEnumeration p = meta_commit_enumeration(ctx, a[0].string, a[1].strings[frame_cursor]); - u32 packed = ((u32)(p.kind & 0xFFFFu) << 16) | (u32)(p.variation & 0xFFFFu); - sp->global_flags[global_flag_index++] = packed; + sp->global_flags[global_flag_index++] = metagen_pack_permutation(ctx, p); meta_intern_id(ctx, &base_shader->global_flag_ids, (u32)p.kind); }break; InvalidDefaultCase; @@ -1478,12 +1508,10 @@ meta_pop_and_pack_shader_permutations(MetaContext *ctx, MetaShader *base_shader, assert(stack->count > 0); u32 global_flag_count = 0; - u32 local_flag_count = 0; - for (iz i = 0; i < stack->count; i++) { switch (stack->base_entry[stack->data[i].entry_id].kind) { - case MetaEntryKind_PermuteFlags:{ local_flag_count++; }break; - case MetaEntryKind_Permute:{ global_flag_count++; }break; + case MetaEntryKind_PermuteFlags:{}break; + case MetaEntryKind_Permute:{ global_flag_count++; }break; InvalidDefaultCase; } } @@ -1491,14 +1519,13 @@ meta_pop_and_pack_shader_permutations(MetaContext *ctx, MetaShader *base_shader, MetaShaderPermutationStackFrame *f = stack->data + (--stack->count); MetaEntry *last = stack->base_entry + f->entry_id; assert(f->cursor.current == 0); - for (u32 cursor = 0; cursor < f->cursor.target; cursor++) { + for (; f->cursor.current < f->cursor.target; f->cursor.current++) { MetaShaderPermutation *sp = da_push(ctx->arena, &base_shader->permutations); sp->global_flags_count = (u8)global_flag_count; - sp->local_flags_count = (u8)local_flag_count; sp->global_flags = push_array(ctx->arena, typeof(*sp->global_flags), global_flag_count); - sp->local_flags = push_array(ctx->arena, typeof(*sp->local_flags), local_flag_count); + sp->local_flags = (u16)local_flags; - meta_pack_shader_permutation(ctx, sp, base_shader, local_flags, stack, last, cursor); + meta_pack_shader_permutation(ctx, sp, base_shader, stack, last, f->cursor.current); } } @@ -1659,33 +1686,6 @@ meta_pack_shader(MetaContext *ctx, MetaShaderGroup *sg, Arena scratch, MetaEntry return result; } -function MetaEnumeration -metagen_unpack_permutation(MetaContext *ctx, u32 packed) -{ - MetaEnumeration result; - result.kind = (iz)(packed >> 16u); - result.variation = (iz)(packed & 0xFFFFu); - assert(result.kind < ctx->enumeration_kinds.count); - assert(result.variation < ctx->enumeration_members.data[result.kind].count); - return result; -} - -function s8 -metagen_permutation_kind(MetaContext *ctx, u32 packed) -{ - MetaEnumeration p = metagen_unpack_permutation(ctx, packed); - s8 result = ctx->enumeration_kinds.data[p.kind]; - return result; -} - -function s8 -metagen_permutation_variation(MetaContext *ctx, u32 packed) -{ - MetaEnumeration p = metagen_unpack_permutation(ctx, packed); - s8 result = ctx->enumeration_members.data[p.kind].data[p.variation]; - return result; -} - function void metagen_push_table(MetaprogramContext *m, Arena scratch, s8 row_start, s8 row_end, s8 **column_strings, uz rows, uz columns) @@ -1779,14 +1779,9 @@ metagen_push_shader_derivative_vectors(MetaContext *ctx, MetaprogramContext *m, for (i32 id = p->global_flags_count; id < sub_field_count; id++) meta_push(m, s8(", -1")); - // NOTE(rnp): local flag names if (has_local_flags) { - u64 local_flags = 0; - for (u8 id = 0; id < p->local_flags_count; id++) - local_flags |= p->local_flags[id]; - meta_push(m, s8(", 0x")); - meta_push_u64_hex(m, local_flags); + meta_push_u64_hex(m, p->local_flags); } meta_end_line(m, s8("},")); } @@ -2435,8 +2430,7 @@ metagen_load_context(Arena *arena) MetaShader *s = ctx->shaders.data + shader; MetaShaderDescriptor *sd = ctx->shader_descriptors + shader; - for (iz perm = 0; perm < s->permutations.count; perm++) - sd->has_local_flags |= s->permutations.data[perm].local_flags_count != 0; + sd->has_local_flags = ctx->flags_for_shader.data[s->flag_list_id].count > 0; sd->sub_field_count = (i32)s->global_flag_ids.count; sd->first_match_vector_index = match_vectors_count; match_vectors_count += (i32)s->permutations.count;