gpu: add comptime gpu.Interface, gpu.Export for C ABI exports

Signed-off-by: Stephen Gutekanst <stephen@hexops.com>
This commit is contained in:
Stephen Gutekanst 2022-07-24 04:00:54 -07:00 committed by Stephen Gutekanst
parent 2ccf510696
commit 7f6cb8b511
3 changed files with 40 additions and 1 deletions

36
gpu/src/interface.zig Normal file
View file

@ -0,0 +1,36 @@
const Instance = @import("instance.zig").Instance;
/// Verifies that a gpu.Interface implementation exposes the expected function declarations.
pub fn Interface(comptime Impl: type) type {
assertDecl(Impl, "createInstance", fn (descriptor: *const Instance.Descriptor) callconv(.Inline) Instance);
return Impl;
}
fn assertDecl(comptime Impl: anytype, comptime name: []const u8, comptime T: type) void {
if (!@hasDecl(Impl, name)) @compileError("gpu.Interface missing declaration: " ++ @typeName(T));
const Decl = @TypeOf(@field(Impl, name));
if (Decl != T) @compileError("gpu.Interface field '" ++ name ++ "'\n\texpected type: " ++ @typeName(T) ++ "\n\t found type: " ++ @typeName(Decl));
}
/// Exports C ABI function declarations for the given gpu.Interface implementation.
pub fn Export(comptime Impl: type) type {
_ = Interface(Impl); // verify implementation is a valid interface
return struct {
// WGPU_EXPORT WGPUInstance wgpuCreateInstance(WGPUInstanceDescriptor const * descriptor);
export fn wgpuCreateInstance(descriptor: *const Instance.Descriptor) Instance {
return Impl.createInstance(descriptor);
}
};
}
/// A no-operation gpu.Interface implementation.
pub const NullInterface = Interface(struct {
pub inline fn createInstance(descriptor: *const Instance.Descriptor) Instance {
_ = descriptor;
return Instance.none;
}
});
test "null" {
_ = Export(NullInterface);
}