ogl_beamforming

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

Commit: f7837333fdb697f71dc2b6d848983073029ac199
Parent: ffe4651e49e8d84fe5659da4e93c2fa325207a09
Author: Randy Palamar
Date:   Tue, 25 Mar 2025 10:07:34 -0600

core: actually display the most up to date averaged frame

Diffstat:
Mbeamformer.c | 19+++++++++++++------
1 file changed, 13 insertions(+), 6 deletions(-)

diff --git a/beamformer.c b/beamformer.c @@ -256,6 +256,7 @@ do_sum_shader(ComputeShaderCtx *cs, u32 *in_textures, u32 in_texture_count, f32 { /* NOTE: zero output before summing */ glClearTexImage(out_texture, 0, GL_RED, GL_FLOAT, 0); + glMemoryBarrier(GL_TEXTURE_UPDATE_BARRIER_BIT); glBindImageTexture(0, out_texture, 0, GL_TRUE, 0, GL_READ_WRITE, GL_RG32F); glUniform1f(cs->sum_prescale_id, in_scale); @@ -415,15 +416,17 @@ do_compute_shader(BeamformerCtx *ctx, Arena arena, BeamformFrame *frame, Compute ORONE(frame->dim.y), ORONE(frame->dim.z / 32)); #endif + glMemoryBarrier(GL_TEXTURE_UPDATE_BARRIER_BIT|GL_SHADER_IMAGE_ACCESS_BARRIER_BIT); } break; case CS_SUM: { - u32 aframe_index = atomic_inc(&ctx->averaged_frame_index, 1); - aframe_index %= ARRAY_COUNT(ctx->averaged_frames); + u32 aframe_index = ctx->averaged_frame_index % ARRAY_COUNT(ctx->averaged_frames); BeamformFrame *aframe = ctx->averaged_frames + aframe_index; aframe->ready_to_present = 0; /* TODO(rnp): hack we need a better way of specifying which frames to sum; * this is fine for rolling averaging but what if we want to do something else */ - u32 base_index = CLAMP(frame - ctx->beamform_frames, 0, ARRAY_COUNT(ctx->beamform_frames)); + ASSERT(frame >= ctx->beamform_frames); + ASSERT(frame < ctx->beamform_frames + ARRAY_COUNT(ctx->beamform_frames)); + u32 base_index = (u32)(frame - ctx->beamform_frames); u32 to_average = ctx->params->raw.output_points.w; u32 frame_count = 0; u32 *in_textures = alloc(&arena, u32, MAX_BEAMFORMED_SAVED_FRAMES); @@ -431,6 +434,9 @@ do_compute_shader(BeamformerCtx *ctx, Arena arena, BeamformFrame *frame, Compute to_average); for (BeamformFrame *it = frame_next(&bfi); it; it = frame_next(&bfi)) in_textures[frame_count++] = it->texture; + + ASSERT(to_average == frame_count); + do_sum_shader(csctx, in_textures, frame_count, 1 / (f32)frame_count, aframe->texture, aframe->dim); aframe->min_coordinate = frame->min_coordinate; @@ -691,12 +697,13 @@ DEBUG_EXPORT BEAMFORMER_COMPLETE_COMPUTE_FN(beamformer_complete_compute) } if (did_sum_shader) { - u32 aframe_index = !(ctx->averaged_frame_index % - ARRAY_COUNT(ctx->averaged_frames)); + u32 aframe_index = (ctx->averaged_frame_index % + ARRAY_COUNT(ctx->averaged_frames)); ctx->averaged_frames[aframe_index].ready_to_present = 1; /* TODO(rnp): not really sure what to do here */ mem_copy(ctx->averaged_frame_compute_stats[aframe_index].times, frame->stats->times, sizeof(frame->stats->times)); + atomic_inc(&ctx->averaged_frame_index, 1); } frame->store->ready_to_present = 1; cs->processing_compute = 0; @@ -806,7 +813,7 @@ DEBUG_EXPORT BEAMFORMER_FRAME_STEP_FN(beamformer_frame_step) BeamformFrame *frame_to_draw; ComputeShaderStats *frame_compute_stats; if (bp->output_points.w > 1) { - u32 a_index = ctx->averaged_frame_index % ARRAY_COUNT(ctx->averaged_frames); + u32 a_index = !(ctx->averaged_frame_index % ARRAY_COUNT(ctx->averaged_frames)); frame_to_draw = ctx->averaged_frames + a_index; frame_compute_stats = ctx->averaged_frame_compute_stats + a_index; } else {