ogl_beamforming

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

Commit: d71c12275d7c4330cfec07926ab5d534f6661b46
Parent: f97a6456ebfcd7a7446933c69a9439a3f311cfeb
Author: Randy Palamar
Date:   Tue, 18 Mar 2025 14:02:08 -0600

core: correct sum shader invocation when averaging frames

Diffstat:
Mbeamformer.c | 60+++++++++++++++++++++++-------------------------------------
1 file changed, 23 insertions(+), 37 deletions(-)

diff --git a/beamformer.c b/beamformer.c @@ -31,20 +31,9 @@ make_valid_test_dim(uv3 in) } static BeamformFrameIterator -beamform_frame_iterator(BeamformerCtx *ctx, i32 start_index, i32 stop_index) +beamform_frame_iterator(BeamformerCtx *ctx, u32 start_index, u32 needed_frames) { - ASSERT(start_index < ARRAY_COUNT(ctx->beamform_frames)); - ASSERT(stop_index < ARRAY_COUNT(ctx->beamform_frames)); - ASSERT(stop_index >= 0 || start_index >= 0); - - u32 needed_frames; - if (stop_index < 0 || start_index < 0) - needed_frames = ARRAY_COUNT(ctx->beamform_frames); - else - needed_frames = (u32)(stop_index - start_index) % ARRAY_COUNT(ctx->beamform_frames); - - if (start_index < 0) - start_index = stop_index; + start_index = start_index % ARRAY_COUNT(ctx->beamform_frames); BeamformFrameIterator result; result.frames = ctx->beamform_frames; @@ -56,18 +45,7 @@ beamform_frame_iterator(BeamformerCtx *ctx, i32 start_index, i32 stop_index) } static BeamformFrame * -frame_next_backwards(BeamformFrameIterator *bfi) -{ - BeamformFrame *result = 0; - if (bfi->cursor != bfi->needed_frames) { - u32 index = (bfi->offset - bfi->cursor++) % bfi->capacity; - result = bfi->frames + index; - } - return result; -} - -static BeamformFrame * -frame_next_forwards(BeamformFrameIterator *bfi) +frame_next(BeamformFrameIterator *bfi) { BeamformFrame *result = 0; if (bfi->cursor != bfi->needed_frames) { @@ -444,18 +422,21 @@ do_compute_shader(BeamformerCtx *ctx, Arena arena, BeamformFrame *frame, Compute #endif } break; case CS_SUM: { + ctx->averaged_frame.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)); u32 frame_count = 0; u32 *in_textures = alloc(&arena, u32, MAX_BEAMFORMED_SAVED_FRAMES); - BeamformFrameIterator bfi = beamform_frame_iterator(ctx, ctx->display_frame_index, + BeamformFrameIterator bfi = beamform_frame_iterator(ctx, 1 + base_index - ctx->params->raw.output_points.w, ctx->params->raw.output_points.w); - for (BeamformFrame *frame = frame_next_backwards(&bfi); - frame; - frame = frame_next_backwards(&bfi)) - { - in_textures[frame_count++] = frame->texture; - } + for (BeamformFrame *it = frame_next(&bfi); it; it = frame_next(&bfi)) + in_textures[frame_count++] = it->texture; do_sum_shader(csctx, in_textures, frame_count, 1 / (f32)frame_count, ctx->averaged_frame.texture, ctx->averaged_frame.dim); + ctx->averaged_frame.min_coordinate = frame->min_coordinate; + ctx->averaged_frame.max_coordinate = frame->max_coordinate; + ctx->averaged_frame.compound_count = frame->compound_count; } break; default: ASSERT(0); } @@ -670,9 +651,11 @@ DEBUG_EXPORT BEAMFORMER_COMPLETE_COMPUTE_FN(beamformer_complete_compute) frame->das_shader_id = ctx->params->raw.das_shader_id; frame->compound_count = ctx->params->raw.dec_data_dim.z; + b32 did_sum_shader = 0; u32 stage_count = ctx->params->compute_stages_count; ComputeShaderID *stages = ctx->params->compute_stages; for (u32 i = 0; i < stage_count; i++) { + did_sum_shader |= stages[i] == CS_SUM; frame->timer_active[stages[i]] = 1; glBeginQuery(GL_TIME_ELAPSED, frame->timer_ids[stages[i]]); do_compute_shader(ctx, arena, frame, stages[i]); @@ -691,6 +674,12 @@ DEBUG_EXPORT BEAMFORMER_COMPLETE_COMPUTE_FN(beamformer_complete_compute) frame->compute_times[i] = (f32)ns / 1e9; } + if (did_sum_shader) { + ctx->averaged_frame.ready_to_present = 1; + /* TODO(rnp): not really sure what to do here */ + mem_copy(frame->compute_times, ctx->averaged_frame.compute_times, + sizeof(frame->compute_times)); + } frame->ready_to_present = 1; cs->processing_compute = 0; @@ -784,11 +773,8 @@ DEBUG_EXPORT BEAMFORMER_FRAME_STEP_FN(beamformer_frame_step) } BeamformFrameIterator bfi = beamform_frame_iterator(ctx, ctx->display_frame_index, - ctx->next_render_frame_index); - for (BeamformFrame *frame = frame_next_forwards(&bfi); - frame; - frame = frame_next_forwards(&bfi)) - { + ctx->next_render_frame_index - ctx->display_frame_index); + for (BeamformFrame *frame = frame_next(&bfi); frame; frame = frame_next(&bfi)) { if (frame->in_flight && frame->ready_to_present) { frame->in_flight = 0; ctx->display_frame_index = (bfi.offset + bfi.cursor - 1) % bfi.capacity;