ogl_beamforming

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

Commit: 0444e0c6c0c6ea258c44621d2bbe31f2e4ba91a3
Parent: d54d9f5e5d79e35c312b8145dd3986e557b3faaf
Author: Randy Palamar
Date:   Wed, 22 Jul 2026 06:10:00 -0700

core: move live imaging struct/flags into meta code

Diffstat:
Mbeamformer.meta | 33+++++++++++++++++++++++++++++++++
Mbeamformer_parameters.h | 27---------------------------
Mbeamformer_shared_memory.c | 4----
Mbuild.c | 53++++++++++++++++++++---------------------------------
Mgenerated/beamformer.meta.c | 34++++++++++++++++++++++++++++++++++
5 files changed, 87 insertions(+), 64 deletions(-)

diff --git a/beamformer.meta b/beamformer.meta @@ -231,6 +231,39 @@ @Library @Struct SimpleParameters @MATLAB @Struct SimpleParameters +@Flags LiveImagingDirtyFlags +{ + ImagePlaneOffsets + TransmitPower + TGCControlPoints + SaveData + SaveNameTag + StopImaging + AcquisitionKind +} + +// NOTE(rnp): we have this other name in MATLAB for some reason +@Enumeration LiveFeedbackFlags +{ + @Expand(LiveImagingDirtyFlags) `$(name)` +} + +@Struct LiveImagingParameters +{ + [active U32 1] + [save_enabled U32 1] + [save_active U32 1] + [acquisition_kind U32 1] + [acquisition_kind_enabled_flags U64 1] + [transmit_power F32 1] + [image_plane_offsets F32 #ViewPlaneTag] + [tgc_control_points F32 8] + [save_name_tag_length S32 1] + [save_name_tag U8 128] +} +@Library @Struct LiveImagingParameters +@MATLAB @Struct LiveImagingParameters + @Struct DASArrayParameters { [focal_vectors V2 MaxChannelCount] diff --git a/beamformer_parameters.h b/beamformer_parameters.h @@ -16,30 +16,3 @@ typedef struct { float times[32][BeamformerMaxComputeShaderStages]; float rf_time_deltas[32]; } BeamformerComputeStatsTable; - -#define BEAMFORMER_LIVE_IMAGING_DIRTY_FLAG_LIST \ - X(ImagePlaneOffsets, 0) \ - X(TransmitPower, 1) \ - X(TGCControlPoints, 2) \ - X(SaveData, 3) \ - X(SaveNameTag, 4) \ - X(StopImaging, 5) \ - X(AcquisitionKind, 6) \ - -/* NOTE(rnp): if this exceeds 32 you need to fix the flag handling code */ - -#define BEAMFORMER_LIVE_IMAGING_PARAMETERS_LIST \ - X(active, uint32_t, , 1) \ - X(save_enabled, uint32_t, , 1) \ - X(save_active, uint32_t, , 1) \ - X(acquisition_kind, uint32_t, , 1) \ - X(acquisition_kind_enabled_flags, uint64_t, , 1) \ - X(transmit_power, float, , 1) \ - X(image_plane_offsets, float, [BeamformerViewPlaneTag_Count], BeamformerViewPlaneTag_Count) \ - X(tgc_control_points, float, [8], 8) \ - X(save_name_tag_length, int32_t, , 1) \ - X(save_name_tag, char, [128], 128) - -#define X(name, type, size, ...) type name size; -typedef struct {BEAMFORMER_LIVE_IMAGING_PARAMETERS_LIST} BeamformerLiveImagingParameters; -#undef X diff --git a/beamformer_shared_memory.c b/beamformer_shared_memory.c @@ -62,10 +62,6 @@ typedef struct { BeamformWork work_items[1 << 6]; } BeamformWorkQueue; -#define X(name, id) BeamformerLiveImagingDirtyFlags_##name = (1 << id), -typedef enum {BEAMFORMER_LIVE_IMAGING_DIRTY_FLAG_LIST} BeamformerLiveImagingDirtyFlags; -#undef X - #define BEAMFORMER_PARAMETER_BLOCK_REGION_LIST \ X(ComputePipeline, pipeline) \ X(ChannelMapping, channel_mapping) \ diff --git a/build.c b/build.c @@ -20,10 +20,6 @@ #include <setjmp.h> #include <stdio.h> -#define BeamformerMaxComputeShaderStages 1 -#define BeamformerViewPlaneTag_Count 1 -#include "beamformer_parameters.h" - global char *g_argv0; #define META_NAMESPACE_UPPER "Beamformer" @@ -582,7 +578,7 @@ function void check_rebuild_self(Arena arena, i32 argc, char *argv[]) { char *binary = shift(argv, argc); - if (needs_rebuild(binary, __FILE__, "os_win32.c", "os_linux.c", "util.c", "util.h", "beamformer_parameters.h")) { + if (needs_rebuild(binary, __FILE__, "os_win32.c", "os_linux.c", "util.c", "util.h")) { Stream name_buffer = arena_stream(arena); stream_append_s8s(&name_buffer, c_str_to_s8(binary), s8(".old")); char *old_name = (char *)arena_stream_commit_zero(&arena, &name_buffer).data; @@ -1028,14 +1024,6 @@ meta_push_(MetaprogramContext *m, s8 *items, iz count) meta_begin_matlab_class_2, \ meta_begin_matlab_class_1)(m, __VA_ARGS__) -function void -meta_push_matlab_property(MetaprogramContext *m, s8 name, u64 length, s8 kind) -{ - meta_begin_line(m, name, s8("(1,")); - meta_push_u64(m, (u64)length); - meta_end_line(m, s8(")"), kind.len > 0 ? s8(" ") : s8(""), kind); -} - function b32 meta_end_and_write_matlab(MetaprogramContext *m, char *path) { @@ -1928,6 +1916,7 @@ typedef enum { typedef enum { MetaStructMemberFlag_ReferenceType = 1 << 0, MetaStructMemberFlag_ReferenceElements = 1 << 1, + MetaStructMemberFlag_EnumerationCount = 1 << 2, } MetaStructMemberFlags; typedef struct { @@ -3353,6 +3342,8 @@ meta_struct_member_elements(MetaContext *ctx, MetaStruct *s, u32 member) i32 result = s->elements[member]; if (s->member_flags[member] & MetaStructMemberFlag_ReferenceElements) result = (i32)meta_entity(ctx, (MetaEntityID){result})->constant.U64; + if (s->member_flags[member] & MetaStructMemberFlag_EnumerationCount) + result = (i32)meta_entity(ctx, (MetaEntityID){result})->table.entry_count; return result; } @@ -3504,8 +3495,8 @@ meta_push_struct_body(MetaContext *ctx, MetaprogramContext *m, MetaEntity *struc } else { Stream sb = arena_stream(m->scratch); - b32 elements_reference = (s->member_flags[member] & MetaStructMemberFlag_ReferenceElements) != 0; - + b32 enum_count = (s->member_flags[member] & MetaStructMemberFlag_EnumerationCount) != 0; + b32 elements_reference = enum_count || (s->member_flags[member] & MetaStructMemberFlag_ReferenceElements) != 0; // NOTE(rnp): member name column { read_only local_persist str8 elements_count_open[MetaPushStructStyle_Count] = { @@ -3540,6 +3531,7 @@ meta_push_struct_body(MetaContext *ctx, MetaprogramContext *m, MetaEntity *struc stream_append_s8s(&sb, member_name, s8_from_str8(elements_count_open[p.layout_style])); if (elements_reference && p.element_count_style != MetaPushStructStyle_MATLAB) { stream_append_s8s(&sb, s8_from_str8(p.str_element_prefix), ctx->entity_names.data[s->elements[member]]); + if (enum_count) stream_append_s8(&sb, s8("_Count")); } else { if (p.element_count_style == MetaPushStructStyle_MATLAB) stream_append_s8(&sb, s8("1, ")); @@ -4316,7 +4308,7 @@ function b32 metagen_emit_matlab_code(MetaContext *ctx, Arena arena) { b32 result = 1; - if (!needs_rebuild(OUTPUT("matlab/OGLBeamformerLiveImagingParameters.m"), "beamformer_parameters.h", "beamformer.meta")) + if (!needs_rebuild(OUTPUT("matlab/OGLBeamformerShaderStage.m"), "beamformer_parameters.h", "beamformer.meta")) return result; build_log_generate("MATLAB Bindings"); @@ -4334,20 +4326,6 @@ metagen_emit_matlab_code(MetaContext *ctx, Arena arena) MetaprogramContext m[1] = {{.stream = arena_stream(arena), .scratch = ctx->scratch}}; - #define X(name, flag, ...) meta_push_line(m, s8(#name " (" str(flag) ")")); - meta_begin_matlab_class(m, "OGLBeamformerLiveFeedbackFlags", "int32"); - meta_begin_scope(m, s8("enumeration")); - BEAMFORMER_LIVE_IMAGING_DIRTY_FLAG_LIST - result &= meta_end_and_write_matlab(m, OUTPUT("matlab/OGLBeamformerLiveFeedbackFlags.m")); - #undef X - - #define X(name, __t, __s, elements, ...) meta_push_matlab_property(m, s8(#name), elements, s8("")); - meta_begin_matlab_class(m, "OGLBeamformerLiveImagingParameters"); - meta_begin_scope(m, s8("properties")); - BEAMFORMER_LIVE_IMAGING_PARAMETERS_LIST - result &= meta_end_and_write_matlab(m, OUTPUT("matlab/OGLBeamformerLiveImagingParameters.m")); - #undef X - meta_begin_matlab_class(m, "OGLBeamformerShaderStage", "int32"); meta_begin_scope(m, s8("enumeration")); { @@ -4893,11 +4871,20 @@ metagen_load_context(Arena *arena, char *filename) if (integer.result == NumberConversionResult_Success) { s->elements[member] = integer.U64; } else { - s->member_flags[member] |= MetaStructMemberFlag_ReferenceElements; - i64 id = meta_lookup_string_slow(ctx->entity_names.data, ctx->entity_names.count, elements[member]); + s8 ref_name = elements[member]; + if (ref_name.data[0] == '#') { + s->member_flags[member] |= MetaStructMemberFlag_EnumerationCount; + s8_chop(&ref_name, 1); + } else { + s->member_flags[member] |= MetaStructMemberFlag_ReferenceElements; + } + + i64 id = meta_lookup_string_slow(ctx->entity_names.data, ctx->entity_names.count, ref_name); if (id >= 0) { MetaEntity *ee = ctx->entities.data + id; - if (ee->kind != MetaEntityKind_Constant || ee->constant.kind != MetaConstantKind_Integer) { + b32 valid = ee->kind == MetaEntityKind_Enumeration || + (ee->kind == MetaEntityKind_Constant && ee->constant.kind == MetaConstantKind_Integer); + if (!valid) { // TODO(rnp): point at correct member meta_compiler_error(e->location, "struct '%.*s': element count for field '%.*s'" "references '%.*s' which is not an integer constant\n", diff --git a/generated/beamformer.meta.c b/generated/beamformer.meta.c @@ -105,6 +105,17 @@ typedef enum { } BeamformerFilterKind; typedef enum { + BeamformerLiveFeedbackFlags_ImagePlaneOffsets = 0, + BeamformerLiveFeedbackFlags_TransmitPower = 1, + BeamformerLiveFeedbackFlags_TGCControlPoints = 2, + BeamformerLiveFeedbackFlags_SaveData = 3, + BeamformerLiveFeedbackFlags_SaveNameTag = 4, + BeamformerLiveFeedbackFlags_StopImaging = 5, + BeamformerLiveFeedbackFlags_AcquisitionKind = 6, + BeamformerLiveFeedbackFlags_Count, +} BeamformerLiveFeedbackFlags; + +typedef enum { BeamformerPanelKind_Nil = 0, BeamformerPanelKind_Split = 1, BeamformerPanelKind_TabGroup = 2, @@ -143,6 +154,16 @@ typedef enum { } BeamformerCommandKind; typedef enum { + BeamformerLiveImagingDirtyFlags_ImagePlaneOffsets = 1 << 0, + BeamformerLiveImagingDirtyFlags_TransmitPower = 1 << 1, + BeamformerLiveImagingDirtyFlags_TGCControlPoints = 1 << 2, + BeamformerLiveImagingDirtyFlags_SaveData = 1 << 3, + BeamformerLiveImagingDirtyFlags_SaveNameTag = 1 << 4, + BeamformerLiveImagingDirtyFlags_StopImaging = 1 << 5, + BeamformerLiveImagingDirtyFlags_AcquisitionKind = 1 << 6, +} BeamformerLiveImagingDirtyFlags; + +typedef enum { BeamformerPanelFlags_List = 1 << 0, BeamformerPanelFlags_NeedsFrame = 1 << 1, BeamformerPanelFlags_HasSettings = 1 << 2, @@ -445,6 +466,19 @@ typedef struct { } BeamformerSimpleParameters; typedef struct { + u32 active; + u32 save_enabled; + u32 save_active; + u32 acquisition_kind; + u64 acquisition_kind_enabled_flags; + f32 transmit_power; + f32 image_plane_offsets[BeamformerViewPlaneTag_Count]; + f32 tgc_control_points[8]; + i32 save_name_tag_length; + u8 save_name_tag[128]; +} BeamformerLiveImagingParameters; + +typedef struct { v2 focal_vectors[BeamformerMaxChannelCount]; i16 sparse_elements[BeamformerMaxChannelCount]; u16 transmit_receive_orientations[BeamformerMaxChannelCount];