ogl_beamforming

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

Commit: ce22647bfa37994f95ded2c956de91382e4081f5
Parent: c35e96bd48674a4bbb83720bfa5555d910e46c81
Author: Randy Palamar
Date:   Fri,  3 Oct 2025 13:16:52 -0600

meta: cleanup internal representation of shaders with a file

Diffstat:
Mbuild.c | 172+++++++++++++++++++++++++++++++++++--------------------------------------------
1 file changed, 75 insertions(+), 97 deletions(-)

diff --git a/build.c b/build.c @@ -5,7 +5,7 @@ * [ ]: refactor: merge pack_table and bake_parameters * [ ]: refactor: allow @Expand to come before the table definition * [x]: refactor: helper for appending expanded shader flags - * [ ]: refactor: "base" shaders should only be reloadable shaders + * [x]: refactor: "base" shaders should only be reloadable shaders * - internally when a shader with no file is encountered it should * not get pushed as a "base" shader. * [ ]: bug: column indicator for compile error is off @@ -1363,8 +1363,9 @@ typedef struct { MetaIDList global_flag_ids; MetaIDList global_enumeration_ids; MetaShaderBakeParameters *bake_parameters; - u32 base_name_id; + u32 name_id; u32 flag_list_id; + i32 base_shader_id; } MetaShader; DA_STRUCT(MetaShader, MetaShader); @@ -1586,21 +1587,24 @@ meta_pack_shader(MetaContext *ctx, MetaShaderGroup *sg, Arena scratch, MetaEntry { assert(entries[0].kind == MetaEntryKind_Shader); - MetaBaseShader *base_shader = da_push(ctx->arena, &ctx->base_shaders); - MetaShader *s = da_push(ctx->arena, &ctx->shaders); + MetaShader *s = da_push(ctx->arena, &ctx->shaders); *da_push(ctx->arena, &sg->shaders) = (u32)da_index(s, &ctx->shaders); { s8_list *flag_list = da_push(ctx->arena, &ctx->flags_for_shader); s->flag_list_id = (u32)da_index(flag_list, &ctx->flags_for_shader); } + s->name_id = meta_pack_shader_name(ctx, entries->name, entries->location); + s->base_shader_id = -1; - base_shader->shader = s; + MetaBaseShader *base_shader = 0; if (entries->argument_count > 1) { meta_entry_argument_expected(entries, s8("[file_name]")); } else if (entries->argument_count == 1) { + base_shader = da_push(ctx->arena, &ctx->base_shaders); base_shader->file = meta_entry_argument_expect(entries, 0, MetaEntryArgumentKind_String).string; + base_shader->shader = s; + s->base_shader_id = (i32)da_index(base_shader, &ctx->base_shaders); } - s->base_name_id = meta_pack_shader_name(ctx, entries->name, entries->location); i32 stack_items[32]; struct { i32 *data; iz capacity; iz count; } stack = {stack_items, countof(stack_items), 0}; @@ -1627,13 +1631,21 @@ meta_pack_shader(MetaContext *ctx, MetaShaderGroup *sg, Arena scratch, MetaEntry if (index != 0) { if (stack.count > 0 && entries[stack.data[stack.count - 1]].kind == MetaEntryKind_Shader) { if (ended->kind == MetaEntryKind_SubShader) { + if (!base_shader) { + meta_entry_error(ended, "invalid nesting: @%s in @%s\n" + "@%s only allowed in base shaders (shaders with a backing file)\n", + meta_entry_kind_strings[ended->kind], + meta_entry_kind_strings[MetaEntryKind_Shader], + meta_entry_kind_strings[ended->kind]); + } MetaShader *ss = da_push(ctx->arena, &ctx->shaders); u32 sid = (u32)da_index(ss, &ctx->shaders); *da_push(ctx->arena, &sg->shaders) = sid; *da_push(ctx->arena, &base_shader->sub_shaders) = sid; - ss->flag_list_id = s->flag_list_id; - ss->base_name_id = meta_pack_shader_name(ctx, ended->name, ended->location); + ss->flag_list_id = s->flag_list_id; + ss->base_shader_id = s->base_shader_id; + ss->name_id = meta_pack_shader_name(ctx, ended->name, ended->location); meta_commit_shader_flag(ctx, s->flag_list_id, ended->name, ended); in_sub_shader = 0; } @@ -1965,35 +1977,22 @@ meta_push_shader_reload_info(MetaprogramContext *m, MetaContext *ctx) // NOTE(rnp): reloadable infos meta_begin_scope(m, s8("read_only global BeamformerShaderKind beamformer_reloadable_shader_kinds[] = {")); for (iz shader = 0; shader < ctx->base_shaders.count; shader++) { - MetaBaseShader *bs = ctx->base_shaders.data + shader; - MetaShader *s = bs->shader; - - if (bs->file.len == 0) continue; - - s8 name = ctx->shader_names.data[s->base_name_id]; - meta_push_line(m, s8("BeamformerShaderKind_"), name, s8(",")); + MetaShader *s = ctx->base_shaders.data[shader].shader; + meta_push_line(m, s8("BeamformerShaderKind_"), ctx->shader_names.data[s->name_id], s8(",")); } meta_end_scope(m, s8("};\n")); meta_begin_scope(m, s8("read_only global s8 beamformer_reloadable_shader_files[] = {")); - for (iz shader = 0; shader < ctx->base_shaders.count; shader++) { - MetaBaseShader *bs = ctx->base_shaders.data + shader; - if (bs->file.len == 0) continue; - meta_push_line(m, s8("s8_comp(\""), bs->file, s8("\"),")); - } + for (iz shader = 0; shader < ctx->base_shaders.count; shader++) + meta_push_line(m, s8("s8_comp(\""), ctx->base_shaders.data[shader].file, s8("\"),")); meta_end_scope(m, s8("};\n")); { - i32 rolling_index = 0; meta_begin_scope(m, s8("read_only global i32 beamformer_shader_reloadable_index_by_shader[] = {")); - for (iz shader = 0; shader < ctx->base_shaders.count; shader++) { - MetaBaseShader *bs = ctx->base_shaders.data + shader; - i32 index = bs->file.len == 0 ? -1 : rolling_index++; - for (i32 sub_shader = -1; sub_shader < bs->sub_shaders.count; sub_shader++) { - meta_indent(m); - meta_push_i64(m, index); - meta_end_line(m, s8(",")); - } + for (iz shader = 0; shader < ctx->shaders.count; shader++) { + meta_indent(m); + meta_push_i64(m, ctx->shaders.data[shader].base_shader_id); + meta_end_line(m, s8(",")); } meta_end_scope(m, s8("};\n")); } @@ -2012,7 +2011,7 @@ meta_push_shader_reload_info(MetaprogramContext *m, MetaContext *ctx) /* TODO(rnp): store base shader list in a better format */ for (iz base_shader = 0; base_shader < ctx->base_shaders.count; base_shader++) { MetaBaseShader *bs = ctx->base_shaders.data + base_shader; - if (bs->file.len && bs->shader == s) { + if (bs->shader == s) { meta_indent(m); meta_push_u64(m, info_index++); meta_end_line(m, s8(",")); @@ -2040,8 +2039,6 @@ meta_push_shader_reload_info(MetaprogramContext *m, MetaContext *ctx) meta_begin_scope(m, s8("read_only global s8 *beamformer_shader_flag_strings[] = {")); for (iz shader = 0; shader < ctx->base_shaders.count; shader++) { - if (ctx->base_shaders.data[shader].file.len == 0) continue; - MetaShader *s = ctx->base_shaders.data[shader].shader; s8_list *flag_list = ctx->flags_for_shader.data + s->flag_list_id; @@ -2058,8 +2055,6 @@ meta_push_shader_reload_info(MetaprogramContext *m, MetaContext *ctx) meta_begin_scope(m, s8("read_only global u8 beamformer_shader_flag_strings_count[] = {")); for (iz shader = 0; shader < ctx->base_shaders.count; shader++) { - if (ctx->base_shaders.data[shader].file.len == 0) continue; - MetaShader *s = ctx->base_shaders.data[shader].shader; s8_list *flag_list = ctx->flags_for_shader.data + s->flag_list_id; @@ -2102,7 +2097,7 @@ metagen_emit_c_code(MetaContext *ctx, Arena arena) s8_list flag_list = ctx->flags_for_shader.data[s->flag_list_id]; if (flag_list.count) { s8 enum_name = push_s8_from_parts(&m->scratch, s8(""), s8("BeamformerShader"), - ctx->shader_names.data[s->base_name_id], s8("Flags")); + ctx->shader_names.data[s->name_id], s8("Flags")); metagen_push_c_flag_enum(m, m->scratch, enum_name, flag_list.data, flag_list.count); m->scratch = ctx->scratch; } @@ -2123,8 +2118,8 @@ metagen_emit_c_code(MetaContext *ctx, Arena arena) for (iz group = 0; group < ctx->shader_groups.count; group++) { MetaShaderGroup *sg = ctx->shader_groups.data + group; - s8 first_name = ctx->shader_names.data[ctx->shaders.data[sg->shaders.data[0]].base_name_id]; - s8 last_name = ctx->shader_names.data[ctx->shaders.data[sg->shaders.data[sg->shaders.count - 1]].base_name_id]; + s8 first_name = ctx->shader_names.data[ctx->shaders.data[sg->shaders.data[0]].name_id]; + s8 last_name = ctx->shader_names.data[ctx->shaders.data[sg->shaders.data[sg->shaders.count - 1]].name_id]; columns[0][3 * group + 0] = push_s8_from_parts(&m->scratch, s8(""), kind, s8("_"), sg->name, s8("First")); columns[1][3 * group + 0] = push_s8_from_parts(&m->scratch, s8(""), s8("= "), kind, s8("_"), first_name); @@ -2151,7 +2146,7 @@ metagen_emit_c_code(MetaContext *ctx, Arena arena) MetaShaderBakeParameters *b = ctx->shader_bake_parameters.data + bake; MetaShader *s = ctx->shaders.data + b->shader_id; s8 name = push_s8_from_parts(&m->scratch, s8(""), s8("BeamformerShader"), - ctx->shader_names.data[s->base_name_id], s8("BakeParameters")); + ctx->shader_names.data[s->name_id], s8("BakeParameters")); meta_begin_scope(m, s8("typedef union {")); meta_begin_scope(m, s8("struct {")); for (u32 entry = 0; entry < b->entry_count; entry++) { @@ -2177,89 +2172,72 @@ metagen_emit_c_code(MetaContext *ctx, Arena arena) meta_begin_scope(m, s8("read_only global i32 *beamformer_shader_header_vectors[] = {")); for (iz shader = 0; shader < ctx->base_shaders.count; shader++) { - MetaBaseShader *bs = ctx->base_shaders.data + shader; - MetaShader *s = bs->shader; - - if (bs->file.len) { - if (s->global_flag_ids.count || s->global_enumeration_ids.count) { - meta_begin_line(m, s8("(i32 []){")); - for (iz id = 0; id < s->global_flag_ids.count; id++) { - if (id != 0) meta_push(m, s8(", ")); - meta_push_u64(m, s->global_flag_ids.data[id]); - } - for (iz id = 0; id < s->global_enumeration_ids.count; id++) { - if (id != 0 || s->global_flag_ids.count) meta_push(m, s8(", ")); - meta_push_u64(m, s->global_enumeration_ids.data[id]); - } - meta_end_line(m, s8("},")); - } else { - meta_push_line(m, s8("0,")); + MetaShader *s = ctx->base_shaders.data[shader].shader; + if (s->global_flag_ids.count || s->global_enumeration_ids.count) { + meta_begin_line(m, s8("(i32 []){")); + for (iz id = 0; id < s->global_flag_ids.count; id++) { + if (id != 0) meta_push(m, s8(", ")); + meta_push_u64(m, s->global_flag_ids.data[id]); + } + for (iz id = 0; id < s->global_enumeration_ids.count; id++) { + if (id != 0 || s->global_flag_ids.count) meta_push(m, s8(", ")); + meta_push_u64(m, s->global_enumeration_ids.data[id]); } + meta_end_line(m, s8("},")); + } else { + meta_push_line(m, s8("0,")); } } meta_end_scope(m, s8("};\n")); meta_begin_scope(m, s8("read_only global i32 beamformer_shader_header_vector_lengths[] = {")); for (iz shader = 0; shader < ctx->base_shaders.count; shader++) { - MetaBaseShader *bs = ctx->base_shaders.data + shader; - MetaShader *s = bs->shader; - - if (bs->file.len) { - meta_indent(m); - meta_push_u64(m, (u64)s->global_enumeration_ids.count); - meta_end_line(m, s8(",")); - } + MetaShader *s = ctx->base_shaders.data[shader].shader; + meta_indent(m); + meta_push_u64(m, (u64)s->global_enumeration_ids.count); + meta_end_line(m, s8(",")); } meta_end_scope(m, s8("};\n")); meta_begin_scope(m, s8("read_only global s8 *beamformer_shader_bake_parameter_names[] = {")); for (iz shader = 0; shader < ctx->base_shaders.count; shader++) { - MetaBaseShader *bs = ctx->base_shaders.data + shader; - MetaShader *s = bs->shader; - if (bs->file.len) { - if (s->bake_parameters) { - meta_begin_scope(m, s8("(s8 []){")); - for (u32 index = 0; index < s->bake_parameters->entry_count; index++) - meta_push_line(m, s8("s8_comp(\""), s->bake_parameters->names_upper[index], s8("\"),")); - meta_end_scope(m, s8("},")); - } else { - meta_push_line(m, s8("0,")); - } + MetaShader *s = ctx->base_shaders.data[shader].shader; + if (s->bake_parameters) { + meta_begin_scope(m, s8("(s8 []){")); + for (u32 index = 0; index < s->bake_parameters->entry_count; index++) + meta_push_line(m, s8("s8_comp(\""), s->bake_parameters->names_upper[index], s8("\"),")); + meta_end_scope(m, s8("},")); + } else { + meta_push_line(m, s8("0,")); } } meta_end_scope(m, s8("};\n")); meta_begin_scope(m, s8("read_only global u8 *beamformer_shader_bake_parameter_is_float[] = {")); for (iz shader = 0; shader < ctx->base_shaders.count; shader++) { - MetaBaseShader *bs = ctx->base_shaders.data + shader; - MetaShader *s = bs->shader; - if (bs->file.len) { - if (s->bake_parameters) { - meta_begin_line(m, s8("(u8 []){")); - for (u32 index = 0; index < s->bake_parameters->entry_count; index++) { - if (index != 0) meta_push(m, s8(", ")); - meta_push(m, s->bake_parameters->floating_point[index] ? s8("1") : s8("0")); - } - meta_end_line(m, s8("},")); - } else { - meta_push_line(m, s8("0,")); + MetaShader *s = ctx->base_shaders.data[shader].shader; + if (s->bake_parameters) { + meta_begin_line(m, s8("(u8 []){")); + for (u32 index = 0; index < s->bake_parameters->entry_count; index++) { + if (index != 0) meta_push(m, s8(", ")); + meta_push(m, s->bake_parameters->floating_point[index] ? s8("1") : s8("0")); } + meta_end_line(m, s8("},")); + } else { + meta_push_line(m, s8("0,")); } } meta_end_scope(m, s8("};\n")); meta_begin_scope(m, s8("read_only global i32 beamformer_shader_bake_parameter_counts[] = {")); for (iz shader = 0; shader < ctx->base_shaders.count; shader++) { - MetaBaseShader *bs = ctx->base_shaders.data + shader; - MetaShader *s = bs->shader; - if (bs->file.len) { - if (s->bake_parameters) { - meta_indent(m); - meta_push_u64(m, s->bake_parameters->entry_count); - meta_end_line(m, s8(",")); - } else { - meta_push_line(m, s8("0,")); - } + MetaShader *s = ctx->base_shaders.data[shader].shader; + if (s->bake_parameters) { + meta_indent(m); + meta_push_u64(m, s->bake_parameters->entry_count); + meta_end_line(m, s8(",")); + } else { + meta_push_line(m, s8("0,")); } } meta_end_scope(m, s8("};\n")); @@ -2412,7 +2390,7 @@ metagen_emit_matlab_code(MetaContext *ctx, Arena arena) if (index != -1) { MetaShaderGroup *sg = ctx->shader_groups.data + index; /* TODO(rnp): this assumes that the shaders are sequential */ - s8 *names = ctx->shader_names.data + ctx->shaders.data[0].base_name_id; + s8 *names = ctx->shader_names.data + ctx->shaders.data[0].name_id; metagen_push_counted_enum_body(m, s8(""), s8(""), s8("("), s8(")"), names, sg->shaders.count); } else { build_log_failure("failed to find Compute shader group in meta info\n");