From 5f50968746961eb3a63f783c234383060ae14882 Mon Sep 17 00:00:00 2001 From: duck Date: Wed, 23 Apr 2025 21:49:32 +0500 Subject: [PATCH] Simplify shader compilation step --- build.zig | 34 +++++++++++++++++++++-------- build.zig.zon | 2 +- {assets => data}/shaders/basic.frag | 0 {assets => data}/shaders/basic.vert | 0 4 files changed, 26 insertions(+), 10 deletions(-) rename {assets => data}/shaders/basic.frag (100%) rename {assets => data}/shaders/basic.vert (100%) diff --git a/build.zig b/build.zig index 7524b70..56ab01d 100644 --- a/build.zig +++ b/build.zig @@ -1,8 +1,9 @@ const std = @import("std"); -const SHADERS: []const struct { file: []const u8, stage: []const u8 } = &.{ - .{ .file = "basic", .stage = "vert" }, - .{ .file = "basic", .stage = "frag" }, +/// Paths specified here are compiled to SPIR-V instead of being copied over +const SHADERS: []const []const u8 = &.{ + "data/shaders/basic.vert", + "data/shaders/basic.frag", }; pub fn build(b: *std.Build) void { @@ -19,14 +20,29 @@ pub fn build(b: *std.Build) void { exe.linkLibC(); exe.linkSystemLibrary("SDL3"); - inline for (SHADERS) |shader| { + const copy_data_cmd = b.addInstallDirectory(.{ + .source_dir = b.path("data"), + .install_dir = .bin, + .install_subdir = "data", + .exclude_extensions = &.{ "vert", "frag" }, + }); + b.getInstallStep().dependOn(©_data_cmd.step); + + for (SHADERS) |shader_path| { const glslc = b.addSystemCommand(&.{"glslc"}); - glslc.addArg("-fshader-stage=" ++ shader.stage); - glslc.addFileArg(b.path("assets/shaders/" ++ shader.file ++ "." ++ shader.stage)); + + const ext = std.fs.path.extension(shader_path); + if (std.mem.eql(u8, ext, "vert")) { + glslc.addArg("-fshader-stage=vert"); + } + if (std.mem.eql(u8, ext, "frag")) { + glslc.addArg("-fshader-stage=frag"); + } + + glslc.addFileArg(b.path(shader_path)); glslc.addArg("-o"); - const filename = shader.file ++ "_" ++ shader.stage ++ ".spv"; - const shader_artifact = glslc.addOutputFileArg(filename); - b.getInstallStep().dependOn(&b.addInstallFileWithDir(shader_artifact, .prefix, filename).step); + const shader_artifact = glslc.addOutputFileArg(std.fs.path.basename(shader_path)); + b.getInstallStep().dependOn(&b.addInstallFileWithDir(shader_artifact, .bin, shader_path).step); } const run_cmd = b.addRunArtifact(exe); diff --git a/build.zig.zon b/build.zig.zon index 006535f..6288439 100644 --- a/build.zig.zon +++ b/build.zig.zon @@ -6,6 +6,6 @@ "build.zig", "build.zig.zon", "src", - "assets", + "data", }, } diff --git a/assets/shaders/basic.frag b/data/shaders/basic.frag similarity index 100% rename from assets/shaders/basic.frag rename to data/shaders/basic.frag diff --git a/assets/shaders/basic.vert b/data/shaders/basic.vert similarity index 100% rename from assets/shaders/basic.vert rename to data/shaders/basic.vert