ogl_beamforming

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

Commit: eb7994cd9cce632a6790824f2438aa44926100ef
Parent: ba381987f7b3e110fc2717b88859f3371fba4c0a
Author: Randy Palamar
Date:   Thu, 12 Mar 2026 15:59:09 -0600

core: fix library frame tagging; merge compute and indirect compute context

Diffstat:
Mbeamformer_core.c | 32++++++++++----------------------
Mbeamformer_shared_memory.c | 7+------
Mlib/ogl_beamformer_lib.c | 4++--
3 files changed, 13 insertions(+), 30 deletions(-)

diff --git a/beamformer_core.c b/beamformer_core.c @@ -200,19 +200,6 @@ push_compute_timing_info(ComputeTimingTable *t, ComputeTimingInfo info) t->buffer[index] = info; } -function b32 -fill_frame_compute_work(BeamformerCtx *ctx, BeamformWork *work, BeamformerViewPlaneTag plane, - u32 parameter_block, b32 indirect) -{ - b32 result = work != 0; - if (result) { - work->kind = indirect? BeamformerWorkKind_ComputeIndirect : BeamformerWorkKind_Compute; - work->lock = BeamformerSharedMemoryLockKind_DispatchCompute; - work->compute_context.parameter_block = parameter_block; - } - return result; -} - function uv3 layout_for_output(iv3 points) { @@ -1081,12 +1068,9 @@ complete_queue(BeamformerCtx *ctx, BeamformWorkQueue *q, Arena *arena) beamformer_filter_update(cp->filters + slot, fctx->parameters, block, slot, *arena); }break; - case BeamformerWorkKind_ComputeIndirect:{ - fill_frame_compute_work(ctx, work, work->compute_indirect_context.view_plane, - work->compute_indirect_context.parameter_block, 1); - } /* FALLTHROUGH */ - - case BeamformerWorkKind_Compute:{ + case BeamformerWorkKind_ComputeIndirect: + case BeamformerWorkKind_Compute: + { push_compute_timing_info(ctx->compute_timing_table, (ComputeTimingInfo){.kind = ComputeTimingInfoKind_ComputeFrameBegin}); @@ -1096,7 +1080,7 @@ complete_queue(BeamformerCtx *ctx, BeamformWorkQueue *q, Arena *arena) beamformer_commit_parameter_block(ctx, cp, block, *arena); } - post_sync_barrier(ctx->shared_memory, work->lock); + post_sync_barrier(ctx->shared_memory, BeamformerSharedMemoryLockKind_DispatchCompute); u32 dirty_programs = atomic_swap_u32(&cp->dirty_programs, 0); static_assert(ISPOWEROF2(BeamformerMaxComputeShaderStages), @@ -1134,6 +1118,7 @@ complete_queue(BeamformerCtx *ctx, BeamformWorkQueue *q, Arena *arena) BeamformerFrame *frame = beamformer_frame_next(cs, cp->output_points, cp->iq_pipeline, reserved_frame_size); frame->acquisition_kind = cp->acquisition_kind; frame->compound_count = cp->acquisition_count; + frame->view_plane_tag = work->compute_context.view_plane; mem_copy(frame->voxel_transform.E, cp->voxel_transform.E, sizeof(cp->voxel_transform)); VulkanHandle cmd = vk_command_begin(VulkanTimeline_Compute); @@ -1393,9 +1378,12 @@ beamformer_queue_compute(BeamformerCtx *ctx, BeamformerFrame *frame, u32 paramet if (!sm->live_imaging_parameters.active && beamformer_shared_memory_take_lock(sm, (i32)dispatch_lock, 0)) { BeamformWork *work = beamform_work_queue_push(ctx->beamform_work_queue); - BeamformerViewPlaneTag tag = frame ? frame->view_plane_tag : 0; - if (fill_frame_compute_work(ctx, work, tag, parameter_block, 0)) + if (work) { + work->kind = BeamformerWorkKind_Compute; + work->compute_context.view_plane = frame ? frame->view_plane_tag : 0; + work->compute_context.parameter_block = parameter_block; beamform_work_queue_push_commit(ctx->beamform_work_queue); + } } os_wake_all_waiters(&ctx->compute_worker.sync_variable); } diff --git a/beamformer_shared_memory.c b/beamformer_shared_memory.c @@ -37,13 +37,9 @@ typedef enum {BEAMFORMER_SHARED_MEMORY_LOCKS BeamformerSharedMemoryLockKind_Coun #undef X typedef struct { - u32 parameter_block; -} BeamformerComputeWorkContext; - -typedef struct { BeamformerViewPlaneTag view_plane; u32 parameter_block; -} BeamformerComputeIndirectWorkContext; +} BeamformerComputeWorkContext; /* NOTE: discriminated union based on type */ typedef struct { @@ -52,7 +48,6 @@ typedef struct { union { void *generic; BeamformerComputeWorkContext compute_context; - BeamformerComputeIndirectWorkContext compute_indirect_context; BeamformerCreateFilterContext create_filter_context; BeamformerExportContext export_context; BeamformerShaderKind reload_shader; diff --git a/lib/ogl_beamformer_lib.c b/lib/ogl_beamformer_lib.c @@ -534,8 +534,8 @@ beamformer_push_data_with_compute(void *data, u32 data_size, u32 image_plane_tag BeamformWork *work = try_push_work_queue(); if (work) { work->kind = BeamformerWorkKind_ComputeIndirect; - work->compute_indirect_context.view_plane = image_plane_tag; - work->compute_indirect_context.parameter_block = parameter_slot; + work->compute_context.view_plane = image_plane_tag; + work->compute_context.parameter_block = parameter_slot; beamform_work_queue_push_commit(&g_beamformer_library_context.bp->external_work_queue); beamformer_flush_commands(); result = 1;