Commit: 2d06c4b2b5174951a64d9b72f828b71d42958f69
Parent: af2012c846e6e7956861065db26ed6e0fb62ce3b
Author: Randy Palamar
Date: Sat, 31 May 2025 15:27:16 -0600
util_gl: simplify load_shader
Diffstat:
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;