diff --git a/gpu/src/adapter.zig b/gpu/src/adapter.zig index 0ce9a696..7bae9fd3 100644 --- a/gpu/src/adapter.zig +++ b/gpu/src/adapter.zig @@ -82,8 +82,8 @@ pub const Adapter = opaque { ) callconv(.Inline) void, context: Context, ) void { - const c_callback = struct { - pub fn callback(status: RequestDeviceStatus, device: *Device, message: ?[*:0]const u8, userdata: ?*anyopaque) void { + const Helper = struct { + pub fn callback(status: RequestDeviceStatus, device: *Device, message: ?[*:0]const u8, userdata: ?*anyopaque) callconv(.C) void { callback( status, device, @@ -92,7 +92,7 @@ pub const Adapter = opaque { ); } }; - Impl.adapterRequestDevice(adapter, descriptor, c_callback, if (Context == void) null orelse context); + Impl.adapterRequestDevice(adapter, descriptor, Helper.callback, if (Context == void) null orelse context); } pub inline fn reference(adapter: *Adapter) void { diff --git a/gpu/src/buffer.zig b/gpu/src/buffer.zig index c61770d1..69942b9f 100644 --- a/gpu/src/buffer.zig +++ b/gpu/src/buffer.zig @@ -89,8 +89,21 @@ pub const Buffer = opaque { return Impl.bufferGetUsage(buffer); } - pub inline fn bufferMapAsync(buffer: *Buffer, mode: MapModeFlags, offset: usize, size: usize, callback: MapCallback, userdata: ?*anyopaque) void { - Impl.bufferMapAsync(buffer, mode, offset, size, callback, userdata); + pub inline fn bufferMapAsync( + buffer: *Buffer, + mode: MapModeFlags, + offset: usize, + size: usize, + comptime Context: type, + comptime callback: fn (status: MapAsyncStatus, ctx: Context) callconv(.Inline) void, + context: Context, + ) void { + const Helper = struct { + pub fn callback(status: MapAsyncStatus, userdata: ?*anyopaque) callconv(.C) void { + callback(status, if (Context == void) {} orelse @ptrCast(Context, userdata)); + } + }; + Impl.bufferMapAsync(buffer, mode, offset, size, Helper.callback, if (Context == void) null orelse context); } pub inline fn bufferSetLabel(buffer: *Buffer, label: [*:0]const u8) void {