ogl_beamforming

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

Commit: 2d06c4b2b5174951a64d9b72f828b71d42958f69
Parent: af2012c846e6e7956861065db26ed6e0fb62ce3b
Author: Randy Palamar
Date:   Sat, 31 May 2025 15:27:16 -0600

util_gl: simplify load_shader

Diffstat:
Mbeamformer.c | 4++--
Mbeamformer.h | 5++---
Mstatic.c | 4++--
Mutil_gl.c | 28+++++++++++++---------------
4 files changed, 19 insertions(+), 22 deletions(-)

diff --git a/beamformer.c b/beamformer.c @@ -456,8 +456,8 @@ reload_compute_shader(BeamformerCtx *ctx, s8 path, s8 extra, ComputeShaderReload Stream sb = arena_stream(tmp); stream_append_s8s(&sb, path, extra); s8 info = arena_stream_commit(&tmp, &sb); - u32 new_program = load_shader(&ctx->os, tmp, 1, s8(""), s8(""), shader_text, - info, csr->label); + u32 new_program = load_shader(&ctx->os, tmp, (s8 []){shader_text}, + (u32 []){GL_COMPUTE_SHADER}, 1, info); if (new_program) { glDeleteProgram(cs->programs[csr->shader]); cs->programs[csr->shader] = new_program; diff --git a/beamformer.h b/beamformer.h @@ -198,10 +198,9 @@ typedef struct { struct ComputeShaderReloadContext { BeamformerCtx *beamformer_ctx; - s8 label; - s8 path; + s8 path; + b32 needs_header; ComputeShaderID shader; - b32 needs_header; }; #define BEAMFORMER_FRAME_STEP_FN(name) void name(BeamformerCtx *ctx, Arena *arena, \ diff --git a/static.c b/static.c @@ -212,7 +212,8 @@ function FILE_WATCH_CALLBACK_FN(reload_render_shader) fragment.data -= header.len; fragment.len += header.len; ASSERT(fragment.data == header.data); - u32 new_program = load_shader(os, tmp, 0, vertex, fragment, s8(""), path, s8("Render Shader")); + u32 new_program = load_shader(os, tmp, (s8 []){vertex, fragment}, + (u32 []){GL_VERTEX_SHADER, GL_FRAGMENT_SHADER}, 2, path); if (new_program) { glDeleteProgram(ctx->shader); ctx->shader = new_program; @@ -366,7 +367,6 @@ setup_beamformer(BeamformerCtx *ctx, Arena *memory) #define X(e, sn, f, nh, pretty_name) do if (s8(f).len > 0) { \ ComputeShaderReloadContext *csr = push_struct(memory, typeof(*csr)); \ csr->beamformer_ctx = ctx; \ - csr->label = s8("CS_" #e); \ csr->shader = sn; \ csr->needs_header = nh; \ csr->path = s8(static_path_join("shaders", f ".glsl")); \ diff --git a/util_gl.c b/util_gl.c @@ -27,11 +27,11 @@ compile_shader(OS *os, Arena a, u32 type, s8 shader, s8 name) } function u32 -link_program(OS *os, Arena a, u32 *shader_ids, u32 shader_id_count) +link_program(OS *os, Arena a, u32 *shader_ids, i32 shader_id_count) { i32 success = 0; u32 result = glCreateProgram(); - for (u32 i = 0; i < shader_id_count; i++) + for (i32 i = 0; i < shader_id_count; i++) glAttachShader(result, shader_ids[i]); glLinkProgram(result); glGetProgramiv(result, GL_LINK_STATUS, &success); @@ -50,26 +50,24 @@ link_program(OS *os, Arena a, u32 *shader_ids, u32 shader_id_count) } function u32 -load_shader(OS *os, Arena arena, b32 compute, s8 vs_text, s8 fs_text, s8 cs_text, s8 info_name, s8 label) +load_shader(OS *os, Arena arena, s8 *shader_texts, u32 *shader_types, i32 count, s8 name) { u32 result = 0; - if (compute) { - u32 shader_id = compile_shader(os, arena, GL_COMPUTE_SHADER, cs_text, info_name); - if (shader_id) result = link_program(os, arena, (u32 []){shader_id}, 1); - glDeleteShader(shader_id); - } else { - u32 fs_id = compile_shader(os, arena, GL_FRAGMENT_SHADER, fs_text, info_name); - u32 vs_id = compile_shader(os, arena, GL_VERTEX_SHADER, vs_text, info_name); - if (fs_id && vs_id) result = link_program(os, arena, (u32 []){vs_id, fs_id}, 2); - glDeleteShader(fs_id); - glDeleteShader(vs_id); + u32 *ids = push_array(&arena, u32, count); + b32 valid = 1; + for (i32 i = 0; i < count; i++) { + ids[i] = compile_shader(os, arena, shader_types[i], shader_texts[i], name); + valid &= ids[i] != 0; } + if (valid) result = link_program(os, arena, ids, count); + for (i32 i = 0; i < count; i++) glDeleteShader(ids[i]); + if (result) { Stream buf = arena_stream(arena); - stream_append_s8s(&buf, s8("loaded: "), info_name, s8("\n")); + stream_append_s8s(&buf, s8("loaded: "), name, s8("\n")); os->write_file(os->error_handle, stream_to_s8(&buf)); - LABEL_GL_OBJECT(GL_PROGRAM, result, label); + LABEL_GL_OBJECT(GL_PROGRAM, result, name); } return result;