ogl_beamforming

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

Commit: 38170ef98620a2f05101d029a5ddd4a3ecb6321f
Parent: 22c274a875d377725f40cdc3b74ca89bba21c5b3
Author: Randy Palamar
Date:   Thu, 15 Aug 2024 20:44:56 -0600

add skeleton for hooking up cuda lib

Diffstat:
Mbeamformer.c | 13+++++++++++++
Mbeamformer.h | 24++++++++++++++++++++++++
Mmain.c | 18++++++++++++++++++
3 files changed, 55 insertions(+), 0 deletions(-)

diff --git a/beamformer.c b/beamformer.c @@ -55,6 +55,7 @@ alloc_shader_storage(BeamformerCtx *ctx, Arena a) glUnmapNamedBuffer(cs->raw_data_ssbo); storage_flags |= GL_MAP_WRITE_BIT|GL_MAP_PERSISTENT_BIT; case GL_VENDOR_NVIDIA: + /* TODO: does the cuda buffer need to be unregistered? */ break; } @@ -72,6 +73,11 @@ alloc_shader_storage(BeamformerCtx *ctx, Arena a) break; case GL_VENDOR_NVIDIA: cs->raw_data_arena = os_alloc_arena(cs->raw_data_arena, full_rf_buf_size); + if (g_cuda_lib_functions[CLF_REGISTER_BUFFER]) { + cuda_register_buffer *fn = g_cuda_lib_functions[CLF_REGISTER_BUFFER]; + /* TODO: this needs the correct parameters */ + fn(NULL, cs->raw_data_ssbo); + } break; } @@ -119,6 +125,13 @@ do_compute_shader(BeamformerCtx *ctx, enum compute_shaders shader) csctx->last_output_ssbo_index = !csctx->last_output_ssbo_index; csctx->raw_data_index = (csctx->raw_data_index + 1) % ARRAY_COUNT(csctx->raw_data_fences); break; + case CS_CUDA_DECODE_AND_DEMOD: + if (g_cuda_lib_functions[CLF_DECODE_AND_DEMOD]) { + cuda_decode_and_demod *fn = g_cuda_lib_functions[CLF_DECODE_AND_DEMOD]; + /* TODO: fill in correct params */ + fn(1, 2, 3); + } + break; case CS_LPF: glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, csctx->rf_data_ssbos[input_ssbo_idx]); glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 2, csctx->rf_data_ssbos[output_ssbo_idx]); diff --git a/beamformer.h b/beamformer.h @@ -43,6 +43,8 @@ typedef union { enum compute_shaders { CS_HADAMARD, + /* TODO: Probably this should be split up */ + CS_CUDA_DECODE_AND_DEMOD, // CS_HERCULES, CS_LPF, CS_MIN_MAX, @@ -167,4 +169,26 @@ typedef struct { BeamformerParametersFull *params; } BeamformerCtx; +enum cuda_lib_functions { + CLF_REGISTER_BUFFER, + CLF_DECODE_AND_DEMOD, + CLF_LAST +}; + +/* TODO: fill in cuda lib entry points (function names) */ +static char *cuda_lib_function_names[CLF_LAST] = { + [CLF_REGISTER_BUFFER] = "cuda_register_buffers", + [CLF_DECODE_AND_DEMOD] = "cuda_decode_and_demod", +}; + +/* TODO: fill in portable function type params */ +#define CUDA_LIB_NAME "libcuda.dll" +typedef void cuda_register_buffer(void *, u32); +typedef void cuda_decode_and_demod(u32, u32, u32); + +/* NOTE: Array of Function Pointers used for accessing cuda lib functions */ +/* TODO: robustness: replace with function stubs when not found */ +static void *g_cuda_lib_functions[CLF_LAST]; +static os_library_handle g_cuda_lib_handle; + #endif /*_BEAMFORMER_H_ */ diff --git a/main.c b/main.c @@ -111,6 +111,9 @@ reload_shaders(BeamformerCtx *ctx, Arena a) { ComputeShaderCtx *csctx = &ctx->csctx; for (u32 i = 0; i < ARRAY_COUNT(csctx->programs); i++) { + if (!compute_shader_paths[i]) + continue; + Arena tmp = a; os_file_stats fs = os_get_file_stats(compute_shader_paths[i]); s8 shader_text = os_read_file(&tmp, compute_shader_paths[i], fs.filesize); @@ -183,6 +186,21 @@ main(void) } } + switch (ctx.gl_vendor_id) { + case GL_VENDOR_AMD: + case GL_VENDOR_INTEL: + break; + case GL_VENDOR_NVIDIA: + g_cuda_lib_handle = os_load_library(CUDA_LIB_NAME); + if (!g_cuda_lib_handle) + break; + for (u32 i = 0; i < CLF_LAST; i++) { + void *fn = os_lookup_dynamic_symbol(g_cuda_lib_handle, + cuda_lib_function_names[i]); + g_cuda_lib_functions[i] = fn; + } + } + /* NOTE: set up OpenGL debug logging */ glDebugMessageCallback(gl_debug_logger, NULL); #ifdef _DEBUG