ogl_beamforming

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

Commit: 7d13b68104f01786265c0ed6e1fabadb5200c5fe
Parent: 1253f462386fa9df517454a58f714933718e6411
Author: Randy Palamar
Date:   Mon, 27 Jul 2026 18:53:00 -0700

ui: add compile flags to shader parameter listing

Diffstat:
Mbeamformer_core.c | 4++++
Mbuild.c | 31+++++++++++++++++++++++++++++++
Mgenerated/beamformer.c | 32++++++++++++++++++++++++++++++++
Mui.c | 12++++++++++--
4 files changed, 77 insertions(+), 2 deletions(-)

diff --git a/beamformer_core.c b/beamformer_core.c @@ -588,6 +588,10 @@ plan_compute_pipeline(BeamformerComputePlan *cp, BeamformerParameterBlock *pb, A } } + // NOTE(rnp): ensure last node descriptor gets proper values for output data kind + if (graph.last->output_data_kind == BeamformerDataKind_Count) + graph.last->output_data_kind = graph.last->input_data_kind; + f32 time_offset = pb->parameters.time_offset; u32 subgroup_size = vk_gpu_info()->subgroup_size; diff --git a/build.c b/build.c @@ -4197,6 +4197,37 @@ metagen_emit_c_code(MetaContext *ctx, Arena arena) } if (ctx->base_shader_count) + DeferLoop(meta_begin_scope(m, str8("read_only global str8 *" META_NAMESPACE_LOWER "_shader_compile_flag_names[] = {")), + meta_end_scope(m, str8("};\n"))) + { + for (da_count bs = 0; bs < ctx->base_shader_count; bs++) { + da_count id = ctx->base_shader_ids[bs]; + MetaEntity *e = ctx->entities.data + id; + MetaEntityID fid = meta_entity_first_child_of_kind(ctx, e, MetaEntityKind_Flags); + if (fid.value != 0) { + MetaEntity *flags = meta_entity(ctx, fid); + metagen_emit_c_str8_list(m, flags->table.entries[MetaStructField_Name], flags->table.entry_count); + } else { + meta_push_line(m, str8("0,")); + } + } + } + + if (ctx->base_shader_count) + DeferLoop(meta_begin_scope(m, str8("read_only global u8 " META_NAMESPACE_LOWER "_shader_compile_flag_counts[] = {")), + meta_end_scope(m, str8("};\n"))) + { + for (da_count bs = 0; bs < ctx->base_shader_count; bs++) { + da_count id = ctx->base_shader_ids[bs]; + MetaEntity *e = ctx->entities.data + id; + MetaEntityID fid = meta_entity_first_child_of_kind(ctx, e, MetaEntityKind_Flags); + meta_indent(m); + meta_push_u64(m, ctx->entities.data[fid.value].table.entry_count); + meta_end_line(m, str8(",")); + } + } + + if (ctx->base_shader_count) DeferLoop(meta_begin_scope(m, str8("read_only global str8 *" META_NAMESPACE_LOWER "_shader_bake_parameter_names[] = {")), meta_end_scope(m, str8("};\n"))) { diff --git a/generated/beamformer.c b/generated/beamformer.c @@ -952,6 +952,38 @@ read_only global i32 beamformer_shader_header_vector_lengths[] = { 1, }; +read_only global str8 *beamformer_shader_compile_flag_names[] = { + (str8 []){ + str8_comp("CooperativeMatrix"), + }, + (str8 []){ + str8_comp("ComplexFilter"), + str8_comp("Demodulate"), + }, + (str8 []){ + str8_comp("CoherencyWeighting"), + }, + 0, + 0, + 0, + (str8 []){ + str8_comp("Deinterleave"), + str8_comp("Interleave"), + }, + 0, +}; + +read_only global u8 beamformer_shader_compile_flag_counts[] = { + 1, + 2, + 1, + 0, + 0, + 0, + 2, + 0, +}; + read_only global str8 *beamformer_shader_bake_parameter_names[] = { (str8 []){ str8_comp("UseSharedMemory"), diff --git a/ui.c b/ui.c @@ -1,6 +1,5 @@ /* See LICENSE for license details. */ /* TODO(rnp): - * [ ]: pretty print compile flags in shader bake parameter lister * [ ]: bug: nil nodes break hot reloading * - only one that matters is ui_node_nil, for now maybe just put it into ui_context (won't be read_only of course) * [ ]: bug: flickering x-scroll bar on switch from ComputeBarGraph to other @@ -3282,7 +3281,6 @@ ui_build_compute_stats(BeamformerComputePlan *cp, f32 broken_shader_t, Beamforme UIPrefWidth(ui_text_dim(1.f, 1.f)) UIFontSize(24.f) { - // TODO(rnp): pretty print the extra compile flags field BeamformerShaderDescriptor *sd = cp->shader_descriptors + it; UIParent(left) ui_label(str8("Layout")); UIParent(right) ui_labelf("{%u, %u, %u}###layout", sd->layout.x, sd->layout.y, sd->layout.z); @@ -3297,6 +3295,16 @@ ui_build_compute_stats(BeamformerComputePlan *cp, f32 broken_shader_t, Beamforme beamformer_data_kind_str8[sd->output_data_kind], str8("##output_kind"))); + if (beamformer_shader_compile_flag_counts[reloadable_index]) + for EachIndex(beamformer_shader_compile_flag_counts[reloadable_index], bit) { + str8 *flags = beamformer_shader_compile_flag_names[reloadable_index]; + b32 set = sd->compile_flags & (1u << bit); + UIParent(left) ui_label(flags[bit]); + UIParent(right) ui_label(push_str8_from_parts(ui_build_arena(), str8(""), + set ? str8("True") : str8("False"), + str8("##"), flags[bit])); + } + i32 struct_id = beamformer_base_shader_to_bake_struct_id[reloadable_index]; if (struct_id != -1) { str8 *names = beamformer_shader_bake_parameter_names[reloadable_index];