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:
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];