gpu: basic Queue implementation

Signed-off-by: Stephen Gutekanst <stephen@hexops.com>
This commit is contained in:
Stephen Gutekanst 2022-03-07 23:58:11 -07:00 committed by Stephen Gutekanst
parent 5a7fa36baf
commit 2b67ad5457
5 changed files with 86 additions and 20 deletions

View file

@ -8,6 +8,7 @@
//! https://gpuweb.github.io/gpuweb/#gpuadapter
const FeatureName = @import("feature_name.zig").FeatureName;
const Limits = @import("Limits.zig");
const Queue = @import("Queue.zig");
const Device = @This();
@ -38,7 +39,7 @@ pub const VTable = struct {
// WGPU_EXPORT void wgpuDeviceDestroy(WGPUDevice device);
// WGPU_EXPORT size_t wgpuDeviceEnumerateFeatures(WGPUDevice device, WGPUFeatureName * features);
// WGPU_EXPORT bool wgpuDeviceGetLimits(WGPUDevice device, WGPUSupportedLimits * limits);
// WGPU_EXPORT WGPUQueue wgpuDeviceGetQueue(WGPUDevice device);
getQueue: fn (ptr: *anyopaque) Queue,
// WGPU_EXPORT bool wgpuDeviceHasFeature(WGPUDevice device, WGPUFeatureName feature);
// WGPU_EXPORT void wgpuDeviceInjectError(WGPUDevice device, WGPUErrorType type, char const * message);
// WGPU_EXPORT void wgpuDeviceLoseForTesting(WGPUDevice device);
@ -53,6 +54,18 @@ pub const VTable = struct {
release: fn (ptr: *anyopaque) void,
};
pub inline fn getQueue(device: Device) Queue {
return device.vtable.getQueue(device.ptr);
}
pub inline fn reference(device: Device) void {
device.vtable.reference(device.ptr);
}
pub inline fn release(device: Device) void {
device.vtable.release(device.ptr);
}
// TODO: docs
pub const Descriptor = struct {
label: ?[]const u8 = null,
@ -62,5 +75,8 @@ pub const Descriptor = struct {
test "syntax" {
_ = VTable;
_ = getQueue;
_ = reference;
_ = release;
_ = Descriptor;
}

View file

@ -16,6 +16,7 @@ const RequestDeviceResponse = Adapter.RequestDeviceResponse;
const Device = @import("Device.zig");
const Surface = @import("Surface.zig");
const Limits = @import("Limits.zig");
const Queue = @import("Queue.zig");
const NativeInstance = @This();
@ -294,6 +295,11 @@ const device_vtable = Device.VTable{
c.wgpuDeviceRelease(@ptrCast(c.WGPUDevice, ptr));
}
}).release,
.getQueue = (struct {
pub fn getQueue(ptr: *anyopaque) Queue {
return wrapQueue(c.wgpuDeviceGetQueue(@ptrCast(c.WGPUDevice, ptr)));
}
}).getQueue,
};
// TODO: maybe make Limits an extern struct that can be cast?
@ -328,6 +334,26 @@ fn convertLimits(l: Limits) c.WGPULimits {
};
}
fn wrapQueue(queue: c.WGPUQueue) Queue {
return .{
.ptr = queue.?,
.vtable = &queue_vtable,
};
}
const queue_vtable = Queue.VTable{
.reference = (struct {
pub fn reference(ptr: *anyopaque) void {
c.wgpuQueueReference(@ptrCast(c.WGPUQueue, ptr));
}
}).reference,
.release = (struct {
pub fn release(ptr: *anyopaque) void {
c.wgpuQueueRelease(@ptrCast(c.WGPUQueue, ptr));
}
}).release,
};
test "syntax" {
_ = wrap;
_ = interface_vtable;
@ -338,4 +364,5 @@ test "syntax" {
_ = wrapDevice;
_ = device_vtable;
_ = convertLimits;
_ = wrapQueue;
}

40
gpu/src/Queue.zig Normal file
View file

@ -0,0 +1,40 @@
const Queue = @This();
/// The type erased pointer to the Queue implementation
/// Equal to c.WGPUQueue for NativeInstance.
ptr: *anyopaque,
vtable: *const VTable,
pub const VTable = struct {
reference: fn (ptr: *anyopaque) void,
release: fn (ptr: *anyopaque) void,
// WGPU_EXPORT void wgpuQueueCopyTextureForBrowser(WGPUQueue queue, WGPUImageCopyTexture const * source, WGPUImageCopyTexture const * destination, WGPUExtent3D const * copySize, WGPUCopyTextureForBrowserOptions const * options);
// WGPU_EXPORT void wgpuQueueOnSubmittedWorkDone(WGPUQueue queue, uint64_t signalValue, WGPUQueueWorkDoneCallback callback, void * userdata);
// WGPU_EXPORT void wgpuQueueSubmit(WGPUQueue queue, uint32_t commandCount, WGPUCommandBuffer const * commands);
// WGPU_EXPORT void wgpuQueueWriteBuffer(WGPUQueue queue, WGPUBuffer buffer, uint64_t bufferOffset, void const * data, size_t size);
// WGPU_EXPORT void wgpuQueueWriteTexture(WGPUQueue queue, WGPUImageCopyTexture const * destination, void const * data, size_t dataSize, WGPUTextureDataLayout const * dataLayout, WGPUExtent3D const * writeSize);
};
pub inline fn reference(queue: Queue) void {
queue.vtable.reference(queue.ptr);
}
pub inline fn release(queue: Queue) void {
queue.vtable.release(queue.ptr);
}
// typedef void (*WGPUQueueWorkDoneCallback)(WGPUQueueWorkDoneStatus status, void * userdata);
// typedef enum WGPUQueueWorkDoneStatus {
// WGPUQueueWorkDoneStatus_Success = 0x00000000,
// WGPUQueueWorkDoneStatus_Error = 0x00000001,
// WGPUQueueWorkDoneStatus_Unknown = 0x00000002,
// WGPUQueueWorkDoneStatus_DeviceLost = 0x00000003,
// WGPUQueueWorkDoneStatus_Force32 = 0x7FFFFFFF
// } WGPUQueueWorkDoneStatus;
test "syntax" {
_ = VTable;
_ = reference;
_ = release;
}

View file

@ -19,7 +19,6 @@ typedef struct WGPUComputePipelineImpl* WGPUComputePipeline;
typedef struct WGPUExternalTextureImpl* WGPUExternalTexture;
typedef struct WGPUPipelineLayoutImpl* WGPUPipelineLayout;
typedef struct WGPUQuerySetImpl* WGPUQuerySet;
typedef struct WGPUQueueImpl* WGPUQueue;
typedef struct WGPURenderBundleImpl* WGPURenderBundle;
typedef struct WGPURenderBundleEncoderImpl* WGPURenderBundleEncoder;
typedef struct WGPURenderPassEncoderImpl* WGPURenderPassEncoder;
@ -255,14 +254,6 @@ typedef enum WGPUQueryType {
WGPUQueryType_Force32 = 0x7FFFFFFF
} WGPUQueryType;
typedef enum WGPUQueueWorkDoneStatus {
WGPUQueueWorkDoneStatus_Success = 0x00000000,
WGPUQueueWorkDoneStatus_Error = 0x00000001,
WGPUQueueWorkDoneStatus_Unknown = 0x00000002,
WGPUQueueWorkDoneStatus_DeviceLost = 0x00000003,
WGPUQueueWorkDoneStatus_Force32 = 0x7FFFFFFF
} WGPUQueueWorkDoneStatus;
typedef enum WGPURenderPassTimestampLocation {
WGPURenderPassTimestampLocation_Beginning = 0x00000000,
WGPURenderPassTimestampLocation_End = 0x00000001,
@ -1069,7 +1060,6 @@ typedef void (*WGPUDeviceLostCallback)(WGPUDeviceLostReason reason, char const *
typedef void (*WGPUErrorCallback)(WGPUErrorType type, char const * message, void * userdata);
typedef void (*WGPULoggingCallback)(WGPULoggingType type, char const * message, void * userdata);
typedef void (*WGPUProc)();
typedef void (*WGPUQueueWorkDoneCallback)(WGPUQueueWorkDoneStatus status, void * userdata);
WGPU_EXPORT WGPUProc wgpuGetProcAddress(WGPUDevice device, char const * procName);
@ -1157,15 +1147,6 @@ WGPU_EXPORT void wgpuQuerySetSetLabel(WGPUQuerySet querySet, char const * label)
WGPU_EXPORT void wgpuQuerySetReference(WGPUQuerySet querySet);
WGPU_EXPORT void wgpuQuerySetRelease(WGPUQuerySet querySet);
// Methods of Queue
WGPU_EXPORT void wgpuQueueCopyTextureForBrowser(WGPUQueue queue, WGPUImageCopyTexture const * source, WGPUImageCopyTexture const * destination, WGPUExtent3D const * copySize, WGPUCopyTextureForBrowserOptions const * options);
WGPU_EXPORT void wgpuQueueOnSubmittedWorkDone(WGPUQueue queue, uint64_t signalValue, WGPUQueueWorkDoneCallback callback, void * userdata);
WGPU_EXPORT void wgpuQueueSubmit(WGPUQueue queue, uint32_t commandCount, WGPUCommandBuffer const * commands);
WGPU_EXPORT void wgpuQueueWriteBuffer(WGPUQueue queue, WGPUBuffer buffer, uint64_t bufferOffset, void const * data, size_t size);
WGPU_EXPORT void wgpuQueueWriteTexture(WGPUQueue queue, WGPUImageCopyTexture const * destination, void const * data, size_t dataSize, WGPUTextureDataLayout const * dataLayout, WGPUExtent3D const * writeSize);
WGPU_EXPORT void wgpuQueueReference(WGPUQueue queue);
WGPU_EXPORT void wgpuQueueRelease(WGPUQueue queue);
// Methods of RenderBundle
WGPU_EXPORT void wgpuRenderBundleReference(WGPURenderBundle renderBundle);
WGPU_EXPORT void wgpuRenderBundleRelease(WGPURenderBundle renderBundle);

View file

@ -31,6 +31,7 @@ pub const Adapter = @import("Adapter.zig");
pub const Device = @import("Device.zig");
pub const Surface = @import("Surface.zig");
pub const Limits = @import("Limits.zig");
pub const Queue = @import("Queue.zig");
pub const FeatureName = @import("feature_name.zig").FeatureName;
@ -42,6 +43,7 @@ test "syntax" {
_ = Device;
_ = Surface;
_ = Limits;
_ = Queue;
_ = FeatureName;
}