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:
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)