diff --git a/gpu/src/dawn_impl.zig b/gpu/src/dawn_impl.zig index 75653bc5..8af15a90 100644 --- a/gpu/src/dawn_impl.zig +++ b/gpu/src/dawn_impl.zig @@ -611,7 +611,7 @@ pub const Interface = struct { procs.deviceSetLabel.?(@ptrCast(c.WGPUDevice, device), label); } - pub inline fn deviceSetLoggingCallback(device: *gpu.Device, callback: gpu.LoggingCallback, userdata: ?*anyopaque) void { + pub inline fn deviceSetLoggingCallback(device: *gpu.Device, callback: ?gpu.LoggingCallback, userdata: ?*anyopaque) void { procs.deviceSetLoggingCallback.?( @ptrCast(c.WGPUDevice, device), @ptrCast(c.WGPULoggingCallback, callback), diff --git a/gpu/src/device.zig b/gpu/src/device.zig index b2a1a243..33106cfb 100644 --- a/gpu/src/device.zig +++ b/gpu/src/device.zig @@ -282,19 +282,22 @@ pub const Device = opaque { Impl.deviceSetLabel(device, label); } - // TODO: presumably callback should be nullable for unsetting pub inline fn setLoggingCallback( device: *Device, context: anytype, - comptime callback: fn (ctx: @TypeOf(context), typ: LoggingType, message: [*:0]const u8) callconv(.Inline) void, + comptime callback: ?fn (ctx: @TypeOf(context), typ: LoggingType, message: [*:0]const u8) callconv(.Inline) void, ) void { - const Context = @TypeOf(context); - const Helper = struct { - pub fn callback(typ: LoggingType, message: [*:0]const u8, userdata: ?*anyopaque) callconv(.C) void { - callback(if (Context == void) {} else @ptrCast(Context, @alignCast(@alignOf(std.meta.Child(Context)), userdata)), typ, message); - } - }; - Impl.deviceSetLoggingCallback(device, Helper.callback, if (Context == void) null else context); + if (callback) |cb| { + const Context = @TypeOf(context); + const Helper = struct { + pub fn callback(typ: LoggingType, message: [*:0]const u8, userdata: ?*anyopaque) callconv(.C) void { + cb(if (Context == void) {} else @ptrCast(Context, @alignCast(@alignOf(std.meta.Child(Context)), userdata)), typ, message); + } + }; + Impl.deviceSetLoggingCallback(device, Helper.callback, if (Context == void) null else context); + } else { + Impl.deviceSetLoggingCallback(device, null, null); + } } pub inline fn setUncapturedErrorCallback( diff --git a/gpu/src/interface.zig b/gpu/src/interface.zig index d278db2a..9f091da8 100644 --- a/gpu/src/interface.zig +++ b/gpu/src/interface.zig @@ -111,7 +111,7 @@ pub fn Interface(comptime T: type) type { assertDecl(T, "devicePushErrorScope", fn (device: *gpu.Device, filter: gpu.ErrorFilter) callconv(.Inline) void); assertDecl(T, "deviceSetDeviceLostCallback", fn (device: *gpu.Device, callback: ?gpu.Device.LostCallback, userdata: ?*anyopaque) callconv(.Inline) void); assertDecl(T, "deviceSetLabel", fn (device: *gpu.Device, label: [*:0]const u8) callconv(.Inline) void); - assertDecl(T, "deviceSetLoggingCallback", fn (device: *gpu.Device, callback: gpu.LoggingCallback, userdata: ?*anyopaque) callconv(.Inline) void); + assertDecl(T, "deviceSetLoggingCallback", fn (device: *gpu.Device, callback: ?gpu.LoggingCallback, userdata: ?*anyopaque) callconv(.Inline) void); assertDecl(T, "deviceSetUncapturedErrorCallback", fn (device: *gpu.Device, callback: ?gpu.ErrorCallback, userdata: ?*anyopaque) callconv(.Inline) void); assertDecl(T, "deviceTick", fn (device: *gpu.Device) callconv(.Inline) void); assertDecl(T, "deviceReference", fn (device: *gpu.Device) callconv(.Inline) void); @@ -699,8 +699,9 @@ pub fn Export(comptime T: type) type { T.deviceSetLabel(device, label); } + // TODO: dawn: callback not marked as nullable in dawn.json but in fact is. // WGPU_EXPORT void wgpuDeviceSetLoggingCallback(WGPUDevice device, WGPULoggingCallback callback, void * userdata); - export fn wgpuDeviceSetLoggingCallback(device: *gpu.Device, callback: gpu.LoggingCallback, userdata: ?*anyopaque) void { + export fn wgpuDeviceSetLoggingCallback(device: *gpu.Device, callback: ?gpu.LoggingCallback, userdata: ?*anyopaque) void { T.deviceSetLoggingCallback(device, callback, userdata); }