From 3ffc1ca5d84c60ea0830de14b2e090e84ac6ed5c Mon Sep 17 00:00:00 2001 From: Stephen Gutekanst Date: Tue, 15 Mar 2022 11:19:32 -0700 Subject: [PATCH] gpu: Queue: OnSubmittedWorkDone -> WorkDoneCallback, consistent w/other callbacks Signed-off-by: Stephen Gutekanst --- gpu/src/NativeInstance.zig | 6 +++--- gpu/src/Queue.zig | 30 ++++++++++++++++++------------ 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/gpu/src/NativeInstance.zig b/gpu/src/NativeInstance.zig index 4f9c5a7e..ae7e0b72 100644 --- a/gpu/src/NativeInstance.zig +++ b/gpu/src/NativeInstance.zig @@ -516,10 +516,10 @@ const queue_vtable = Queue.VTable{ const callback = (struct { pub fn callback(status: c.WGPUQueueWorkDoneStatus, userdata: ?*anyopaque) callconv(.C) void { - const _on_submitted_work_done = @ptrCast(*Queue.OnSubmittedWorkDone, @alignCast(@alignOf(*Queue.OnSubmittedWorkDone), userdata)); - _on_submitted_work_done.callback( + const callback_info = @ptrCast(*Queue.WorkDoneCallback, @alignCast(@alignOf(*Queue.WorkDoneCallback), userdata)); + callback_info.type_erased_callback( + callback_info.type_erased_ctx, @intToEnum(Queue.WorkDoneStatus, status), - _on_submitted_work_done.userdata, ); } }).callback; diff --git a/gpu/src/Queue.zig b/gpu/src/Queue.zig index ea07c82b..9e4ad191 100644 --- a/gpu/src/Queue.zig +++ b/gpu/src/Queue.zig @@ -2,7 +2,7 @@ const CommandBuffer = @import("CommandBuffer.zig"); const Queue = @This(); -on_submitted_work_done: ?OnSubmittedWorkDone = null, +on_submitted_work_done: ?WorkDoneCallback = null, /// The type erased pointer to the Queue implementation /// Equal to c.WGPUQueue for NativeInstance. @@ -32,18 +32,24 @@ pub inline fn submit(queue: Queue, commands: []const CommandBuffer) void { queue.vtable.submit(queue, commands); } -pub const OnSubmittedWorkDone = struct { - userdata: *anyopaque, - callback: fn (status: WorkDoneStatus, userdata: *anyopaque) void, +pub const WorkDoneCallback = struct { + type_erased_ctx: *anyopaque, + type_erased_callback: fn (ctx: *anyopaque, status: WorkDoneStatus) callconv(.Inline) void, + + pub fn init( + comptime Context: type, + ctx: *Context, + comptime callback: fn (ctx: *Context, status: WorkDoneStatus) void, + ) WorkDoneCallback { + const erased = (struct { + pub inline fn erased(type_erased_ctx: *anyopaque, status: WorkDoneStatus) void { + callback(@ptrCast(*Context, @alignCast(@alignOf(*Context), type_erased_ctx)), status); + } + }).erased; - fn init(comptime Context: type, userdata: *Context, comptime callback: fn (status: WorkDoneStatus, userdata: *Context) void) OnSubmittedWorkDone { return .{ - .userdata = userdata, - .callback = (struct { - pub inline fn untyped(status: WorkDoneStatus, _userdata: *anyopaque) void { - callback(status, @ptrCast(*Context, @alignCast(@alignOf(*Context), _userdata))); - } - }).untyped, + .type_erased_ctx = ctx, + .type_erased_callback = erased, }; } }; @@ -61,6 +67,6 @@ test "syntax" { _ = reference; _ = release; _ = submit; - _ = OnSubmittedWorkDone; + _ = WorkDoneCallback; _ = WorkDoneStatus; }