diff --git a/examples/build.zig b/examples/build.zig index 464398a..139706a 100644 --- a/examples/build.zig +++ b/examples/build.zig @@ -6,6 +6,7 @@ pub fn build(b: *std.Build) void { const target = b.standardTargetOptions(.{}); const optimize = b.standardOptimizeOption(.{}); const maybe_override_registry = b.option([]const u8, "override-registry", "Override the path to the Vulkan registry used for the examples"); + const use_zig_shaders = b.option(bool, "zig-shader", "Use Zig shaders instead of GLSL") orelse false; const registry = b.dependency("vulkan_headers", .{}).path("registry/vk.xml"); @@ -30,27 +31,59 @@ pub fn build(b: *std.Build) void { triangle_exe.root_module.addImport("vulkan", vulkan); - const vert_cmd = b.addSystemCommand(&.{ - "glslc", - "--target-env=vulkan1.2", - "-o", - }); - const vert_spv = vert_cmd.addOutputFileArg("vert.spv"); - vert_cmd.addFileArg(b.path("shaders/triangle.vert")); - triangle_exe.root_module.addAnonymousImport("vertex_shader", .{ - .root_source_file = vert_spv, - }); + if (use_zig_shaders) { + const spirv_target = b.resolveTargetQuery(.{ + .cpu_arch = .spirv64, + .os_tag = .vulkan, + .cpu_model = .{ .explicit = &std.Target.spirv.cpu.vulkan_v1_2 }, + .cpu_features_add = std.Target.spirv.featureSet(&.{.int64}), + .ofmt = .spirv, + }); - const frag_cmd = b.addSystemCommand(&.{ - "glslc", - "--target-env=vulkan1.2", - "-o", - }); - const frag_spv = frag_cmd.addOutputFileArg("frag.spv"); - frag_cmd.addFileArg(b.path("shaders/triangle.frag")); - triangle_exe.root_module.addAnonymousImport("fragment_shader", .{ - .root_source_file = frag_spv, - }); + const vert_spv = b.addObject(.{ + .name = "vertex_shader", + .root_source_file = b.path("shaders/vertex.zig"), + .target = spirv_target, + .use_llvm = false, + }); + triangle_exe.root_module.addAnonymousImport( + "vertex_shader", + .{ .root_source_file = vert_spv.getEmittedBin() }, + ); + + const frag_spv = b.addObject(.{ + .name = "fragment_shader", + .root_source_file = b.path("shaders/fragment.zig"), + .target = spirv_target, + .use_llvm = false, + }); + triangle_exe.root_module.addAnonymousImport( + "fragment_shader", + .{ .root_source_file = frag_spv.getEmittedBin() }, + ); + } else { + const vert_cmd = b.addSystemCommand(&.{ + "glslc", + "--target-env=vulkan1.2", + "-o", + }); + const vert_spv = vert_cmd.addOutputFileArg("vert.spv"); + vert_cmd.addFileArg(b.path("shaders/triangle.vert")); + triangle_exe.root_module.addAnonymousImport("vertex_shader", .{ + .root_source_file = vert_spv, + }); + + const frag_cmd = b.addSystemCommand(&.{ + "glslc", + "--target-env=vulkan1.2", + "-o", + }); + const frag_spv = frag_cmd.addOutputFileArg("frag.spv"); + frag_cmd.addFileArg(b.path("shaders/triangle.frag")); + triangle_exe.root_module.addAnonymousImport("fragment_shader", .{ + .root_source_file = frag_spv, + }); + } const triangle_run_cmd = b.addRunArtifact(triangle_exe); triangle_run_cmd.step.dependOn(b.getInstallStep()); diff --git a/examples/shaders/fragment.zig b/examples/shaders/fragment.zig new file mode 100644 index 0000000..ac16fdb --- /dev/null +++ b/examples/shaders/fragment.zig @@ -0,0 +1,13 @@ +const std = @import("std"); +const gpu = std.gpu; + +extern const v_color: @Vector(3, f32) addrspace(.input); +extern var f_color: @Vector(4, f32) addrspace(.output); + +export fn main() callconv(.spirv_fragment) void { + gpu.location(&v_color, 0); + gpu.location(&f_color, 0); + + const temp: @Vector(4, f32) = .{ v_color[0], v_color[1], v_color[2], 1.0 }; + f_color = temp; +} diff --git a/examples/shaders/vertex.zig b/examples/shaders/vertex.zig new file mode 100644 index 0000000..cc72638 --- /dev/null +++ b/examples/shaders/vertex.zig @@ -0,0 +1,19 @@ +const std = @import("std"); +const gpu = std.gpu; + +extern const a_pos: @Vector(2, f32) addrspace(.input); +extern const a_color: @Vector(3, f32) addrspace(.input); + +extern var v_position: @Vector(4, f32) addrspace(.output); +extern var v_color: @Vector(3, f32) addrspace(.output); + +export fn main() callconv(.spirv_vertex) void { + gpu.location(&a_pos, 0); + gpu.location(&a_color, 1); + gpu.location(&v_color, 0); + gpu.position(&v_position); + + const temp: @Vector(4, f32) = .{ a_pos[0], a_pos[1], 0.0, 1.0 }; + v_position = temp; + v_color = a_color; +}