ogl_beamforming

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

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:
Mbeamformer.h | 1+
Mutil.c | 79-------------------------------------------------------------------------------
Autil_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; +}