ogl_beamforming

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

Commit: 17a7ac0037d83e5fc4991117822b675b2a673f9a
Parent: f2b420f8ba454b8eaaa469ba2438ea1b2af86813
Author: Randy Palamar
Date:   Fri, 27 Feb 2026 17:10:02 -0700

core: choose optimal DAS layout based on actually user provided points layout

Diffstat:
Mbeamformer_core.c | 23++++++++++++++++++++---
1 file changed, 20 insertions(+), 3 deletions(-)

diff --git a/beamformer_core.c b/beamformer_core.c @@ -643,12 +643,29 @@ plan_compute_pipeline(BeamformerComputePlan *cp, BeamformerParameterBlock *pb) if (id == BeamformerAcquisitionKind_UFORCES || id == BeamformerAcquisitionKind_UHERCULES) sd->bake.flags |= BeamformerShaderDASFlags_Sparse; + sd->layout = (uv3){{1, 1, 1}}; + + b32 has_x = cp->output_points.x > 1; + b32 has_y = cp->output_points.y > 1; + b32 has_z = cp->output_points.z > 1; // TODO(rnp): subgroup size u32 subgroup_size = gl_parameters.vendor_id == GLVendor_NVIDIA ? 32 : 64; switch (iv3_dimension(cp->output_points)) { - case 1:{sd->layout = (uv3){{subgroup_size, 1, 1}}; }break; - case 2:{sd->layout = (uv3){{subgroup_size/4, subgroup_size/4, 1}};}break; - case 3:{sd->layout = (uv3){{8, 8, 8}}; }break; + + case 1:{ + if (has_x) sd->layout.x = subgroup_size; + if (has_y) sd->layout.y = subgroup_size; + if (has_z) sd->layout.z = subgroup_size; + }break; + + case 2:{ + if (has_x && has_y) { sd->layout.x = subgroup_size / 4; sd->layout.x = subgroup_size / 4; } + if (has_x && has_z) { sd->layout.x = subgroup_size / 4; sd->layout.z = subgroup_size / 4; } + if (has_y && has_z) { sd->layout.y = subgroup_size / 4; sd->layout.z = subgroup_size / 4; } + }break; + + case 3:{sd->layout = (uv3){{4, 4, 4}};}break; + InvalidDefaultCase; }