Commit: e15bb512d82df62df5cabf3502000d05480cef60
Parent: 20d5e5e023e84511118aaac8102fb9b2214fc725
Author: Randy Palamar
Date: Thu, 2 Oct 2025 20:17:42 -0600
shaders/das: add support for HERO PhotoAcoustic acquisitions
this is done based on a flag rather then a 'TransmitModeNone'
because it allows more code to be optimized out
Diffstat:
4 files changed, 25 insertions(+), 10 deletions(-)
diff --git a/beamformer.c b/beamformer.c
@@ -465,6 +465,10 @@ das_ubo_from_beamformer_parameters(BeamformerComputePlan *cp, BeamformerDASUBO *
if (bp->das_shader_id == BeamformerAcquisitionKind_UFORCES || bp->das_shader_id == BeamformerAcquisitionKind_UHERCULES)
cp->das_bake.shader_flags |= BeamformerShaderDASFlags_Sparse;
+
+ if (bp->das_shader_id == BeamformerAcquisitionKind_HERO_PA)
+ cp->das_bake.shader_flags |= BeamformerShaderDASFlags_ReceiveOnly;
+
if (bp->interpolate)
cp->das_bake.shader_flags |= BeamformerShaderDASFlags_Interpolate;
}
diff --git a/beamformer.meta b/beamformer.meta
@@ -16,6 +16,7 @@
[EPIC_UFORCES EPIC-UFORCES 0]
[EPIC_UHERCULES EPIC-UHERCULES 0]
[Flash Flash 0]
+ [HERO_PA HERO-PA 0]
}
@Expand(AcquisitionKind)
@@ -94,7 +95,7 @@
@Enumeration(AcquisitionKind)
@Enumeration(DataKind)
@Enumeration(RCAOrientation)
- @Flags([Fast Sparse Interpolate CoherencyWeighting])
+ @Flags([Fast Sparse Interpolate CoherencyWeighting ReceiveOnly])
@Bake
{
diff --git a/generated/beamformer.meta.c b/generated/beamformer.meta.c
@@ -40,6 +40,7 @@ typedef enum {
BeamformerAcquisitionKind_EPIC_UFORCES = 8,
BeamformerAcquisitionKind_EPIC_UHERCULES = 9,
BeamformerAcquisitionKind_Flash = 10,
+ BeamformerAcquisitionKind_HERO_PA = 11,
BeamformerAcquisitionKind_Count,
} BeamformerAcquisitionKind;
@@ -58,6 +59,7 @@ typedef enum {
BeamformerShaderDASFlags_Sparse = (1 << 1),
BeamformerShaderDASFlags_Interpolate = (1 << 2),
BeamformerShaderDASFlags_CoherencyWeighting = (1 << 3),
+ BeamformerShaderDASFlags_ReceiveOnly = (1 << 4),
} BeamformerShaderDASFlags;
typedef enum {
@@ -217,6 +219,7 @@ read_only global s8 beamformer_shader_global_header_strings[] = {
"#define AcquisitionKind_EPIC_UFORCES 8\n"
"#define AcquisitionKind_EPIC_UHERCULES 9\n"
"#define AcquisitionKind_Flash 10\n"
+ "#define AcquisitionKind_HERO_PA 11\n"
"\n"),
};
@@ -234,6 +237,7 @@ read_only global s8 beamformer_shader_local_header_strings[] = {
"#define ShaderFlags_Sparse (1 << 1)\n"
"#define ShaderFlags_Interpolate (1 << 2)\n"
"#define ShaderFlags_CoherencyWeighting (1 << 3)\n"
+ "#define ShaderFlags_ReceiveOnly (1 << 4)\n"
"\n"),
{0},
{0},
@@ -334,6 +338,7 @@ read_only global u8 beamformer_acquisition_kind_has_fixed_transmits[] = {
0,
0,
0,
+ 0,
};
read_only global s8 beamformer_acquisition_kind_strings[] = {
@@ -348,5 +353,6 @@ read_only global s8 beamformer_acquisition_kind_strings[] = {
s8_comp("EPIC-UFORCES"),
s8_comp("EPIC-UHERCULES"),
s8_comp("Flash"),
+ s8_comp("HERO-PA"),
};
diff --git a/shaders/das.glsl b/shaders/das.glsl
@@ -39,6 +39,7 @@ const bool fast = bool(ShaderFlags & ShaderFlags_Fast);
const bool sparse = bool(ShaderFlags & ShaderFlags_Sparse);
const bool interpolate = bool(ShaderFlags & ShaderFlags_Interpolate);
const bool coherency_weighting = bool(ShaderFlags & ShaderFlags_CoherencyWeighting);
+const bool receive_only = bool(ShaderFlags & ShaderFlags_ReceiveOnly);
#if (ShaderFlags & ShaderFlags_Fast)
layout(TEXTURE_KIND, binding = 0) restrict uniform image3D u_out_data_tex;
@@ -151,15 +152,17 @@ float cylindrical_wave_transmit_distance(const vec3 point, const float focal_dep
float rca_transmit_distance(const vec3 world_point, const vec2 focal_vector, const int transmit_receive_orientation)
{
- bool tx_rows = (transmit_receive_orientation & TX_ORIENTATION_MASK) == 0;
- float transmit_angle = radians(focal_vector.x);
- float focal_depth = focal_vector.y;
-
- float result;
- if (isinf(focal_depth)) {
- result = plane_wave_transmit_distance(world_point, transmit_angle, tx_rows);
- } else {
- result = cylindrical_wave_transmit_distance(world_point, focal_depth, transmit_angle, tx_rows);
+ float result = 0;
+ if (!receive_only) {
+ bool tx_rows = (transmit_receive_orientation & TX_ORIENTATION_MASK) == 0;
+ float transmit_angle = radians(focal_vector.x);
+ float focal_depth = focal_vector.y;
+
+ if (isinf(focal_depth)) {
+ result = plane_wave_transmit_distance(world_point, transmit_angle, tx_rows);
+ } else {
+ result = cylindrical_wave_transmit_distance(world_point, focal_depth, transmit_angle, tx_rows);
+ }
}
return result;
}
@@ -273,6 +276,7 @@ void main()
}break;
case AcquisitionKind_HERCULES:
case AcquisitionKind_UHERCULES:
+ case AcquisitionKind_HERO_PA:
{
sum += HERCULES(world_point);
}break;