ogl_beamforming

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

Commit: 8b2e08c3def0f7c6fcc1166a27c802b1e2dd2308
Parent: a8536a6a2243ac2b0d18b42204a4f09a955d1911
Author: Randy Palamar
Date:   Thu, 15 Oct 2026 06:24:17 -0700

core: table drive acquisition sparsity check

Diffstat:
Mbeamformer.meta | 52+++++++++++++++++++++++++++++-----------------------
Mbeamformer_core.c | 8+++++---
Mgenerated/beamformer.c | 67++++++++++++++++++++++++++++++++++++-------------------------------
Mui.c | 2+-
4 files changed, 71 insertions(+), 58 deletions(-)

diff --git a/beamformer.meta b/beamformer.meta @@ -87,21 +87,27 @@ Arbitrary } -@Table([name pretty_name fixed_transmits]) AcquisitionKindTable -{ - [FORCES FORCES 1] - [UFORCES UFORCES 0] - [HERCULES HERCULES 1] - [RCA_VLS VLS 0] - [RCA_TPW TPW 0] - [UHERCULES UHERCULES 0] - [RACES RACES 1] - [EPIC_FORCES EPIC-FORCES 1] - [EPIC_UFORCES EPIC-UFORCES 0] - [EPIC_UHERCULES EPIC-UHERCULES 0] - [Flash Flash 0] - [HERO_PA HERO-PA 0] - [ULM ULM 0] +@Flags AcquisitionKindFlags +{ + FixedTransmits + Sparse +} + +@Table([name pretty_name fixed_transmits sparse]) AcquisitionKindTable +{ + [FORCES FORCES 1 0] + [UFORCES UFORCES 0 1] + [HERCULES HERCULES 1 0] + [RCA_VLS VLS 0 0] + [RCA_TPW TPW 0 0] + [UHERCULES UHERCULES 0 1] + [RACES RACES 1 0] + [EPIC_FORCES EPIC-FORCES 1 0] + [EPIC_UFORCES EPIC-UFORCES 0 1] + [EPIC_UHERCULES EPIC-UHERCULES 0 1] + [Flash Flash 0 0] + [HERO_PA HERO-PA 0 0] + [ULM ULM 0 0] } @Expand(AcquisitionKindTable) @Enumeration(`$(name)`) AcquisitionKind @@ -303,6 +309,14 @@ @Expand(DataKindTable) ` str8_comp("$(name)"),` `};` `` + `read_only u32 beamformer_acquisition_kind_flags[] = {` + @Expand(AcquisitionKindTable) ` ($(fixed_transmits)*BeamformerAcquisitionKindFlags_FixedTransmits)|($(sparse)*BeamformerAcquisitionKindFlags_Sparse),` + `};` + `` + `read_only str8 beamformer_acquisition_kind_strings[] = {` + @Expand(AcquisitionKindTable) ` str8_comp("$(pretty_name)"),` + `};` + `` `read_only u8 beamformer_contrast_mode_samples[] = {` @Expand(ContrastModeTable) ` $(samples),` `};` @@ -315,14 +329,6 @@ @Expand(ViewPlaneTag) ` str8_comp("$(name)"),` `};` `` - `read_only u8 beamformer_acquisition_kind_has_fixed_transmits[] = {` - @Expand(AcquisitionKindTable) ` $(fixed_transmits),` - `};` - `` - `read_only str8 beamformer_acquisition_kind_strings[] = {` - @Expand(AcquisitionKindTable) ` str8_comp("$(pretty_name)"),` - `};` - `` `read_only str8 beamformer_emission_kind_strings[] = {` @Expand(EmissionKind) ` str8_comp("$(name)"),` `};` diff --git a/beamformer_core.c b/beamformer_core.c @@ -949,7 +949,9 @@ plan_compute_pipeline(BeamformerComputePlan *cp, BeamformerParameterBlock *pb, A memory_copy(cp->das_voxel_transform.E, cp->voxel_transform.E, sizeof(cp->voxel_transform)); u32 id = pb->parameters.acquisition_kind; - b32 sparse = id == BeamformerAcquisitionKind_UFORCES || id == BeamformerAcquisitionKind_UHERCULES; + + u32 acquisition_kind_flags = beamformer_acquisition_kind_flags[id]; + b32 sparse = (acquisition_kind_flags & BeamformerAcquisitionKindFlags_Sparse) != 0; b32 single_focus = pb->parameters.single_focus != 0; b32 single_orientation = pb->parameters.single_orientation != 0; @@ -961,14 +963,14 @@ plan_compute_pipeline(BeamformerComputePlan *cp, BeamformerParameterBlock *pb, A sd->layout = layout_for_output(cp->output_points); sd->dispatch = dispatch_for_output(sd->layout, cp->output_points); - if (id != BeamformerAcquisitionKind_UFORCES && id != BeamformerAcquisitionKind_FORCES && !single_focus) { + if (!single_focus) { db->FocalVectors = gpu_resource_push(resource_builder, v2, db->AcquisitionCount, .data = pb->focal_vectors, .name = str8("focal_vectors")); sd->uses_heap = 1; } - if (id != BeamformerAcquisitionKind_UFORCES && id != BeamformerAcquisitionKind_FORCES && !single_orientation) { + if (!single_orientation) { db->TransmitReceiveOrientations = gpu_resource_push(resource_builder, u8, db->AcquisitionCount, .data = pb->transmit_receive_orientations, .name = str8("transmit_receive_orientations")); diff --git a/generated/beamformer.c b/generated/beamformer.c @@ -120,6 +120,11 @@ typedef enum { } BeamformerLiveFeedbackFlags; typedef enum { + BeamformerAcquisitionKindFlags_FixedTransmits = 1 << 0, + BeamformerAcquisitionKindFlags_Sparse = 1 << 1, +} BeamformerAcquisitionKindFlags; + +typedef enum { BeamformerLiveImagingDirtyFlags_ImagePlaneOffsets = 1 << 0, BeamformerLiveImagingDirtyFlags_TransmitPower = 1 << 1, BeamformerLiveImagingDirtyFlags_TGCControlPoints = 1 << 2, @@ -967,37 +972,20 @@ read_only str8 beamformer_data_kind_str8[] = { str8_comp("Float16Complex"), }; -read_only u8 beamformer_contrast_mode_samples[] = { - 1, - 3, -}; - -read_only str8 beamformer_contrast_mode_strings[] = { - str8_comp("None"), - str8_comp("A1S2"), -}; - -read_only str8 beamformer_view_plane_tag_strings[] = { - str8_comp("XZ"), - str8_comp("YZ"), - str8_comp("XY"), - str8_comp("Arbitrary"), -}; - -read_only u8 beamformer_acquisition_kind_has_fixed_transmits[] = { - 1, - 0, - 1, - 0, - 0, - 0, - 1, - 1, - 0, - 0, - 0, - 0, - 0, +read_only u32 beamformer_acquisition_kind_flags[] = { + (1*BeamformerAcquisitionKindFlags_FixedTransmits)|(0*BeamformerAcquisitionKindFlags_Sparse), + (0*BeamformerAcquisitionKindFlags_FixedTransmits)|(1*BeamformerAcquisitionKindFlags_Sparse), + (1*BeamformerAcquisitionKindFlags_FixedTransmits)|(0*BeamformerAcquisitionKindFlags_Sparse), + (0*BeamformerAcquisitionKindFlags_FixedTransmits)|(0*BeamformerAcquisitionKindFlags_Sparse), + (0*BeamformerAcquisitionKindFlags_FixedTransmits)|(0*BeamformerAcquisitionKindFlags_Sparse), + (0*BeamformerAcquisitionKindFlags_FixedTransmits)|(1*BeamformerAcquisitionKindFlags_Sparse), + (1*BeamformerAcquisitionKindFlags_FixedTransmits)|(0*BeamformerAcquisitionKindFlags_Sparse), + (1*BeamformerAcquisitionKindFlags_FixedTransmits)|(0*BeamformerAcquisitionKindFlags_Sparse), + (0*BeamformerAcquisitionKindFlags_FixedTransmits)|(1*BeamformerAcquisitionKindFlags_Sparse), + (0*BeamformerAcquisitionKindFlags_FixedTransmits)|(1*BeamformerAcquisitionKindFlags_Sparse), + (0*BeamformerAcquisitionKindFlags_FixedTransmits)|(0*BeamformerAcquisitionKindFlags_Sparse), + (0*BeamformerAcquisitionKindFlags_FixedTransmits)|(0*BeamformerAcquisitionKindFlags_Sparse), + (0*BeamformerAcquisitionKindFlags_FixedTransmits)|(0*BeamformerAcquisitionKindFlags_Sparse), }; read_only str8 beamformer_acquisition_kind_strings[] = { @@ -1016,6 +1004,23 @@ read_only str8 beamformer_acquisition_kind_strings[] = { str8_comp("ULM"), }; +read_only u8 beamformer_contrast_mode_samples[] = { + 1, + 3, +}; + +read_only str8 beamformer_contrast_mode_strings[] = { + str8_comp("None"), + str8_comp("A1S2"), +}; + +read_only str8 beamformer_view_plane_tag_strings[] = { + str8_comp("XZ"), + str8_comp("YZ"), + str8_comp("XY"), + str8_comp("Arbitrary"), +}; + read_only str8 beamformer_emission_kind_strings[] = { str8_comp("Sine"), str8_comp("Chirp"), diff --git a/ui.c b/ui.c @@ -769,7 +769,7 @@ push_acquisition_kind(Arena *arena, BeamformerAcquisitionKind kind, u32 transmit b32 fixed_transmits = 0; if Between(kind, 0, BeamformerAcquisitionKind_Count - 1) { name = beamformer_acquisition_kind_strings[kind]; - fixed_transmits = beamformer_acquisition_kind_has_fixed_transmits[kind]; + fixed_transmits = (beamformer_acquisition_kind_flags[kind] & BeamformerAcquisitionKindFlags_FixedTransmits) != 0; } Stream sb = arena_stream(arena);