Files
NZigSL/src/SpirvWriter.zig
2025-10-24 17:31:36 +02:00

66 lines
1.8 KiB
Zig

const std = @import("std");
const Module = @import("Module.zig");
const BackendParameters = @import("BackendParameters.zig");
const cnzsl = @cImport({
@cInclude("CNZSL/CNZSL.h");
});
const Self = @This();
instance: *cnzsl.nzslSpirvWriter,
pub fn init() !Self {
const cwriter = cnzsl.nzslSpirvWriterCreate() orelse return error.NullPointer;
return .{
.instance = cwriter,
};
}
pub fn deinit(self: Self) void {
cnzsl.nzslSpirvWriterDestroy(self.instance);
}
pub fn getLastError(self: Self) ![]const u8 {
const err = cnzsl.nzslSpirvWriterGetLastError(self.instance) orelse return error.NullPointer;
return std.mem.span(err);
}
pub fn setEnv(self: Self, env: Environment) void {
const SpirvEnv = extern struct {
spv_major_version: u32,
spv_minor_version: u32,
};
const cenv: SpirvEnv = .{
.spv_major_version = @intCast(env.spv_version.major),
.spv_minor_version = @intCast(env.spv_version.minor),
};
return cnzsl.nzslSpirvWriterSetEnv(self.instance, @ptrCast(&cenv));
}
pub fn generate(self: Self, module: Module, backend_parameters: BackendParameters) !Output {
const output = cnzsl.nzslSpirvWriterGenerate(self.instance, @ptrCast(module.instance), @ptrCast(backend_parameters.instance)) orelse return error.FailedToGenerateSpirv;
return .{
.instance = output,
};
}
pub const Environment = struct {
spv_version: std.SemanticVersion,
};
pub const Output = struct {
const InnerSelf = @This();
instance: *cnzsl.nzslSpirvOutput,
pub fn deinit(self: InnerSelf) void {
cnzsl.nzslSpirvOutputDestroy(self.instance);
}
pub fn getCode(self: InnerSelf) []const u32 {
var size: usize = undefined;
const code = cnzsl.nzslSpirvOutputGetSpirv(self.instance, &size);
return code[0..size];
}
};