ogl_beamforming

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

Commit: cfe2e822cbba455bafc91e4d149899fd8b9986a1
Parent: dd2cf92dec5f3c9c588f53e77a4d8613198654c2
Author: Randy Palamar
Date:   Wed, 26 Feb 2025 15:31:16 -0700

lib: send raw data size directly in addition to data dimension

Diffstat:
Mbeamformer.c | 17+++++++----------
Mbeamformer.h | 3++-
Mhelpers/ogl_beamformer_lib.c | 41++++++++++++++++++++++++++++-------------
Mhelpers/ogl_beamformer_lib.h | 4----
4 files changed, 37 insertions(+), 28 deletions(-)

diff --git a/beamformer.c b/beamformer.c @@ -138,9 +138,9 @@ alloc_shader_storage(BeamformerCtx *ctx, Arena a) BeamformerParameters *bp = &ctx->params->raw; uv4 dec_data_dim = bp->dec_data_dim; - uv2 rf_raw_dim = bp->rf_raw_dim; + u32 rf_raw_size = ctx->params->raw_data_size; cs->dec_data_dim = dec_data_dim; - cs->rf_raw_dim = rf_raw_dim; + cs->rf_raw_size = rf_raw_size; glDeleteBuffers(ARRAY_COUNT(cs->rf_data_ssbos), cs->rf_data_ssbos); glCreateBuffers(ARRAY_COUNT(cs->rf_data_ssbos), cs->rf_data_ssbos); @@ -158,8 +158,6 @@ alloc_shader_storage(BeamformerCtx *ctx, Arena a) break; } - size rf_raw_size = rf_raw_dim.x * rf_raw_dim.y * sizeof(i16); - glDeleteBuffers(1, &cs->raw_data_ssbo); glCreateBuffers(1, &cs->raw_data_ssbo); glNamedBufferStorage(cs->raw_data_ssbo, rf_raw_size, 0, storage_flags); @@ -570,21 +568,20 @@ DEBUG_EXPORT BEAMFORMER_COMPLETE_COMPUTE_FN(beamformer_complete_compute) #undef X } break; case BW_LOAD_RF_DATA: { - if (!uv2_equal(cs->rf_raw_dim, bp->rf_raw_dim) || + if (cs->rf_raw_size != ctx->params->raw_data_size || !uv4_equal(cs->dec_data_dim, bp->dec_data_dim)) { alloc_shader_storage(ctx, arena); } - size rf_raw_size = cs->rf_raw_dim.x * cs->rf_raw_dim.y * sizeof(i16); void *rf_data_buf = cs->raw_data_arena.beg; - - size rlen = ctx->platform.read_file(work->file_handle, rf_data_buf, rf_raw_size); - if (rlen != rf_raw_size) { + size rlen = ctx->platform.read_file(work->file_handle, rf_data_buf, + cs->rf_raw_size); + if (rlen != cs->rf_raw_size) { stream_append_s8(&ctx->error_stream, s8("Partial Read Occurred: ")); stream_append_i64(&ctx->error_stream, rlen); stream_append_byte(&ctx->error_stream, '/'); - stream_append_i64(&ctx->error_stream, rf_raw_size); + stream_append_i64(&ctx->error_stream, cs->rf_raw_size); stream_append_byte(&ctx->error_stream, '\n'); ctx->platform.write_file(ctx->platform.error_file_handle, stream_to_s8(&ctx->error_stream)); diff --git a/beamformer.h b/beamformer.h @@ -145,6 +145,7 @@ typedef struct { enum compute_shaders compute_stages[16]; u32 compute_stages_count; b32 upload; + u32 raw_data_size; b32 export_next_frame; c8 export_pipe_name[1024]; } BeamformerParametersFull; @@ -213,7 +214,7 @@ typedef struct { b32 processing_compute; uv4 dec_data_dim; - uv2 rf_raw_dim; + u32 rf_raw_size; #define X(idx, name) i32 name ## _id; CS_UNIFORMS diff --git a/helpers/ogl_beamformer_lib.c b/helpers/ogl_beamformer_lib.c @@ -6,6 +6,7 @@ typedef struct { enum compute_shaders compute_stages[16]; u32 compute_stages_count; b32 upload; + u32 raw_data_size; b32 export_next_frame; c8 export_pipe_name[1024]; } BeamformerParametersFull; @@ -15,18 +16,21 @@ typedef struct { char *name; } Pipe; -#define INVALID_FILE (-1) -static volatile BeamformerParametersFull *g_bp; -static Pipe g_pipe = {.file = INVALID_FILE}; +typedef struct { size len; u8 *data; } s8; +#define s8(s) (s8){.len = ARRAY_COUNT(s) - 1, .data = (u8 *)s} #define ARRAY_COUNT(a) (sizeof(a) / sizeof(*a)) -#define MS_TO_S (1000ULL) -#define NS_TO_S (1000ULL * 1000ULL) +#define U32_MAX (0xFFFFFFFFUL) + +#define INVALID_FILE (-1) #define PIPE_RETRY_PERIOD_MS (100ULL) +static volatile BeamformerParametersFull *g_bp; +static Pipe g_pipe = {.file = INVALID_FILE}; + #if defined(__unix__) #include <fcntl.h> #include <poll.h> @@ -298,8 +302,8 @@ set_beamformer_pipeline(char *shm_name, i32 *stages, i32 stages_count) return 1; } -b32 -send_data(char *pipe_name, char *shm_name, i16 *data, uv2 data_dim) +static b32 +send_raw_data(char *pipe_name, char *shm_name, void *data, u32 data_size) { b32 result = g_pipe.file != INVALID_FILE; if (!result) { @@ -311,11 +315,10 @@ send_data(char *pipe_name, char *shm_name, i16 *data, uv2 data_dim) result &= check_shared_memory(shm_name); if (result) { - g_bp->raw.rf_raw_dim = data_dim; - g_bp->upload = 1; + g_bp->raw_data_size = data_size; + g_bp->upload = 1; - size data_size = data_dim.x * data_dim.y * sizeof(i16); - size written = os_write(g_pipe.file, data, data_size); + size written = os_write(g_pipe.file, data, data_size); result = written == data_size; if (!result) { warning_msg("failed to write data to pipe: retrying..."); @@ -337,6 +340,20 @@ send_data(char *pipe_name, char *shm_name, i16 *data, uv2 data_dim) } b32 +send_data(char *pipe_name, char *shm_name, i16 *data, uv2 data_dim) +{ + b32 result = 0; + if (check_shared_memory(shm_name)) { + u64 data_size = data_dim.x * data_dim.y * sizeof(i16); + if (data_size <= U32_MAX) { + g_bp->raw.rf_raw_dim = data_dim; + result = send_raw_data(pipe_name, shm_name, data, data_size); + } + } + return result; +} + +b32 set_beamformer_parameters(char *shm_name, BeamformerParameters *new_bp) { if (!check_shared_memory(shm_name)) @@ -383,8 +400,6 @@ beamform_data_synchronized(char *pipe_name, char *shm_name, i16 *data, uv2 data_ for (u32 i = 0; i < export_name.len; i++) g_bp->export_pipe_name[i] = export_name.data[i]; - g_bp->upload = 1; - b32 result = send_data(pipe_name, shm_name, data, data_dim); if (result) { size output_size = output_points.x * output_points.y * output_points.z * sizeof(f32) * 2; diff --git a/helpers/ogl_beamformer_lib.h b/helpers/ogl_beamformer_lib.h @@ -15,10 +15,6 @@ typedef double f64; typedef ptrdiff_t size; typedef ptrdiff_t iptr; -#define ARRAY_COUNT(a) (sizeof(a) / sizeof(*a)) -typedef struct { size len; u8 *data; } s8; -#define s8(s) (s8){.len = ARRAY_COUNT(s) - 1, .data = (u8 *)s} - #if defined(_WIN32) #define LIB_FN __declspec(dllexport) #else