forked from mirror/vulkan-zig
Merge pull request #181 from alichraghi/master
Add option to use zig shaders
This commit is contained in:
@@ -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());
|
||||
|
||||
13
examples/shaders/fragment.zig
Normal file
13
examples/shaders/fragment.zig
Normal file
@@ -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;
|
||||
}
|
||||
19
examples/shaders/vertex.zig
Normal file
19
examples/shaders/vertex.zig
Normal file
@@ -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;
|
||||
}
|
||||
Reference in New Issue
Block a user