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:
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