From 2d6dbd335138fb0dfa9cfa685a8f789855458305 Mon Sep 17 00:00:00 2001 From: Stephen Gutekanst Date: Sun, 24 Jul 2022 15:18:13 -0700 Subject: [PATCH] gpu: add getProcAddress Signed-off-by: Stephen Gutekanst --- gpu/TODO-webgpu.h | 2 -- gpu/src/interface.zig | 13 +++++++++++++ gpu/src/main.zig | 4 ++++ 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/gpu/TODO-webgpu.h b/gpu/TODO-webgpu.h index a8364209..c0363c5a 100644 --- a/gpu/TODO-webgpu.h +++ b/gpu/TODO-webgpu.h @@ -10,8 +10,6 @@ typedef void (*WGPUQueueWorkDoneCallback)(WGPUQueueWorkDoneStatus status, void * typedef void (*WGPURequestAdapterCallback)(WGPURequestAdapterStatus status, WGPUAdapter adapter, char const * message, void * userdata); typedef void (*WGPURequestDeviceCallback)(WGPURequestDeviceStatus status, WGPUDevice device, char const * message, void * userdata); -WGPU_EXPORT WGPUProc wgpuGetProcAddress(WGPUDevice device, char const * procName); - // Methods of Adapter WGPU_EXPORT WGPUDevice wgpuAdapterCreateDevice(WGPUAdapter adapter, WGPUDeviceDescriptor const * descriptor /* nullable */); WGPU_EXPORT size_t wgpuAdapterEnumerateFeatures(WGPUAdapter adapter, WGPUFeatureName * features); diff --git a/gpu/src/interface.zig b/gpu/src/interface.zig index 263c169b..daac8700 100644 --- a/gpu/src/interface.zig +++ b/gpu/src/interface.zig @@ -1,9 +1,11 @@ const Instance = @import("instance.zig").Instance; const InstanceDescriptor = @import("instance.zig").InstanceDescriptor; +const gpu = @import("main.zig"); /// Verifies that a gpu.Interface implementation exposes the expected function declarations. pub fn Interface(comptime Impl: type) type { 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); return Impl; } @@ -21,6 +23,11 @@ pub fn Export(comptime Impl: type) type { export fn wgpuCreateInstance(descriptor: *const InstanceDescriptor) ?Instance { return Impl.createInstance(descriptor); } + + // WGPU_EXPORT WGPUProc wgpuGetProcAddress(WGPUDevice device, char const * procName); + export fn getProcAddress(device: gpu.Device, proc_name: [*:0]const u8) ?gpu.Proc { + return Impl.getProcAddress(device, proc_name); + } }; } @@ -30,6 +37,12 @@ pub const NullInterface = Interface(struct { _ = descriptor; return null; } + + pub inline fn getProcAddress(device: gpu.Device, proc_name: [*:0]const u8) ?gpu.Proc { + _ = device; + _ = proc_name; + return null; + } }); test "null" { diff --git a/gpu/src/main.zig b/gpu/src/main.zig index 48835c40..51ca7f2d 100644 --- a/gpu/src/main.zig +++ b/gpu/src/main.zig @@ -44,6 +44,10 @@ const query_set = @import("query_set.zig"); const texture_view = @import("texture_view.zig"); const surface = @import("surface.zig"); +/// Generic function pointer type, used for returning API function pointers. Must be +/// cast to a `fn (...) callconv(.C) T` before use. +pub const Proc = *anyopaque; + pub const ComputePassTimestampWrite = extern struct { query_set: query_set.QuerySet, query_index: u32,