summaryrefslogtreecommitdiff
path: root/build.zig
diff options
context:
space:
mode:
Diffstat (limited to 'build.zig')
-rw-r--r--build.zig28
1 files changed, 23 insertions, 5 deletions
diff --git a/build.zig b/build.zig
index 803f773d..c1117593 100644
--- a/build.zig
+++ b/build.zig
@@ -50,7 +50,11 @@ const gui_shaders = [_][]const u8{
"decor.frag",
"overlay.vert", "overlay.frag",
"image.vert", "image.frag",
- "crt.vert", "crt.frag",
+ "post.vert",
+ // The bundled post passes: shaders/post/<name>.glsl behind the Shadertoy
+ // prefix (shaderSource).
+ "post-crt.frag", "post-ripple.frag",
+ "post-glitch.frag",
};
pub fn build(b: *std.Build) void {
@@ -161,7 +165,7 @@ pub fn build(b: *std.Build) void {
for (gui_shaders) |name| {
update_shaders.addCopyFileToSource(compileGlsl(b, name), b.fmt("shaders/prebuilt/{s}.spv", .{name}));
update_shaders.addCopyFileToSource(
- b.path(b.fmt("shaders/{s}.glsl", .{name})),
+ shaderSource(b, name),
b.fmt("shaders/prebuilt/{s}.glsl", .{name}),
);
}
@@ -691,7 +695,7 @@ pub fn build(b: *std.Build) void {
mod.addOptions("pardes_isolation", if (isolated_mod == mod) iso_on else iso_off);
if (shell == .gui) for (gui_shaders) |name| mod.addAnonymousImport(
b.fmt("effect-source-{s}.glsl", .{name}),
- .{ .root_source_file = b.path(b.fmt("{s}/{s}.glsl", .{ gui_effect_source_dir, name })) },
+ .{ .root_source_file = if (prebuilt_shaders) b.path(b.fmt("{s}/{s}.glsl", .{ gui_effect_source_dir, name })) else shaderSource(b, name) },
);
if (shell == .macos) mod.addAnonymousImport("effect-source-crt.ci.metal", .{
.root_source_file = b.path("shaders/crt.ci.metal"),
@@ -756,6 +760,8 @@ pub fn build(b: *std.Build) void {
gm.addAnonymousImport("AdwaitaMono-Regular.ttf", .{
.root_source_file = b.path("assets/AdwaitaMono-Regular.ttf"),
});
+ // Put before a user's Shadertoy file when the gui compiles it.
+ gm.addAnonymousImport("post-prefix.glsl", .{ .root_source_file = b.path("shaders/post/prefix.glsl") });
for (gui_shaders) |name| gm.addAnonymousImport(b.fmt("{s}.spv", .{name}), .{
.root_source_file = if (prebuilt_shaders)
b.path(b.fmt("shaders/prebuilt/{s}.spv", .{name}))
@@ -1444,7 +1450,6 @@ pub fn build(b: *std.Build) void {
.{ .path = "src/esp32p4/input_rescue.zig", .libc = false },
.{ .path = "src/fonts.zig", .libc = true },
.{ .path = "src/c_heap.zig", .libc = false },
- .{ .path = "src/gui/crt.zig", .libc = false },
}) |entry| {
const tests = b.addTest(.{
.root_module = b.createModule(.{
@@ -1626,10 +1631,23 @@ fn reindexed(b: *std.Build, archive: std.Build.LazyPath, index: usize) std.Build
// glslc shaders/<name>.glsl -fshader-stage=<vertex|fragment> -o <name>.spv,
// returned as a LazyPath for @embedFile. The stage is the name's own suffix.
+/// The GLSL a shader is compiled from: shaders/<name>.glsl, or for a bundled
+/// post pass (post-<name>.frag) shaders/post/<name>.glsl behind the Shadertoy
+/// prefix, the one the gui puts before a user's file at run time.
+fn shaderSource(b: *std.Build, name: []const u8) std.Build.LazyPath {
+ if (!std.mem.startsWith(u8, name, "post-")) return b.path(b.fmt("shaders/{s}.glsl", .{name}));
+ const joined = b.addSystemCommand(&.{"cat"});
+ joined.addFileArg(b.path("shaders/post/prefix.glsl"));
+ joined.addFileArg(b.path(b.fmt("shaders/post/{s}.glsl", .{name["post-".len .. name.len - ".frag".len]})));
+ return joined.captureStdOut(.{});
+}
+
+/// The one glslc invocation every shader is compiled with, at build time here
+/// and at run time for a user's post pass (src/gui/Post.zig).
fn compileGlsl(b: *std.Build, name: []const u8) std.Build.LazyPath {
const stage = if (std.mem.endsWith(u8, name, ".vert")) "vertex" else "fragment";
const cmd = b.addSystemCommand(&.{ "glslc", b.fmt("-fshader-stage={s}", .{stage}) });
- cmd.addFileArg(b.path(b.fmt("shaders/{s}.glsl", .{name})));
+ cmd.addFileArg(shaderSource(b, name));
cmd.addArg("-o");
return cmd.addOutputFileArg(b.fmt("{s}.spv", .{name}));
}