ogl_beamforming

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

Commit: 760f017852a6e9b74fb03423147d2537fb3e8d67
Parent: e4584f464a510befc98aa167c205dbd970c8f950
Author: Randy Palamar
Date:   Sat, 10 Oct 2026 12:00:39 -0600

build/meta: use Expand to splat struct members

starting this thinking it would simplify some things but it really
isn't so just committing the tweaks and error messages.

Diffstat:
Mbeamformer.meta | 16++++++++--------
Mbuild.c | 74++++++++++++++++++++++++++++++++++++++++++++++----------------------------
2 files changed, 54 insertions(+), 36 deletions(-)

diff --git a/beamformer.meta b/beamformer.meta @@ -109,8 +109,8 @@ @Struct EmissionParameters { - [kind EmissionKind ] - [`` EmissionParametersUnion] + [kind EmissionKind] + @Union EmissionParametersUnion } @Library @Struct EmissionParameters @MATLAB(Emission) @Struct EmissionParameters @@ -152,7 +152,8 @@ [kind FilterKind ] [sampling_frequency F32 ] [complex B32 ] - [`` FilterParametersUnion] + + @Union FilterParametersUnion } @Library @Struct FilterParameters @MATLAB(Filter) @Struct FilterParameters @@ -198,17 +199,16 @@ @Struct Parameters { - [`` ParametersHead ] - [`` UIParameters ] - [`` ExtraParameters] + @Expand(ParametersHead) [`$(name)` `$(type)`] + @Expand(UIParameters) [`$(name)` `$(type)`] + @Expand(ExtraParameters) [`$(name)` `$(type)`] } @Library @Struct Parameters @MATLAB @Struct Parameters @Struct SimpleParameters { - - [`` Parameters 1 ] + @Expand(Parameters) [`$(name)` `$(type)` `$(elements)`] [channel_mapping S16 MaxChannelCount ] [sparse_elements S16 MaxEmissionsCount ] [transmit_receive_orientations U8 MaxEmissionsCount ] diff --git a/build.c b/build.c @@ -2614,9 +2614,11 @@ meta_pack_table_entity(MetaContext *ctx, MetaEntry *e, i64 entry_count, str8 nam table_id_index = 0; for (MetaEntry *row = scope.start; row != scope.one_past_last; row++) { - if (row->kind != MetaEntryKind_Array && - row->kind != MetaEntryKind_Expand && - row->kind != MetaEntryKind_String) + if ((row->kind != MetaEntryKind_Array && + row->kind != MetaEntryKind_Expand && + row->kind != MetaEntryKind_Union && + row->kind != MetaEntryKind_String) || + (row->kind == MetaEntryKind_Union && !structure)) { meta_entry_nesting_error(row, e->kind); } @@ -2635,6 +2637,18 @@ meta_pack_table_entity(MetaContext *ctx, MetaEntry *e, i64 entry_count, str8 nam entries.count = meta_entry_argument_expect(row + 1, 0, MetaEntryArgumentKind_Array).count; } + if (row->kind == MetaEntryKind_Union) { + if (row->argument_count > 1) { + const char *name = meta_entry_kind_strings[row->kind]; + meta_compiler_error_message(row->location, "invalid nested @%s: got: ", name); + meta_entry_print(row, 0, -1); + fprintf(stderr, " expected: '@%s %.*s' or '@%s(array_count) %.*s'\n", + name, (i32)row->name.length, row->name.data, name, (i32)row->name.length, row->name.data); + meta_error(); + } + entries.count = 2; + } + if (row->kind == MetaEntryKind_Array) entries.count = meta_entry_argument_expect(row, 0, MetaEntryArgumentKind_Array).count; @@ -2670,10 +2684,10 @@ meta_pack_table_entity(MetaContext *ctx, MetaEntry *e, i64 entry_count, str8 nam u32 row_index = 0; table_id_index = 0; for (MetaEntry *row = scope.start; row != scope.one_past_last; row++) { - u64 argument_count = row->arguments ? row->arguments->count : 1; - if (row->kind == MetaEntryKind_Expand) { + switch (row->kind) { + case MetaEntryKind_Expand:{ row++; - argument_count = row->arguments ? row->arguments->count : 1; + u64 argument_count = row->arguments ? row->arguments->count : 1; MetaEntity *table = ctx->entities.data + table_ids[table_id_index++]; @@ -2688,10 +2702,21 @@ meta_pack_table_entity(MetaContext *ctx, MetaEntry *e, i64 entry_count, str8 nam for (; row_index < working_row_index; row_index++) if (structure && argument_count == 2) - t->entries[2][row_index] = str8("1"); + t->entries[MetaStructField_Elements][row_index] = str8("1"); - } else { + }break; + + case MetaEntryKind_Union:{ + // NOTE(rnp): anonymous union (named union already covered by standard table syntax) + t->entries[MetaStructField_Name][row_index] = str8(""); + t->entries[MetaStructField_Type][row_index] = row->name; + t->entries[MetaStructField_Elements][row_index] = row->argument_count ? row->arguments->string + : str8("1"); + }break; + + default:{ str8 *fs = &row->name; + u64 argument_count = row->arguments ? row->arguments->count : 1; if (row->arguments) fs = row->arguments->strings; @@ -2701,8 +2726,9 @@ meta_pack_table_entity(MetaContext *ctx, MetaEntry *e, i64 entry_count, str8 nam // NOTE(rnp): if we are filling out a struct the array element count is optional // and defaults to 1. fill this out here for uniformity elsewhere in the code if (structure && argument_count == 2) - t->entries[2][row_index] = str8("1"); + t->entries[MetaStructField_Elements][row_index] = str8("1"); row_index++; + }break; } } } @@ -3413,36 +3439,29 @@ meta_push_struct_body(MetaContext *ctx, MetaprogramContext *m, MetaEntity *struc Temp scratch = temp_begin(m->scratch); - u32 flattened_member_count = 0; - + u32 max_member_count = 0; *da_push(m->scratch, &stack) = (struct stack_item){struct_entity, 0}; while (stack.count > 0) { stack.count--; MetaEntity *se = stack.data[stack.count].se; MetaStruct *s = ctx->struct_infos + se->table.struct_info_id; - u32 member = stack.data[stack.count].member_offset; + max_member_count = Max(s->info.member_count, max_member_count); + + u32 member = stack.data[stack.count].member_offset; while (member < s->info.member_count) { if (s->members[member].length == 0) { assert(s->member_flags[member] & MetaStructMemberFlag_ReferenceType); - MetaStruct *ss = ctx->struct_infos + ctx->entities.data[s->type_ids[member]].table.struct_info_id; - if (ss->info.flags & MetaStructFlag_Union) { - member++; - flattened_member_count++; - } else { - *da_push(ctx->scratch, &stack) = (struct stack_item){se, member + 1}; - *da_push(ctx->scratch, &stack) = (struct stack_item){ctx->entities.data + s->type_ids[member], 0}; - break; - } - } else { - member++; - flattened_member_count++; + *da_push(ctx->scratch, &stack) = (struct stack_item){se, member + 1}; + *da_push(ctx->scratch, &stack) = (struct stack_item){ctx->entities.data + s->type_ids[member], 0}; + break; } + member++; } } str8 *columns[2]; - columns[0] = push_array(m->scratch, str8, flattened_member_count); - columns[1] = push_array(m->scratch, str8, flattened_member_count); + columns[0] = push_array(m->scratch, str8, max_member_count); + columns[1] = push_array(m->scratch, str8, max_member_count); u32 row = 0, scope = 0; *da_push(m->scratch, &stack) = (struct stack_item){struct_entity, 0}; @@ -4735,8 +4754,7 @@ metagen_emit_helper_library_header(MetaContext *ctx, Arena *arena) } meta_end_scope(m, str8("} " META_NAMESPACE_UPPER), ctx->entity_names.data[ids[it]], str8(";\n")); }break; - case MetaEntityKind_Union:{ - }break; + case MetaEntityKind_Union:{}break; } }