diff --git a/src/coral/shaders.zig b/src/coral/shaders.zig index 9294ae5..5c4cfbd 100644 --- a/src/coral/shaders.zig +++ b/src/coral/shaders.zig @@ -8,8 +8,6 @@ pub const Type = @import("./shaders/Type.zig"); const coral = @import("./coral.zig"); -const spirv = @import("./shaders/spirv.zig"); - const std = @import("std"); const tokens = @import("./shaders/tokens.zig"); @@ -349,14 +347,3 @@ pub const Uniform = struct { binding: u8, has_field: ?*const Field = null, }; - -pub fn compileFragmentSpirv(arena: *std.heap.ArenaAllocator, function: *const coral.shaders.Function) spirv.BuildError!spirv.Module { - var module = spirv.Module{ - .capabilities = &.{.shader}, - .memory_model = .{ .logical, .glsl450 }, - }; - - _ = try module.shaderEntryPoint(arena, .fragment, function); - - return module; -} diff --git a/src/coral/shaders/Root.zig b/src/coral/shaders/Root.zig index 0153ed6..60ea92f 100644 --- a/src/coral/shaders/Root.zig +++ b/src/coral/shaders/Root.zig @@ -1,5 +1,7 @@ const coral = @import("../coral.zig"); +const spirv = @import("./spirv.zig"); + const std = @import("std"); const tokens = @import("./tokens.zig"); @@ -11,6 +13,10 @@ uniforms: std.BoundedArray(*const coral.shaders.Uniform, 15) = .{}, textures: std.BoundedArray(*const coral.shaders.Texture, 15) = .{}, functions: std.BoundedArray(*const coral.shaders.Function, max_functions) = .{}, +pub const BuildError = spirv.BuildError || error{ + InvalidEntryPoint, +}; + pub const ParseResult = union(enum) { ok, failure: [:0]const u8, @@ -18,6 +24,19 @@ pub const ParseResult = union(enum) { const Self = @This(); +pub fn buildSpirvFragment(self: *Self, arena: *std.heap.ArenaAllocator, identifier: []const u8) BuildError!spirv.Module { + var module = spirv.Module{ + .capabilities = &.{.shader}, + .memory_model = .{ .logical, .glsl450 }, + }; + + _ = try module.shaderEntryPoint(arena, .fragment, self.hasFunction(identifier) orelse { + return error.InvalidEntryPoint; + }); + + return module; +} + pub fn clear(self: *Self) void { self.scope.clear(); self.inputs.clear(); diff --git a/src/coral/shaders/spirv.zig b/src/coral/shaders/spirv.zig index cf35f3b..e4b4b0c 100644 --- a/src/coral/shaders/spirv.zig +++ b/src/coral/shaders/spirv.zig @@ -112,6 +112,11 @@ pub const Module = struct { }; }, + .convert => |_| { + // TODO: Review how type conversions are represented in AST. + unreachable; + }, + .invoke => |invoke| { const arguments = try arena.allocator().alloc(*const Value, invoke.argument_count); diff --git a/src/ona/gfx.zig b/src/ona/gfx.zig index 640c0bd..1b00722 100644 --- a/src/ona/gfx.zig +++ b/src/ona/gfx.zig @@ -72,12 +72,7 @@ fn compile_shaders(_: ona.Write(Context), assets: ona.Assets) !void { switch (try root.parse(&arena, try assets.load(shader_path, arena.allocator()))) { .ok => { - const spirv_module = try coral.shaders.compileFragmentSpirv(&arena, root.hasFunction("frag") orelse { - std.log.err("effect shader {s} requires an entry-point named `frag`", .{shader_path}); - - return error.ShaderParseFailure; - }); - + const spirv_module = try root.buildSpirvFragment(&arena, "frag"); var codes = coral.Stack(u8).empty; defer {