ogl_beamforming

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

Commit: dd51733c19181f310d5bdeb5e595e0ea8c91fafb
Parent: 85cc9ab7f67b73234821a022ac7751cf021464be
Author: Randy Palamar
Date:   Tue, 24 Jun 2025 07:44:48 -0600

lib: ensure scratch space is locked while reading output

Diffstat:
Mhelpers/ogl_beamformer_lib.c | 24++++++++++++++++--------
1 file changed, 16 insertions(+), 8 deletions(-)

diff --git a/helpers/ogl_beamformer_lib.c b/helpers/ogl_beamformer_lib.c @@ -358,6 +358,20 @@ beamformer_export_buffer(BeamformerExportContext export_context) return result; } +function b32 +beamformer_read_output(void *out, iz size, i32 timeout_ms) +{ + b32 result = 0; + if (try_wait_sync(BeamformerSharedMemoryLockKind_ExportSync, timeout_ms)) { + if (lib_try_lock(BeamformerSharedMemoryLockKind_ScratchSpace, 0)) { + mem_copy(out, (u8 *)g_bp + BEAMFORMER_SCRATCH_OFF, size); + lib_release_lock(BeamformerSharedMemoryLockKind_ScratchSpace); + result = 1; + } + } + return result; +} + b32 beamform_data_synchronized(void *data, u32 data_size, u32 output_points[3], f32 *out_data, i32 timeout_ms) { @@ -381,10 +395,7 @@ beamform_data_synchronized(void *data, u32 data_size, u32 output_points[3], f32 if (beamformer_export_buffer(export) && lib_try_lock(BeamformerSharedMemoryLockKind_DispatchCompute, 0)) { - if (try_wait_sync(BeamformerSharedMemoryLockKind_ExportSync, timeout_ms)) { - mem_copy(out_data, (u8 *)g_bp + BEAMFORMER_SCRATCH_OFF, output_size); - result = 1; - } + result = beamformer_read_output(out_data, output_size, timeout_ms); } } else { g_lib_last_error = BF_LIB_ERR_KIND_EXPORT_SPACE_OVERFLOW; @@ -406,10 +417,7 @@ beamformer_compute_timings(BeamformerComputeStatsTable *output, i32 timeout_ms) if (beamformer_export_buffer(export) && lib_try_lock(BeamformerSharedMemoryLockKind_DispatchCompute, 0)) { - if (try_wait_sync(BeamformerSharedMemoryLockKind_ExportSync, timeout_ms)) { - mem_copy(output, (u8 *)g_bp + BEAMFORMER_SCRATCH_OFF, sizeof(*output)); - result = 1; - } + result = beamformer_read_output(output, sizeof(*output), timeout_ms); } } return result;