Commit: 38170ef98620a2f05101d029a5ddd4a3ecb6321f
Parent: 22c274a875d377725f40cdc3b74ca89bba21c5b3
Author: Randy Palamar
Date: Thu, 15 Aug 2024 20:44:56 -0600
add skeleton for hooking up cuda lib
Diffstat:
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