ogl_beamforming

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

Commit: 3fb13d375d5ed70351d03c75862ea717e64d371a
Parent: 14ea1604e894c655bf81b4540b2f02436a30edd1
Author: Randy Palamar
Date:   Mon, 12 Oct 2026 14:02:51 -0600

meta: stride calculation can be table driven

no need to generate a function when a table can do the job

Diffstat:
Mbeamformer.meta | 19++++---------------
Mbeamformer_core.c | 14++++++++++++++
Mgenerated/beamformer.c | 20++++++--------------
3 files changed, 24 insertions(+), 29 deletions(-)

diff --git a/beamformer.meta b/beamformer.meta @@ -330,6 +330,10 @@ `read_only str8 beamformer_interpolation_mode_strings[] = {` @Expand(InterpolationMode) ` str8_comp("$(name)"),` `};` + `` + `read_only u8 beamformer_data_stride_indices[BeamformerDataLayout_Count][3] = {` + @Expand(DataLayoutTable) ` [BeamformerDataLayout_$(name)]$(|)= {BeamformerRFDimension_$(dim1),$(|)BeamformerRFDimension_$(dim2),$(|)BeamformerRFDimension_$(dim3)},` + `};` } @ShaderGroup Compute @@ -551,18 +555,3 @@ } } } - -@Emit -{ - `function uv3` - `beamformer_data_strides(BeamformerDataLayout layout, uv3 rf_dimensions)` - `{` - ` uv3 result = {0};` - ` switch (layout) {` - ` InvalidDefaultCase;` - ` case BeamformerDataLayout_Image:{}break;` - @Expand(DataLayoutTable) ` case BeamformerDataLayout_$(name):{$(|)result.E[BeamformerRFDimension_$(dim3)]$(|)= 1;$(|)result.E[BeamformerRFDimension_$(dim2)]$(|)= rf_dimensions.E[BeamformerRFDimension_$(dim3)];$(|)result.E[BeamformerRFDimension_$(dim1)]$(|)= rf_dimensions.E[BeamformerRFDimension_$(dim3)]$(|)* rf_dimensions.E[BeamformerRFDimension_$(dim2)];$(|)}break;` - ` }` - ` return result;` - `}` -} diff --git a/beamformer_core.c b/beamformer_core.c @@ -526,6 +526,20 @@ push_compute_graph_node(BeamformerComputeGraph *graph, BeamformerShaderKind kind return result; } +function uv3 +beamformer_data_strides(BeamformerDataLayout layout, uv3 rf_dimensions) +{ + assert(layout >= 0 && layout < BeamformerDataLayout_Count); + uv3 result = {0}; + BeamformerRFDimension x = beamformer_data_stride_indices[layout][0]; + BeamformerRFDimension y = beamformer_data_stride_indices[layout][1]; + BeamformerRFDimension z = beamformer_data_stride_indices[layout][2]; + result.E[z] = 1; + result.E[y] = rf_dimensions.E[z]; + result.E[x] = rf_dimensions.E[z] * rf_dimensions.E[y]; + return result; +} + function void plan_compute_pipeline(BeamformerComputePlan *cp, BeamformerParameterBlock *pb, Arena *scratch) { diff --git a/generated/beamformer.c b/generated/beamformer.c @@ -1027,18 +1027,10 @@ read_only str8 beamformer_interpolation_mode_strings[] = { str8_comp("Cubic"), }; -function uv3 -beamformer_data_strides(BeamformerDataLayout layout, uv3 rf_dimensions) -{ - uv3 result = {0}; - switch (layout) { - InvalidDefaultCase; - case BeamformerDataLayout_Image:{}break; - case BeamformerDataLayout_ChannelEventSample:{ result.E[BeamformerRFDimension_Samples] = 1; result.E[BeamformerRFDimension_Events] = rf_dimensions.E[BeamformerRFDimension_Samples]; result.E[BeamformerRFDimension_Channels] = rf_dimensions.E[BeamformerRFDimension_Samples] * rf_dimensions.E[BeamformerRFDimension_Events]; }break; - case BeamformerDataLayout_ChannelSampleEvent:{ result.E[BeamformerRFDimension_Events] = 1; result.E[BeamformerRFDimension_Samples] = rf_dimensions.E[BeamformerRFDimension_Events]; result.E[BeamformerRFDimension_Channels] = rf_dimensions.E[BeamformerRFDimension_Events] * rf_dimensions.E[BeamformerRFDimension_Samples]; }break; - case BeamformerDataLayout_EventChannelSample:{ result.E[BeamformerRFDimension_Samples] = 1; result.E[BeamformerRFDimension_Channels] = rf_dimensions.E[BeamformerRFDimension_Samples]; result.E[BeamformerRFDimension_Events] = rf_dimensions.E[BeamformerRFDimension_Samples] * rf_dimensions.E[BeamformerRFDimension_Channels]; }break; - case BeamformerDataLayout_SampleChannelEvent:{ result.E[BeamformerRFDimension_Events] = 1; result.E[BeamformerRFDimension_Channels] = rf_dimensions.E[BeamformerRFDimension_Events]; result.E[BeamformerRFDimension_Samples] = rf_dimensions.E[BeamformerRFDimension_Events] * rf_dimensions.E[BeamformerRFDimension_Channels]; }break; - } - return result; -} +read_only u8 beamformer_data_stride_indices[BeamformerDataLayout_Count][3] = { + [BeamformerDataLayout_ChannelEventSample] = {BeamformerRFDimension_Channels, BeamformerRFDimension_Events, BeamformerRFDimension_Samples}, + [BeamformerDataLayout_ChannelSampleEvent] = {BeamformerRFDimension_Channels, BeamformerRFDimension_Samples, BeamformerRFDimension_Events}, + [BeamformerDataLayout_EventChannelSample] = {BeamformerRFDimension_Events, BeamformerRFDimension_Channels, BeamformerRFDimension_Samples}, + [BeamformerDataLayout_SampleChannelEvent] = {BeamformerRFDimension_Samples, BeamformerRFDimension_Channels, BeamformerRFDimension_Events}, +};