gpu: add Adapter.createDevice and comptime interface strategy
Signed-off-by: Stephen Gutekanst <stephen@hexops.com>
This commit is contained in:
parent
2d6dbd3351
commit
5b0ae990e3
3 changed files with 34 additions and 4 deletions
|
|
@ -5,13 +5,11 @@ typedef void (*WGPUCreateRenderPipelineAsyncCallback)(WGPUCreatePipelineAsyncSta
|
||||||
typedef void (*WGPUDeviceLostCallback)(WGPUDeviceLostReason reason, char const * message, void * userdata);
|
typedef void (*WGPUDeviceLostCallback)(WGPUDeviceLostReason reason, char const * message, void * userdata);
|
||||||
typedef void (*WGPUErrorCallback)(WGPUErrorType type, char const * message, void * userdata);
|
typedef void (*WGPUErrorCallback)(WGPUErrorType type, char const * message, void * userdata);
|
||||||
typedef void (*WGPULoggingCallback)(WGPULoggingType type, char const * message, void * userdata);
|
typedef void (*WGPULoggingCallback)(WGPULoggingType type, char const * message, void * userdata);
|
||||||
typedef void (*WGPUProc)(void);
|
|
||||||
typedef void (*WGPUQueueWorkDoneCallback)(WGPUQueueWorkDoneStatus status, void * userdata);
|
typedef void (*WGPUQueueWorkDoneCallback)(WGPUQueueWorkDoneStatus status, void * userdata);
|
||||||
typedef void (*WGPURequestAdapterCallback)(WGPURequestAdapterStatus status, WGPUAdapter adapter, char const * message, void * userdata);
|
typedef void (*WGPURequestAdapterCallback)(WGPURequestAdapterStatus status, WGPUAdapter adapter, char const * message, void * userdata);
|
||||||
typedef void (*WGPURequestDeviceCallback)(WGPURequestDeviceStatus status, WGPUDevice device, char const * message, void * userdata);
|
typedef void (*WGPURequestDeviceCallback)(WGPURequestDeviceStatus status, WGPUDevice device, char const * message, void * userdata);
|
||||||
|
|
||||||
// Methods of Adapter
|
// Methods of Adapter
|
||||||
WGPU_EXPORT WGPUDevice wgpuAdapterCreateDevice(WGPUAdapter adapter, WGPUDeviceDescriptor const * descriptor /* nullable */);
|
|
||||||
WGPU_EXPORT size_t wgpuAdapterEnumerateFeatures(WGPUAdapter adapter, WGPUFeatureName * features);
|
WGPU_EXPORT size_t wgpuAdapterEnumerateFeatures(WGPUAdapter adapter, WGPUFeatureName * features);
|
||||||
WGPU_EXPORT bool wgpuAdapterGetLimits(WGPUAdapter adapter, WGPUSupportedLimits * limits);
|
WGPU_EXPORT bool wgpuAdapterGetLimits(WGPUAdapter adapter, WGPUSupportedLimits * limits);
|
||||||
WGPU_EXPORT void wgpuAdapterGetProperties(WGPUAdapter adapter, WGPUAdapterProperties * properties);
|
WGPU_EXPORT void wgpuAdapterGetProperties(WGPUAdapter adapter, WGPUAdapterProperties * properties);
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,14 @@
|
||||||
const testing = @import("std").testing;
|
const testing = @import("std").testing;
|
||||||
const ChainedStructOut = @import("types.zig").ChainedStructOut;
|
const ChainedStructOut = @import("types.zig").ChainedStructOut;
|
||||||
|
const Device = @import("device.zig").Device;
|
||||||
|
const DeviceDescriptor = @import("device.zig").DeviceDescriptor;
|
||||||
|
const impl = @import("interface.zig").impl;
|
||||||
|
|
||||||
pub const Adapter = *opaque {};
|
pub const Adapter = *opaque {
|
||||||
|
pub inline fn createDevice(adapter: Adapter, descriptor: ?*const DeviceDescriptor) ?Device {
|
||||||
|
return impl.createDevice(adapter, descriptor);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
pub const AdapterType = enum(u32) {
|
pub const AdapterType = enum(u32) {
|
||||||
discrete_gpu,
|
discrete_gpu,
|
||||||
|
|
|
||||||
|
|
@ -2,10 +2,24 @@ const Instance = @import("instance.zig").Instance;
|
||||||
const InstanceDescriptor = @import("instance.zig").InstanceDescriptor;
|
const InstanceDescriptor = @import("instance.zig").InstanceDescriptor;
|
||||||
const gpu = @import("main.zig");
|
const gpu = @import("main.zig");
|
||||||
|
|
||||||
|
/// The gpu.Interface implementation that is used by the entire program. Only one may exist, since
|
||||||
|
/// it is resolved fully at comptime with no vtable indirection, etc.
|
||||||
|
pub const impl = blk: {
|
||||||
|
if (@import("builtin").is_test) {
|
||||||
|
break :blk NullInterface{};
|
||||||
|
} else {
|
||||||
|
const root = @import("root");
|
||||||
|
if (!@hasField(root, "gpu_interface")) @compileError("expected to find `pub const gpu_interface: gpu.Interface(T) = T{};` in root file");
|
||||||
|
_ = gpu.Interface(@TypeOf(root.gpu_interface)); // verify the type
|
||||||
|
break :blk root.gpu_interface;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
/// Verifies that a gpu.Interface implementation exposes the expected function declarations.
|
/// Verifies that a gpu.Interface implementation exposes the expected function declarations.
|
||||||
pub fn Interface(comptime Impl: type) type {
|
pub fn Interface(comptime Impl: type) type {
|
||||||
assertDecl(Impl, "createInstance", fn (descriptor: *const InstanceDescriptor) callconv(.Inline) ?Instance);
|
assertDecl(Impl, "createInstance", fn (descriptor: *const InstanceDescriptor) callconv(.Inline) ?Instance);
|
||||||
assertDecl(Impl, "getProcAddress", fn (device: gpu.Device, proc_name: [*:0]const u8) callconv(.Inline) ?gpu.Proc);
|
assertDecl(Impl, "getProcAddress", fn (device: gpu.Device, proc_name: [*:0]const u8) callconv(.Inline) ?gpu.Proc);
|
||||||
|
assertDecl(Impl, "adapterCreateDevice", fn (adapter: gpu.Adapter, descriptor: ?*const gpu.DeviceDescriptor) callconv(.Inline) ?gpu.Device);
|
||||||
return Impl;
|
return Impl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -25,9 +39,14 @@ pub fn Export(comptime Impl: type) type {
|
||||||
}
|
}
|
||||||
|
|
||||||
// WGPU_EXPORT WGPUProc wgpuGetProcAddress(WGPUDevice device, char const * procName);
|
// WGPU_EXPORT WGPUProc wgpuGetProcAddress(WGPUDevice device, char const * procName);
|
||||||
export fn getProcAddress(device: gpu.Device, proc_name: [*:0]const u8) ?gpu.Proc {
|
export fn wgpuGetProcAddress(device: gpu.Device, proc_name: [*:0]const u8) ?gpu.Proc {
|
||||||
return Impl.getProcAddress(device, proc_name);
|
return Impl.getProcAddress(device, proc_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// WGPU_EXPORT WGPUDevice wgpuAdapterCreateDevice(WGPUAdapter adapter, WGPUDeviceDescriptor const * descriptor /* nullable */);
|
||||||
|
export fn wgpuAdapterCreateDevice(adapter: gpu.Adapter, descriptor: ?*const gpu.DeviceDescriptor) ?gpu.Device {
|
||||||
|
return Impl.adapterCreateDevice(adapter, descriptor);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -43,6 +62,12 @@ pub const NullInterface = Interface(struct {
|
||||||
_ = proc_name;
|
_ = proc_name;
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub inline fn adapterCreateDevice(adapter: gpu.Adapter, descriptor: ?*const gpu.DeviceDescriptor) ?gpu.Device {
|
||||||
|
_ = adapter;
|
||||||
|
_ = descriptor;
|
||||||
|
return null;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
test "null" {
|
test "null" {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue