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:
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},
+};