ogl_beamforming

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

Commit: 9f39417043da0629c2a161ef145a8a9677f695b4
Parent: ff26061020309898300211e413f00731f09953c9
Author: Randy Palamar
Date:   Thu, 20 Feb 2025 10:34:12 -0700

fix a potential issue if rf_raw_dim was changed when decoded_data_dim was not

I'm not entirely convinced this is possible but this will add an
extra safety ensurance just in case.

Diffstat:
Mbeamformer.c | 31++++++++++++++++++-------------
Mutil.c | 6++++++
2 files changed, 24 insertions(+), 13 deletions(-)

diff --git a/beamformer.c b/beamformer.c @@ -105,12 +105,11 @@ alloc_shader_storage(BeamformerCtx *ctx, Arena a) { ComputeShaderCtx *cs = &ctx->csctx; BeamformerParameters *bp = &ctx->params->raw; - uv4 dec_data_dim = bp->dec_data_dim; - uv2 rf_raw_dim = bp->rf_raw_dim; - ctx->csctx.dec_data_dim = dec_data_dim; - ctx->csctx.rf_raw_dim = rf_raw_dim; - size rf_raw_size = rf_raw_dim.x * rf_raw_dim.y * sizeof(i16); - size rf_decoded_size = decoded_data_size(cs); + + uv4 dec_data_dim = bp->dec_data_dim; + uv2 rf_raw_dim = bp->rf_raw_dim; + cs->dec_data_dim = dec_data_dim; + cs->rf_raw_dim = rf_raw_dim; glDeleteBuffers(ARRAY_COUNT(cs->rf_data_ssbos), cs->rf_data_ssbos); glCreateBuffers(ARRAY_COUNT(cs->rf_data_ssbos), cs->rf_data_ssbos); @@ -128,15 +127,18 @@ alloc_shader_storage(BeamformerCtx *ctx, Arena a) break; } + size rf_raw_size = rf_raw_dim.x * rf_raw_dim.y * sizeof(i16); size full_rf_buf_size = ARRAY_COUNT(cs->raw_data_fences) * rf_raw_size; + glDeleteBuffers(1, &cs->raw_data_ssbo); glCreateBuffers(1, &cs->raw_data_ssbo); glNamedBufferStorage(cs->raw_data_ssbo, full_rf_buf_size, 0, storage_flags); - LABEL_GL_OBJECT(GL_BUFFER, cs->raw_data_ssbo, s8("Raw_Data_SSBO")); + LABEL_GL_OBJECT(GL_BUFFER, cs->raw_data_ssbo, s8("Raw_RF_SSBO")); + size rf_decoded_size = decoded_data_size(cs); Stream label = stream_alloc(&a, 256); - stream_append_s8(&label, s8("RF_SSBO_")); - u32 s_widx = label.widx; + stream_append_s8(&label, s8("Decoded_RF_SSBO_")); + u32 s_widx = label.widx; for (u32 i = 0; i < ARRAY_COUNT(cs->rf_data_ssbos); i++) { glNamedBufferStorage(cs->rf_data_ssbos[i], rf_decoded_size, 0, 0); stream_append_u64(&label, i); @@ -152,6 +154,7 @@ alloc_shader_storage(BeamformerCtx *ctx, Arena a) case GL_VENDOR_INTEL: cs->raw_data_arena.beg = glMapNamedBufferRange(cs->raw_data_ssbo, 0, full_rf_buf_size, map_flags); + cs->raw_data_arena.end = cs->raw_data_arena.beg + full_rf_buf_size; break; case GL_VENDOR_NVIDIA: cs->raw_data_arena = ctx->platform.alloc_arena(cs->raw_data_arena, full_rf_buf_size); @@ -628,10 +631,6 @@ DEBUG_EXPORT BEAMFORMER_FRAME_STEP_FN(beamformer_frame_step) * next frame to try again */ if (work) { ComputeShaderCtx *cs = &ctx->csctx; - if (!uv4_equal(cs->dec_data_dim, bp->dec_data_dim)) { - alloc_shader_storage(ctx, *arena); - /* TODO: we may need to invalidate all queue items here */ - } if (ctx->params->export_next_frame) { /* TODO: we don't really want the beamformer opening/closing files */ @@ -653,6 +652,12 @@ DEBUG_EXPORT BEAMFORMER_FRAME_STEP_FN(beamformer_frame_step) work->compute_ctx.frame = frame; } + if (!uv2_equal(cs->rf_raw_dim, bp->rf_raw_dim) || + !uv4_equal(cs->dec_data_dim, bp->dec_data_dim)) + { + alloc_shader_storage(ctx, *arena); + } + u32 raw_index = work->compute_ctx.raw_data_ssbo_index; uv2 rf_raw_dim = cs->rf_raw_dim; size rf_raw_size = rf_raw_dim.x * rf_raw_dim.y * sizeof(i16); diff --git a/util.c b/util.c @@ -319,6 +319,12 @@ round_down_power_of_2(u32 a) } static b32 +uv2_equal(uv2 a, uv2 b) +{ + return a.x == b.x && a.y == b.y; +} + +static b32 uv3_equal(uv3 a, uv3 b) { return a.x == b.x && a.y == b.y && a.z == b.z;