ogl_beamforming

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

Commit: a3eaea1a2426c11bf0ad9ce44340d8be56d164aa
Parent: 30238107bb1ebd803a7fedfa4369bbc89d4a566e
Author: Randy Palamar
Date:   Thu, 12 Mar 2026 12:38:13 -0600

core: fix a few bugs with VLS/TPW paths

* extra scaling in filter shader when outputting floats
* incorrect output element offset in filter stage when outputting floats
* incorrect array parameters buffer offset in DAS push constants

Diffstat:
Mbeamformer_core.c | 16+++++++++++-----
Mshaders/filter.glsl | 2+-
2 files changed, 12 insertions(+), 6 deletions(-)

diff --git a/beamformer_core.c b/beamformer_core.c @@ -865,14 +865,21 @@ do_compute_shader(BeamformerCtx *ctx, VulkanHandle cmd, BeamformerComputePlan *c case BeamformerShaderKind_Filter: case BeamformerShaderKind_Demodulate: { - u64 element_size = beamformer_data_kind_byte_size[cp->shader_descriptors[shader_slot].bake.Filter.data_kind]; b32 demod = cp->pipeline.shaders[shader_slot] == BeamformerShaderKind_Demodulate; - u32 filter_slot = cp->pipeline.parameters[shader_slot].filter_slot; + BeamformerDataKind output_data_kind = cp->shader_descriptors[shader_slot].bake.Filter.data_kind; + if (demod) output_data_kind = BeamformerDataKind_Float16Complex; + if (cp->shader_descriptors[shader_slot].bake.Filter.output_floats) { + output_data_kind = demod ? BeamformerDataKind_Float32Complex + : BeamformerDataKind_Float32; + } + + u64 element_size = beamformer_data_kind_byte_size[output_data_kind]; + u32 filter_slot = cp->pipeline.parameters[shader_slot].filter_slot; BeamformerFilterPushConstants pc = { .filter_coefficients = cp->filters[filter_slot].buffer.gpu_pointer, .input_data = shader_slot == 0 ? rf_pointer : pp_input_pointer, - .output_element_offset = output_index * pp_size / element_size / (demod ? 2 : 1), + .output_element_offset = output_index * pp_size / element_size, }; GPUMemoryBarrierInfo barrier = { @@ -893,7 +900,6 @@ do_compute_shader(BeamformerCtx *ctx, VulkanHandle cmd, BeamformerComputePlan *c GPUBuffer *b = cc->backlog.buffer; - u64 frame_size = beamformer_frame_byte_size(frame->points, frame->data_kind); u64 iframe_size = frame_size / beamformer_data_kind_element_count[frame->data_kind]; u64 element_size = beamformer_data_kind_byte_size[cp->shader_descriptors[shader_slot].bake.DAS.data_kind]; @@ -908,7 +914,7 @@ do_compute_shader(BeamformerCtx *ctx, VulkanHandle cmd, BeamformerComputePlan *c .output_size_z = cp->output_points.z, .cycle_t = das_cycle_t++, .channel_offset = channel_offset, - .array_parameters = cp->array_parameters.gpu_pointer + offsetof(BeamformerDASArrayParameters, focal_vectors), + .array_parameters = cp->array_parameters.gpu_pointer + offsetof(BeamformerComputeArrayParameters, FocalVectors), }; mem_copy(pc.voxel_transform.E, cp->voxel_transform.E, sizeof(pc.voxel_transform)); mem_copy(pc.xdc_transform.E, cp->xdc_transform.E, sizeof(pc.xdc_transform)); diff --git a/shaders/filter.glsl b/shaders/filter.glsl @@ -10,7 +10,7 @@ #define SAMPLE_TYPE_CAST(v) (v) #if OutputFloats #define OUT_DATA_TYPE f32vec2 - #define RESULT_TYPE_CAST(v) (clamp((v), -1.0, 1.0) * 32767.0f) + #define RESULT_TYPE_CAST(v) f32vec2(v) #else #define OUT_DATA_TYPE f16vec2 #define RESULT_TYPE_CAST(v) f16vec2(v)