ogl_beamforming

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

Commit: 6c7f2e251664fa9a7991bf709392838e3d259b54
Parent: 8e8c7873658fce54053a4623403b6eba97cf2989
Author: Randy Palamar
Date:   Fri, 25 Jul 2025 12:17:21 -0600

core: ignore CudaHilbert when demodulation was requested

Diffstat:
Mbeamformer.c | 40+++++++++++++++++++++++++++++++---------
1 file changed, 31 insertions(+), 9 deletions(-)

diff --git a/beamformer.c b/beamformer.c @@ -314,17 +314,32 @@ plan_compute_pipeline(SharedMemoryRegion *os_sm, BeamformerComputePipeline *cp, b32 decode_first = sm->shaders[0] == BeamformerShaderKind_Decode; b32 demod_first = sm->shaders[0] == BeamformerShaderKind_Demodulate; + b32 cuda_hilbert = 0; + b32 demodulate = 0; + + for (i32 i = 0; i < sm->shader_count; i++) { + switch (sm->shaders[i]) { + case BeamformerShaderKind_CudaHilbert:{ cuda_hilbert = 1; }break; + case BeamformerShaderKind_Demodulate:{ demodulate = 1; }break; + default:{}break; + } + } + + if (demodulate) cuda_hilbert = 0; os_shared_memory_region_lock(os_sm, sm->locks, params_lock, (u32)-1); mem_copy(bp, &sm->parameters, sizeof(*bp)); os_shared_memory_region_unlock(os_sm, sm->locks, params_lock); - b32 demodulating = 0; BeamformerDataKind data_kind = sm->data_kind; - for (cp->shader_count = 0; cp->shader_count < sm->shader_count; cp->shader_count++) { - BeamformerShaderParameters *sp = sm->shader_parameters + cp->shader_count; - u32 shader = sm->shaders[cp->shader_count]; + cp->shader_count = 0; + for (i32 i = 0; i < sm->shader_count; i++) { + BeamformerShaderParameters *sp = sm->shader_parameters + i; + u32 shader = sm->shaders[i]; + b32 commit = 0; + switch (shader) { + case BeamformerShaderKind_CudaHilbert:{ commit = cuda_hilbert; }break; case BeamformerShaderKind_Decode:{ BeamformerShaderKind decode_table[] = { [BeamformerDataKind_Int16] = BeamformerShaderKind_Decode, @@ -340,22 +355,27 @@ plan_compute_pipeline(SharedMemoryRegion *os_sm, BeamformerComputePipeline *cp, else shader = BeamformerShaderKind_DecodeFloatComplex; } + commit = 1; }break; case BeamformerShaderKind_Demodulate:{ if (!demod_first || (demod_first && data_kind == BeamformerDataKind_Float32)) shader = BeamformerShaderKind_DemodulateFloat; bp->time_offset += beamformer_filter_time_offset(filters + sp->filter_slot); - demodulating = 1; + commit = 1; }break; case BeamformerShaderKind_DAS:{ if (!bp->coherency_weighting) shader = BeamformerShaderKind_DASFast; + commit = 1; }break; - default:{}break; + default:{ commit = 1; }break; } - cp->shaders[cp->shader_count] = shader; - cp->shader_parameters[cp->shader_count] = *sp; + if (commit) { + i32 index = cp->shader_count++; + cp->shaders[index] = shader; + cp->shader_parameters[index] = *sp; + } } os_shared_memory_region_unlock(os_sm, sm->locks, compute_lock); @@ -363,6 +383,8 @@ plan_compute_pipeline(SharedMemoryRegion *os_sm, BeamformerComputePipeline *cp, dp->decode_mode = bp->decode; dp->transmit_count = bp->dec_data_dim[2]; + bp->decimation_rate = MAX(bp->decimation_rate, 1); + if (decode_first) { dp->input_channel_stride = bp->rf_raw_dim[0]; dp->input_sample_stride = 1; @@ -373,7 +395,7 @@ plan_compute_pipeline(SharedMemoryRegion *os_sm, BeamformerComputePipeline *cp, dp->output_transmit_stride = bp->dec_data_dim[0]; } - if (demodulating) { + if (demodulate) { BeamformerDemodulateUBO *mp = &cp->demod_ubo_data; mp->sampling_frequency = bp->sampling_frequency; mp->demodulation_frequency = bp->center_frequency;