gpu: implement Queue.on_submitted_work_done callback
Signed-off-by: Stephen Gutekanst <stephen@hexops.com>
This commit is contained in:
parent
687fb132ab
commit
0be5cae328
2 changed files with 54 additions and 17 deletions
|
|
@ -354,9 +354,31 @@ const queue_vtable = Queue.VTable{
|
||||||
}
|
}
|
||||||
}).release,
|
}).release,
|
||||||
.submit = (struct {
|
.submit = (struct {
|
||||||
pub fn submit(ptr: *anyopaque, command_count: u32, commands: *const CommandBuffer) void {
|
pub fn submit(queue: Queue, command_count: u32, commands: *const CommandBuffer) void {
|
||||||
|
const wgpu_queue = @ptrCast(c.WGPUQueue, queue.ptr);
|
||||||
|
|
||||||
|
if (queue.on_submitted_work_done) |on_submitted_work_done| {
|
||||||
|
// Note: signalValue is not available in the web API, and it's usage is undocumented
|
||||||
|
// kainino says "It's basically reserved for future use, though it's been suggested
|
||||||
|
// to remove it instead"
|
||||||
|
const signal_value: u64 = 0;
|
||||||
|
|
||||||
|
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(
|
||||||
|
@intToEnum(Queue.WorkDoneStatus, status),
|
||||||
|
_on_submitted_work_done.userdata,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}).callback;
|
||||||
|
|
||||||
|
var mut_on_submitted_work_done = on_submitted_work_done;
|
||||||
|
c.wgpuQueueOnSubmittedWorkDone(wgpu_queue, signal_value, callback, &mut_on_submitted_work_done);
|
||||||
|
}
|
||||||
|
|
||||||
c.wgpuQueueSubmit(
|
c.wgpuQueueSubmit(
|
||||||
@ptrCast(c.WGPUQueue, ptr),
|
wgpu_queue,
|
||||||
command_count,
|
command_count,
|
||||||
@ptrCast(*c.WGPUCommandBuffer, @alignCast(@alignOf(*c.WGPUCommandBuffer), commands.ptr)),
|
@ptrCast(*c.WGPUCommandBuffer, @alignCast(@alignOf(*c.WGPUCommandBuffer), commands.ptr)),
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,8 @@ const CommandBuffer = @import("CommandBuffer.zig");
|
||||||
|
|
||||||
const Queue = @This();
|
const Queue = @This();
|
||||||
|
|
||||||
|
on_submitted_work_done: ?OnSubmittedWorkDone = null,
|
||||||
|
|
||||||
/// The type erased pointer to the Queue implementation
|
/// The type erased pointer to the Queue implementation
|
||||||
/// Equal to c.WGPUQueue for NativeInstance.
|
/// Equal to c.WGPUQueue for NativeInstance.
|
||||||
ptr: *anyopaque,
|
ptr: *anyopaque,
|
||||||
|
|
@ -12,11 +14,10 @@ pub const VTable = struct {
|
||||||
release: fn (ptr: *anyopaque) void,
|
release: fn (ptr: *anyopaque) void,
|
||||||
// TODO:
|
// TODO:
|
||||||
// copyTextureForBrowser: fn (ptr: *anyopaque, source: *const ImageCopyTexture, destination: *const ImageCopyTexture, copy_size: *const Extent3D, options: *const CopyTextureForBrowserOptions) void,
|
// copyTextureForBrowser: fn (ptr: *anyopaque, source: *const ImageCopyTexture, destination: *const ImageCopyTexture, copy_size: *const Extent3D, options: *const CopyTextureForBrowserOptions) void,
|
||||||
// WGPU_EXPORT void wgpuQueueOnSubmittedWorkDone(WGPUQueue queue, uint64_t signalValue, WGPUQueueWorkDoneCallback callback, void * userdata);
|
submit: fn (queue: Queue, command_count: u32, commands: *const CommandBuffer) void,
|
||||||
submit: fn (ptr: *anyopaque, command_count: u32, commands: *const CommandBuffer) void,
|
|
||||||
// TODO:
|
// TODO:
|
||||||
// queueWriteBuffer: fn (ptr: *anyopaque, buffer: Buffer, buffer_offset: u64, data: *const anyopaque, size: usize);
|
// writeBuffer: fn (ptr: *anyopaque, buffer: Buffer, buffer_offset: u64, data: *const anyopaque, size: usize);
|
||||||
// queueWriteTexture: fn (ptr: *anyopaque, destination: *const ImageCopyTexture, data: *const anyopaque, data_size: usize, data_layout: *const TextureDataLayout, write_size: *const Extent3D);
|
// writeTexture: fn (ptr: *anyopaque, destination: *const ImageCopyTexture, data: *const anyopaque, data_size: usize, data_layout: *const TextureDataLayout, write_size: *const Extent3D);
|
||||||
};
|
};
|
||||||
|
|
||||||
pub inline fn reference(queue: Queue) void {
|
pub inline fn reference(queue: Queue) void {
|
||||||
|
|
@ -28,24 +29,38 @@ pub inline fn release(queue: Queue) void {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub inline fn submit(queue: Queue, command_count: u32, commands: *const CommandBuffer) void {
|
pub inline fn submit(queue: Queue, command_count: u32, commands: *const CommandBuffer) void {
|
||||||
queue.vtable.submit(queue.ptr, command_count, commands);
|
queue.vtable.submit(queue, command_count, commands);
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO:
|
pub const OnSubmittedWorkDone = struct {
|
||||||
// typedef void (*WGPUQueueWorkDoneCallback)(WGPUQueueWorkDoneStatus status, void * userdata);
|
userdata: *anyopaque,
|
||||||
|
callback: fn (status: WorkDoneStatus, userdata: *anyopaque) void,
|
||||||
|
|
||||||
// TODO:
|
fn init(comptime Context: type, userdata: *Context, comptime callback: fn (status: WorkDoneStatus, userdata: *Context) void) OnSubmittedWorkDone {
|
||||||
// typedef enum WGPUQueueWorkDoneStatus {
|
return .{
|
||||||
// WGPUQueueWorkDoneStatus_Success = 0x00000000,
|
.userdata = userdata,
|
||||||
// WGPUQueueWorkDoneStatus_Error = 0x00000001,
|
.callback = (struct {
|
||||||
// WGPUQueueWorkDoneStatus_Unknown = 0x00000002,
|
pub inline fn untyped(status: WorkDoneStatus, _userdata: *anyopaque) void {
|
||||||
// WGPUQueueWorkDoneStatus_DeviceLost = 0x00000003,
|
callback(status, @ptrCast(*Context, @alignCast(@alignOf(*Context), _userdata)));
|
||||||
// WGPUQueueWorkDoneStatus_Force32 = 0x7FFFFFFF
|
}
|
||||||
// } WGPUQueueWorkDoneStatus;
|
}).untyped,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
pub const WorkDoneStatus = enum(u32) {
|
||||||
|
Success = 0x00000000,
|
||||||
|
Error = 0x00000001,
|
||||||
|
Unknown = 0x00000002,
|
||||||
|
DeviceLost = 0x00000003,
|
||||||
|
Force32 = 0x7FFFFFFF,
|
||||||
|
};
|
||||||
|
|
||||||
test "syntax" {
|
test "syntax" {
|
||||||
_ = VTable;
|
_ = VTable;
|
||||||
_ = reference;
|
_ = reference;
|
||||||
_ = release;
|
_ = release;
|
||||||
_ = submit;
|
_ = submit;
|
||||||
|
_ = OnSubmittedWorkDone;
|
||||||
|
_ = WorkDoneStatus;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue