Skip to content

Commit 5830ecc

Browse files
spirv: implement OpenCL printf function
1 parent d1b74cd commit 5830ecc

File tree

1 file changed

+33
-0
lines changed

1 file changed

+33
-0
lines changed

lib/std/gpu.zig

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
const std = @import("std.zig");
2+
const builtin = @import("builtin");
23

34
pub const position_in = @extern(*addrspace(.input) @Vector(4, f32), .{ .name = "position" });
45
pub const position_out = @extern(*addrspace(.output) @Vector(4, f32), .{ .name = "position" });
@@ -126,3 +127,35 @@ pub fn executionMode(comptime entry_point: anytype, comptime mode: ExecutionMode
126127
},
127128
}
128129
}
130+
131+
/// Writes formatted output to an implementation-defined stream.
132+
/// Returns 0 on success, –1 on failure.
133+
pub fn printf(comptime fmt: [*:0]const u8, args: anytype) u32 {
134+
if (builtin.zig_backend == .stage2_spirv and builtin.target.os.tag == .opencl) {
135+
comptime var expr: []const u8 =
136+
\\%std = OpExtInstImport "OpenCL.std"
137+
\\%u32 = OpTypeInt 32 0
138+
\\%ret = OpExtInst %u32 %std 184 %fmt
139+
;
140+
inline for (0..args.len) |i| {
141+
expr = expr ++ std.fmt.comptimePrint(" %arg{d}", .{i});
142+
}
143+
const result = switch (args.len) {
144+
// zig fmt: off
145+
0 => asm volatile (expr : [ret] "" (-> u32), : [fmt] "c" (fmt)),
146+
1 => asm volatile (expr : [ret] "" (-> u32), : [fmt] "c" (fmt), [arg0] "" (args[0])),
147+
2 => asm volatile (expr : [ret] "" (-> u32), : [fmt] "c" (fmt), [arg0] "" (args[0]), [arg1] "" (args[1])),
148+
3 => asm volatile (expr : [ret] "" (-> u32), : [fmt] "c" (fmt), [arg0] "" (args[0]), [arg1] "" (args[1]), [arg2] "" (args[2])),
149+
4 => asm volatile (expr : [ret] "" (-> u32), : [fmt] "c" (fmt), [arg0] "" (args[0]), [arg1] "" (args[1]), [arg2] "" (args[2]), [arg3] "" (args[3])),
150+
5 => asm volatile (expr : [ret] "" (-> u32), : [fmt] "c" (fmt), [arg0] "" (args[0]), [arg1] "" (args[1]), [arg2] "" (args[2]), [arg3] "" (args[3]), [arg4] "" (args[4])),
151+
6 => asm volatile (expr : [ret] "" (-> u32), : [fmt] "c" (fmt), [arg0] "" (args[0]), [arg1] "" (args[1]), [arg2] "" (args[2]), [arg3] "" (args[3]), [arg4] "" (args[4]), [arg5] "" (args[5])),
152+
7 => asm volatile (expr : [ret] "" (-> u32), : [fmt] "c" (fmt), [arg0] "" (args[0]), [arg1] "" (args[1]), [arg2] "" (args[2]), [arg3] "" (args[3]), [arg4] "" (args[4]), [arg5] "" (args[5]), [arg6] "" (args[6])),
153+
8 => asm volatile (expr : [ret] "" (-> u32), : [fmt] "c" (fmt), [arg0] "" (args[0]), [arg1] "" (args[1]), [arg2] "" (args[2]), [arg3] "" (args[3]), [arg4] "" (args[4]), [arg5] "" (args[5]), [arg6] "" (args[6]), [arg7] "" (args[7])),
154+
9 => asm volatile (expr : [ret] "" (-> u32), : [fmt] "c" (fmt), [arg0] "" (args[0]), [arg1] "" (args[1]), [arg2] "" (args[2]), [arg3] "" (args[3]), [arg4] "" (args[4]), [arg5] "" (args[5]), [arg6] "" (args[6]), [arg7] "" (args[7]), [arg8] "" (args[8])),
155+
// zig fmt: on
156+
else => @compileError("too many arguments"),
157+
};
158+
return result;
159+
}
160+
@compileError("unsupported Zig backend or target OS");
161+
}

0 commit comments

Comments
 (0)