lib/gpu/src/runtime/metal/probe.zig
daab053ee43316e1809a84551d573ddd1e5bf3d2
1 const std = @import("std");
2 const runtime = @import("gpu_metal_runtime");
3
4 export fn gpu_metal_semantic_init() callconv(.c) void {
5 var storage: [4096]u8 = undefined;
6 var fixed = std.heap.FixedBufferAllocator.init(&storage);
7 var owned = runtime.Runtime.init(fixed.allocator()) catch return;
8 owned.deinit();
9 }
10
11 export fn gpu_metal_semantic_load(owner: *runtime.Runtime) callconv(.c) void {
12 var msl = owner.loadMsl(
13 "kernel void semantic_probe() {}",
14 "semantic_probe",
15 0,
16 ) catch return;
17 msl.deinit();
18
19 var metallib = owner.loadMetallib(
20 &.{ 0xca, 0xfe, 0xba, 0xbe },
21 "semantic_probe",
22 0,
23 ) catch return;
24 metallib.deinit();
25 }
26
27 export fn gpu_metal_semantic_objects(
28 owner: *runtime.Runtime,
29 kernel: *runtime.LoadedKernel,
30 buffer: *runtime.DeviceBuffer,
31 stream: *runtime.Stream,
32 event: *runtime.Event,
33 ) callconv(.c) void {
34 var bytes = [_]u8{ 1, 2, 3, 4 };
35 buffer.write(&bytes) catch return;
36 buffer.read(&bytes) catch return;
37 event.record(stream) catch return;
38 _ = event.query() catch return;
39 event.synchronize() catch return;
40 stream.synchronize() catch return;
41
42 const buffers = [_]*runtime.DeviceBuffer{buffer};
43 const scalars = [_]runtime.ScalarArgument{.{ .tag = .u32, .bits = 1 }};
44 const waits = [_]*runtime.Event{event};
45 owner.launch(
46 kernel,
47 &buffers,
48 &scalars,
49 stream,
50 &waits,
51 event,
52 .{ 1, 1, 1 },
53 .{ 1, 1, 1 },
54 ) catch return;
55 owner.synchronize() catch return;
56 _ = owner.defaultStream() catch return;
57 }
58
59 export fn gpu_metal_semantic_ownership(owner: *runtime.Runtime) callconv(.c) void {
60 var buffer = owner.allocBuffer(64) catch return;
61 buffer.deinit();
62 const stream = owner.createStream() catch return;
63 owner.destroyStream(stream);
64 const event = owner.createEvent() catch return;
65 owner.destroyEvent(event);
66 }