Commit: 1b0b83be19180a8071ac6efdc4784b7d3e1bac72
Parent: de7f254f888a3f0632037bfee56993b28d42bc87
Author: Randy Palamar
Date: Wed, 4 Mar 2026 21:28:03 -0700
das: prebake xdc_transform * voxel_transform for (u)FORCES
no need to do this extra math over and over again for every pixel
Diffstat:
3 files changed, 10 insertions(+), 7 deletions(-)
diff --git a/beamformer_core.c b/beamformer_core.c
@@ -633,15 +633,19 @@ plan_compute_pipeline(BeamformerComputePlan *cp, BeamformerParameterBlock *pb)
mem_copy(du->voxel_transform.E, pb->parameters.das_voxel_transform.E, sizeof(du->voxel_transform));
mem_copy(du->xdc_transform.E, pb->parameters.xdc_transform.E, sizeof(du->xdc_transform));
+ u32 id = pb->parameters.acquisition_kind;
+
+ if (id == BeamformerAcquisitionKind_UFORCES || id == BeamformerAcquisitionKind_FORCES)
+ du->voxel_transform = m4_mul(du->xdc_transform, du->voxel_transform);
+
+ if (id == BeamformerAcquisitionKind_UFORCES || id == BeamformerAcquisitionKind_UHERCULES)
+ sd->bake.flags |= BeamformerShaderDASFlags_Sparse;
+
if (pb->parameters.single_focus) sd->bake.flags |= BeamformerShaderDASFlags_SingleFocus;
if (pb->parameters.single_orientation) sd->bake.flags |= BeamformerShaderDASFlags_SingleOrientation;
if (pb->parameters.coherency_weighting) sd->bake.flags |= BeamformerShaderDASFlags_CoherencyWeighting;
else sd->bake.flags |= BeamformerShaderDASFlags_Fast;
- u32 id = pb->parameters.acquisition_kind;
- 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;
diff --git a/beamformer_internal.h b/beamformer_internal.h
@@ -101,8 +101,8 @@ typedef struct {
/* X(name, type, gltype) */
#define BEAMFORMER_DAS_UBO_PARAM_LIST \
- X(voxel_transform, m4, mat4) \
X(xdc_transform, m4, mat4) \
+ X(voxel_transform, m4, mat4) \
X(xdc_element_pitch, v2, vec2)
typedef alignas(16) struct {
diff --git a/shaders/das.glsl b/shaders/das.glsl
@@ -251,13 +251,12 @@ RESULT_TYPE HERCULES(const vec3 world_point)
return result;
}
-RESULT_TYPE FORCES(const vec3 world_point)
+RESULT_TYPE FORCES(const vec3 xdc_world_point)
{
const int rx_channel_start = bool(Fast)? u_channel : 0;
const int rx_channel_end = bool(Fast)? u_channel + 1 : ChannelCount;
RESULT_TYPE result = RESULT_TYPE(0);
- vec3 xdc_world_point = (xdc_transform * vec4(world_point, 1)).xyz;
for (int rx_channel = rx_channel_start; rx_channel < rx_channel_end; rx_channel++) {
float receive_distance = distance(xdc_world_point.xz, vec2(rx_channel * xdc_element_pitch.x, 0));
float a_arg = abs(FNumber * (xdc_world_point.x - rx_channel * xdc_element_pitch.x) /