ogl_beamforming

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

Commit: c83e4c553332bc4d2bbe4a3ccdd1cfacfcb4af87
Parent: 7af82b9de344becfbb86b6ec3c1cd265480de7db
Author: Randy Palamar
Date:   Sat, 17 Jan 2026 14:15:49 -0700

add and build glslang library for shader compilation

unfortunately this requires a c++ compiler but I don't know of any
other options at the moment

Diffstat:
M.gitmodules | 3+++
Mbuild.c | 69++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----------
Aexternal/glslang | 1+
Aexternal/glslang_local/glslang.cpp | 58++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aexternal/glslang_local/glslang/build_info.h | 12++++++++++++
5 files changed, 132 insertions(+), 11 deletions(-)

diff --git a/.gitmodules b/.gitmodules @@ -1,3 +1,6 @@ +[submodule "external/glslang"] + path = external/glslang + url = https://github.com/KhronosGroup/glslang.git [submodule "external/raylib"] path = external/raylib url = https://github.com/raysan5/raylib.git diff --git a/build.c b/build.c @@ -32,12 +32,14 @@ global char *g_argv0; #define OUTPUT(s) OUTDIR OS_PATH_SEPARATOR s #if COMPILER_MSVC - #define COMMON_FLAGS "-nologo", "-std:c11", "-Fo:" OUTDIR "\\", "-Z7", "-Zo" + #define COMMON_CFLAGS "-std:c11" + #define COMMON_FLAGS "-nologo", "-Fo:" OUTDIR "\\", "-Z7", "-Zo" #define DEBUG_FLAGS "-Od", "-D_DEBUG" #define OPTIMIZED_FLAGS "-O2" #define EXTRA_FLAGS "" #else - #define COMMON_FLAGS "-std=c11", "-pipe", "-Wall" + #define COMMON_CFLAGS "-std=c11" + #define COMMON_FLAGS "-pipe", "-Wall" #define DEBUG_FLAGS "-O0", "-D_DEBUG", "-Wno-unused-function" #define OPTIMIZED_FLAGS "-O3" #define EXTRA_FLAGS_BASE "-Werror", "-Wextra", "-Wno-unused-parameter", \ @@ -95,12 +97,15 @@ global char *g_argv0; #if COMPILER_CLANG #define COMPILER "clang" + #define CPP_COMPILER "clang++" #define PREPROCESSOR "clang", "-E", "-P" #elif COMPILER_MSVC #define COMPILER "cl" + #define CPP_COMPILER "cl" #define PREPROCESSOR "cl", "/EP" #else #define COMPILER "cc" + #define CPP_COMPILER "c++" #define PREPROCESSOR "cc", "-E", "-P" #endif @@ -541,11 +546,11 @@ use_sanitization(void) } function void -cmd_base(Arena *a, CommandList *c) +cmd_base(Arena *a, CommandList *c, b32 cpp) { Config *o = &config; - cmd_append(a, c, COMPILER); + cmd_append(a, c, cpp ? CPP_COMPILER : COMPILER); if (!is_msvc) { /* TODO(rnp): support cross compiling with clang */ @@ -554,6 +559,7 @@ cmd_base(Arena *a, CommandList *c) else if (is_aarch64) cmd_append(a, c, "-march=armv8"); } + if (!cpp) cmd_append(a, c, COMMON_CFLAGS); cmd_append(a, c, COMMON_FLAGS); if (o->debug) cmd_append(a, c, DEBUG_FLAGS); else cmd_append(a, c, OPTIMIZED_FLAGS); @@ -584,7 +590,7 @@ check_rebuild_self(Arena arena, i32 argc, char *argv[]) build_fatal("failed to move: %s -> %s", binary, old_name); CommandList c = {0}; - cmd_base(&arena, &c); + cmd_base(&arena, &c, 0); cmd_append(&arena, &c, EXTRA_FLAGS); if (!is_msvc) cmd_append(&arena, &c, "-Wno-unused-function"); cmd_append(&arena, &c, __FILE__, OUTPUT_EXE(binary)); @@ -731,7 +737,7 @@ build_static_library(Arena a, CommandList cc, char *name, char **deps, char **ou } function b32 -check_build_raylib(Arena a) +build_raylib(Arena a) { b32 result = 1, shared = config.debug; char *libraylib = shared ? OS_SHARED_LINK_LIB("raylib") : OUTPUT_LIB(OS_STATIC_LIB("raylib")); @@ -740,7 +746,7 @@ check_build_raylib(Arena a) os_copy_file("external/raylib/src/rlgl.h", "external/include/rlgl.h"); CommandList cc = {0}; - cmd_base(&a, &cc); + cmd_base(&a, &cc, 0); if (is_unix) cmd_append(&a, &cc, "-D_GLFW_X11"); cmd_append(&a, &cc, "-DPLATFORM_DESKTOP_GLFW"); if (!is_msvc) cmd_append(&a, &cc, "-Wno-unused-but-set-variable"); @@ -771,10 +777,50 @@ check_build_raylib(Arena a) } function b32 +build_glslang(Arena a) +{ + b32 result = 1; + char *lib = OUTPUT_LIB(OS_STATIC_LIB("glslang")); + if (needs_rebuild(lib, "external/glslang")) { + git_submodule_update(a, "external/glslang"); + os_copy_file("external/glslang/glslang/Include/glslang_c_interface.h", "external/include/glslang_c_interface.h"); + + CommandList cc = {0}; + cmd_base(&a, &cc, 1); + cmd_append(&a, &cc, "-std=c++17", "-fno-rtti", "-fno-exceptions", "-Wno-unused-but-set-variable"); + cmd_append(&a, &cc, "-Iexternal/glslang_local", "-Iexternal/glslang"); + + #if OS_WINDOWS + #define GLSLANG_SOURCES_OS X(ossource, "glslang/glslang/OSDependent/Windows/") + #else + #define GLSLANG_SOURCES_OS + #endif + + #define GLSLANG_SOURCES_COMMON \ + X(glslang, "glslang_local/") \ + X(spirv_c_interface, "glslang/SPIRV/CInterface/") \ + + #define GLSLANG_SOURCES \ + GLSLANG_SOURCES_COMMON \ + GLSLANG_SOURCES_OS \ + + #define X(name, extra) "external/" extra #name ".cpp", + char *srcs[] = {GLSLANG_SOURCES}; + #undef X + #define X(name, ...) OUTPUT(OBJECT(#name)), + char *outs[] = {GLSLANG_SOURCES}; + #undef X + + result = build_static_library(a, cc, lib, srcs, outs, countof(srcs)); + } + return result; +} + +function b32 build_helper_library(Arena arena) { CommandList cc = {0}; - cmd_base(&arena, &cc); + cmd_base(&arena, &cc, 0); cmd_append(&arena, &cc, EXTRA_FLAGS); ///////////// @@ -792,7 +838,7 @@ build_helper_library(Arena arena) function void cmd_beamformer_base(Arena *a, CommandList *c) { - cmd_base(a, c); + cmd_base(a, c, 0); cmd_append(a, c, "-Iexternal/include"); cmd_append(a, c, EXTRA_FLAGS); cmd_append(a, c, config.bake_shaders? "-DBakeShaders=1" : "-DBakeShaders=0"); @@ -856,7 +902,7 @@ function b32 build_tests(Arena arena) { CommandList cc = {0}; - cmd_base(&arena, &cc); + cmd_base(&arena, &cc, 0); cmd_append(&arena, &cc, EXTRA_FLAGS); #define TEST_PROGRAMS \ @@ -4785,7 +4831,8 @@ main(i32 argc, char *argv[]) parse_config(argc, argv); - if (!check_build_raylib(arena)) return 1; + if (!build_raylib(arena)) return 1; + if (!build_glslang(arena)) return 1; ///////////////// // lib/tests diff --git a/external/glslang b/external/glslang @@ -0,0 +1 @@ +Subproject commit b5782e52ee2f7b3e40bb9c80d15b47016e008bc9 diff --git a/external/glslang_local/glslang.cpp b/external/glslang_local/glslang.cpp @@ -0,0 +1,58 @@ +/* See LICENSE for license details. */ +// NOTE(rnp): an almost single file build for glslang + +#include "../../compiler.h" + +#include "SPIRV/SpvBuilder.cpp" + +// NOTE(rnp): cannot be included at the samee time as glslang_c_interface.cpp +// compiled as a seperate object +//#include "SPIRV/CInterface/spirv_c_interface.cpp" + +#include "SPIRV/GlslangToSpv.cpp" +#include "SPIRV/InReadableOrder.cpp" +#include "SPIRV/Logger.cpp" +#include "SPIRV/SpvPostProcess.cpp" +#include "SPIRV/SpvTools.cpp" +#include "SPIRV/disassemble.cpp" +#include "SPIRV/doc.cpp" +#include "glslang/CInterface/glslang_c_interface.cpp" +#include "glslang/GenericCodeGen/CodeGen.cpp" +#include "glslang/GenericCodeGen/Link.cpp" +#include "glslang/MachineIndependent/Constant.cpp" +#include "glslang/MachineIndependent/InfoSink.cpp" +#include "glslang/MachineIndependent/Initialize.cpp" +#include "glslang/MachineIndependent/IntermTraverse.cpp" +#include "glslang/MachineIndependent/Intermediate.cpp" +#include "glslang/MachineIndependent/ParseContextBase.cpp" +#include "glslang/MachineIndependent/ParseHelper.cpp" +#include "glslang/MachineIndependent/PoolAlloc.cpp" +#include "glslang/MachineIndependent/RemoveTree.cpp" +#include "glslang/MachineIndependent/Scan.cpp" +#include "glslang/MachineIndependent/ShaderLang.cpp" +#include "glslang/MachineIndependent/SpirvIntrinsics.cpp" +#include "glslang/MachineIndependent/SymbolTable.cpp" +#include "glslang/MachineIndependent/Versions.cpp" +#include "glslang/MachineIndependent/attribute.cpp" +#include "glslang/MachineIndependent/intermOut.cpp" +#include "glslang/MachineIndependent/iomapper.cpp" +#include "glslang/MachineIndependent/limits.cpp" +#include "glslang/MachineIndependent/linkValidate.cpp" +#include "glslang/MachineIndependent/parseConst.cpp" +#include "glslang/MachineIndependent/preprocessor/Pp.cpp" +#include "glslang/MachineIndependent/preprocessor/PpAtom.cpp" +#include "glslang/MachineIndependent/preprocessor/PpContext.cpp" +#include "glslang/MachineIndependent/preprocessor/PpScanner.cpp" +#include "glslang/MachineIndependent/preprocessor/PpTokens.cpp" +#include "glslang/MachineIndependent/propagateNoContraction.cpp" +#include "glslang/MachineIndependent/reflection.cpp" + +#if OS_WINDOWS +// NOTE(rnp): includes windows.h: i.e. it needs its own TU +//#include "glslang/OSDependent/Windows/ossource.cpp" +#else +#include "glslang/OSDependent/Unix/ossource.cpp" +#endif + +// NOTE(rnp): generated with some of the worst garbage ever taught in CS (yacc). must come last +#include "glslang/MachineIndependent/glslang_tab.cpp" diff --git a/external/glslang_local/glslang/build_info.h b/external/glslang_local/glslang/build_info.h @@ -0,0 +1,12 @@ +// NOTE(rnp): completely garbage file that is used in exactly one place in the glslang +// source code. For some reason they think this needs to be autogenerated instead of +// specifying these on the command line at build time. +#ifndef GLSLANG_BUILD_INFO +#define GLSLANG_BUILD_INFO + +#define GLSLANG_VERSION_MAJOR 16 +#define GLSLANG_VERSION_MINOR 1 +#define GLSLANG_VERSION_PATCH 0 +#define GLSLANG_VERSION_FLAVOR "" + +#endif /* GLSLANG_BUILD_INFO */