ogl_beamforming

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

Commit: 5fbdcb75d46cba74354b8cdf7b7e27450edd3ff2
Parent: 2c765d746b92c2f5bd2443ed546abd8e2aaeb86e
Author: Randy Palamar
Date:   Mon,  2 Jun 2025 06:39:02 -0600

core: use sentinel shader reload link, remove duplicate error message

Diffstat:
Mbeamformer.c | 29++++++++++++++---------------
Mstatic.c | 2++
2 files changed, 16 insertions(+), 15 deletions(-)

diff --git a/beamformer.c b/beamformer.c @@ -388,7 +388,7 @@ do_compute_shader(BeamformerCtx *ctx, Arena arena, BeamformComputeFrame *frame, } function s8 -shader_text_with_header(ShaderReloadContext *ctx, OS *os, Arena *arena, char *path) +shader_text_with_header(ShaderReloadContext *ctx, OS *os, Arena *arena) { Stream sb = arena_stream(*arena); stream_append_s8s(&sb, s8("#version 460 core\n\n"), ctx->header); @@ -431,8 +431,8 @@ shader_text_with_header(ShaderReloadContext *ctx, OS *os, Arena *arena, char *pa stream_append_s8(&sb, s8("\n#line 1\n")); s8 result = arena_stream_commit(arena, &sb); - if (path) { - s8 file = os->read_whole_file(arena, path); + if (ctx->path.len) { + s8 file = os->read_whole_file(arena, (c8 *)ctx->path.data); assert(file.data == result.data + result.len); result.len += file.len; } @@ -442,16 +442,20 @@ shader_text_with_header(ShaderReloadContext *ctx, OS *os, Arena *arena, char *pa DEBUG_EXPORT BEAMFORMER_RELOAD_SHADER_FN(beamformer_reload_shader) { - i32 shader_count = 1 + (src->link != 0); + i32 shader_count = 1; + ShaderReloadContext *link = src->link; + while (link != src) { shader_count++; link = link->link; } + s8 *shader_texts = push_array(&arena, s8, shader_count); u32 *shader_types = push_array(&arena, u32, shader_count); - if (src->link) { - shader_texts[0] = shader_text_with_header(src->link, &ctx->os, &arena, (c8 *)src->link->path.data); - shader_types[0] = src->link->gl_type; - } - shader_texts[shader_count - 1] = shader_text_with_header(src, &ctx->os, &arena, (c8 *)src->path.data); - shader_types[shader_count - 1] = src->gl_type; + i32 index = 0; + do { + shader_texts[index] = shader_text_with_header(link, &ctx->os, &arena); + shader_types[index] = link->gl_type; + index++; + link = link->link; + } while (link != src); u32 new_program = load_shader(&ctx->os, arena, shader_texts, shader_types, shader_count, shader_name); if (new_program) { @@ -472,12 +476,7 @@ reload_compute_shader(BeamformerCtx *ctx, ShaderReloadContext *src, s8 name_extr if (result) { glUseProgram(*src->shader); glBindBufferBase(GL_UNIFORM_BUFFER, 0, ctx->csctx.shared_ubo); - } else { - sb.widx = 0; - stream_append_s8s(&sb, s8("failed to load: "), src->path, name_extra, s8("\n")); - ctx->os.write_file(ctx->os.error_handle, stream_to_s8(&sb)); } - return result; } diff --git a/static.c b/static.c @@ -346,6 +346,7 @@ setup_beamformer(BeamformerCtx *ctx, Arena *memory) src->shader = ctx->csctx.programs + ShaderKind_##e; \ src->gl_type = GL_COMPUTE_SHADER; \ src->kind = ShaderKind_##e; \ + src->link = src; \ os_add_file_watch(&ctx->os, memory, src->path, reload_shader_indirect, (iptr)src); \ reload_shader_indirect(&ctx->os, src->path, (iptr)src, *memory); \ } while (0); @@ -392,6 +393,7 @@ setup_beamformer(BeamformerCtx *ctx, Arena *memory) "\n#line 1\n"); render_2d->link = push_struct(memory, typeof(*render_2d)); render_2d->link->gl_type = GL_VERTEX_SHADER; + render_2d->link->link = render_2d; render_2d->link->header = s8("" "layout(location = 0) in vec2 v_position;\n" "layout(location = 1) in vec2 v_texture_coordinate;\n"