ogl_beamforming

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

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:
Mbeamformer.c | 4++++
Mbeamformer.meta | 3++-
Mgenerated/beamformer.meta.c | 6++++++
Mshaders/das.glsl | 22+++++++++++++---------
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;