Commit: 33b71efec958d000371c5d884b13bba6d671c2ab
Parent: 8f2090b23db12a1eb3d00073924cea207d0a2b4e
Author: Randy Palamar
Date: Mon, 14 Apr 2025 09:04:12 -0600
core: add util_gl.c so that glad.h doesn't need to be included everywhere
Diffstat:
M | beamformer.h | | | 1 | + |
M | util.c | | | 79 | ------------------------------------------------------------------------------- |
A | util_gl.c | | | 79 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
3 files changed, 80 insertions(+), 79 deletions(-)
diff --git a/beamformer.h b/beamformer.h
@@ -9,6 +9,7 @@
#include <rlgl.h>
#include "util.h"
+#include "util_gl.c"
enum gl_vendor_ids {
GL_VENDOR_AMD,
diff --git a/util.c b/util.c
@@ -807,82 +807,3 @@ fill_hadamard_transpose(i32 *out, i32 *tmp, u32 dim)
kronecker_product(out, tmp, (uv2){.x = dim, .y = dim}, hadamard_12_12_transpose,
(uv2){.x = 12, .y = 12});
}
-
-function u32
-compile_shader(OS *os, Arena a, u32 type, s8 shader, s8 name)
-{
- u32 sid = glCreateShader(type);
- glShaderSource(sid, 1, (const char **)&shader.data, (int *)&shader.len);
- glCompileShader(sid);
-
- i32 res = 0;
- glGetShaderiv(sid, GL_COMPILE_STATUS, &res);
-
- if (res == GL_FALSE) {
- Stream buf = arena_stream(&a);
- stream_append_s8(&buf, name);
- stream_append_s8(&buf, s8(": failed to compile\n"));
-
- i32 len = 0, out_len = 0;
- glGetShaderiv(sid, GL_INFO_LOG_LENGTH, &len);
- glGetShaderInfoLog(sid, len, &out_len, (char *)(buf.data + buf.widx));
- stream_commit(&buf, out_len);
- glDeleteShader(sid);
- os->write_file(os->stderr, stream_to_s8(&buf));
-
- sid = 0;
- }
-
- return sid;
-}
-
-function u32
-link_program(OS *os, Arena a, u32 *shader_ids, u32 shader_id_count)
-{
- i32 success = 0;
- u32 result = glCreateProgram();
- for (u32 i = 0; i < shader_id_count; i++)
- glAttachShader(result, shader_ids[i]);
- glLinkProgram(result);
- glGetProgramiv(result, GL_LINK_STATUS, &success);
- if (success == GL_FALSE) {
- i32 len = 0;
- Stream buf = arena_stream(&a);
- stream_append_s8(&buf, s8("shader link error: "));
- glGetProgramInfoLog(result, buf.cap - buf.widx, &len, (c8 *)(buf.data + buf.widx));
- stream_reset(&buf, len);
- stream_append_byte(&buf, '\n');
- os->write_file(os->stderr, stream_to_s8(&buf));
- glDeleteProgram(result);
- result = 0;
- }
- return result;
-}
-
-function u32
-load_shader(OS *os, Arena arena, b32 compute, s8 vs_text, s8 fs_text, s8 cs_text, s8 info_name, s8 label)
-{
- 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);
- }
-
- if (result) {
- Stream buf = arena_stream(&arena);
- stream_append_s8(&buf, s8("loaded: "));
- stream_append_s8(&buf, info_name);
- stream_append_byte(&buf, '\n');
- os->write_file(os->stderr, stream_to_s8(&buf));
- LABEL_GL_OBJECT(GL_PROGRAM, result, label);
- }
-
- return result;
-}
diff --git a/util_gl.c b/util_gl.c
@@ -0,0 +1,79 @@
+/* See LICENSE for license details. */
+function u32
+compile_shader(OS *os, Arena a, u32 type, s8 shader, s8 name)
+{
+ u32 sid = glCreateShader(type);
+ glShaderSource(sid, 1, (const char **)&shader.data, (int *)&shader.len);
+ glCompileShader(sid);
+
+ i32 res = 0;
+ glGetShaderiv(sid, GL_COMPILE_STATUS, &res);
+
+ if (res == GL_FALSE) {
+ Stream buf = arena_stream(&a);
+ stream_append_s8(&buf, name);
+ stream_append_s8(&buf, s8(": failed to compile\n"));
+
+ i32 len = 0, out_len = 0;
+ glGetShaderiv(sid, GL_INFO_LOG_LENGTH, &len);
+ glGetShaderInfoLog(sid, len, &out_len, (char *)(buf.data + buf.widx));
+ stream_commit(&buf, out_len);
+ glDeleteShader(sid);
+ os->write_file(os->stderr, stream_to_s8(&buf));
+
+ sid = 0;
+ }
+
+ return sid;
+}
+
+function u32
+link_program(OS *os, Arena a, u32 *shader_ids, u32 shader_id_count)
+{
+ i32 success = 0;
+ u32 result = glCreateProgram();
+ for (u32 i = 0; i < shader_id_count; i++)
+ glAttachShader(result, shader_ids[i]);
+ glLinkProgram(result);
+ glGetProgramiv(result, GL_LINK_STATUS, &success);
+ if (success == GL_FALSE) {
+ i32 len = 0;
+ Stream buf = arena_stream(&a);
+ stream_append_s8(&buf, s8("shader link error: "));
+ glGetProgramInfoLog(result, buf.cap - buf.widx, &len, (c8 *)(buf.data + buf.widx));
+ stream_reset(&buf, len);
+ stream_append_byte(&buf, '\n');
+ os->write_file(os->stderr, stream_to_s8(&buf));
+ glDeleteProgram(result);
+ result = 0;
+ }
+ return result;
+}
+
+function u32
+load_shader(OS *os, Arena arena, b32 compute, s8 vs_text, s8 fs_text, s8 cs_text, s8 info_name, s8 label)
+{
+ 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);
+ }
+
+ if (result) {
+ Stream buf = arena_stream(&arena);
+ stream_append_s8(&buf, s8("loaded: "));
+ stream_append_s8(&buf, info_name);
+ stream_append_byte(&buf, '\n');
+ os->write_file(os->stderr, stream_to_s8(&buf));
+ LABEL_GL_OBJECT(GL_PROGRAM, result, label);
+ }
+
+ return result;
+}