diff --git a/gpu/src/NativeInstance.zig b/gpu/src/NativeInstance.zig index 5873e2b0..ef7d8135 100644 --- a/gpu/src/NativeInstance.zig +++ b/gpu/src/NativeInstance.zig @@ -26,6 +26,7 @@ const Sampler = @import("Sampler.zig"); const RenderPipeline = @import("RenderPipeline.zig"); const RenderPassEncoder = @import("RenderPassEncoder.zig"); const RenderBundleEncoder = @import("RenderBundleEncoder.zig"); +const RenderBundle = @import("RenderBundle.zig"); const TextureUsage = @import("enums.zig").TextureUsage; const TextureFormat = @import("enums.zig").TextureFormat; @@ -623,6 +624,26 @@ const render_bundle_encoder_vtable = RenderBundleEncoder.VTable{ }).release, }; +fn wrapRenderBundle(bundle: c.WGPURenderBundle) RenderBundle { + return .{ + .ptr = bundle.?, + .vtable = &render_bundle_vtable, + }; +} + +const render_bundle_vtable = RenderBundle.VTable{ + .reference = (struct { + pub fn reference(ptr: *anyopaque) void { + c.wgpuRenderBundleReference(@ptrCast(c.WGPURenderBundle, ptr)); + } + }).reference, + .release = (struct { + pub fn release(ptr: *anyopaque) void { + c.wgpuRenderBundleRelease(@ptrCast(c.WGPURenderBundle, ptr)); + } + }).release, +}; + test "syntax" { _ = wrap; _ = interface_vtable; @@ -642,4 +663,5 @@ test "syntax" { _ = wrapRenderPipeline; _ = wrapRenderPassEncoder; _ = wrapRenderBundleEncoder; + _ = wrapRenderBundle; } diff --git a/gpu/src/RenderBundle.zig b/gpu/src/RenderBundle.zig new file mode 100644 index 00000000..ea0954dd --- /dev/null +++ b/gpu/src/RenderBundle.zig @@ -0,0 +1,26 @@ +const RenderBundle = @This(); + +/// The type erased pointer to the RenderBundle implementation +/// Equal to c.WGPURenderBundle for NativeInstance. +ptr: *anyopaque, +vtable: *const VTable, + +pub const VTable = struct { + reference: fn (ptr: *anyopaque) void, + release: fn (ptr: *anyopaque) void, + // TODO: +}; + +pub inline fn reference(bundle: RenderBundle) void { + bundle.vtable.reference(bundle.ptr); +} + +pub inline fn release(bundle: RenderBundle) void { + bundle.vtable.release(bundle.ptr); +} + +test "syntax" { + _ = VTable; + _ = reference; + _ = release; +} diff --git a/gpu/src/TODO b/gpu/src/TODO index 8abf09d0..21163fb9 100644 --- a/gpu/src/TODO +++ b/gpu/src/TODO @@ -610,10 +610,6 @@ WGPU_EXPORT void wgpuQuerySetSetLabel(WGPUQuerySet querySet, char const * label) WGPU_EXPORT void wgpuQuerySetReference(WGPUQuerySet querySet); WGPU_EXPORT void wgpuQuerySetRelease(WGPUQuerySet querySet); -// Methods of RenderBundle -WGPU_EXPORT void wgpuRenderBundleReference(WGPURenderBundle renderBundle); -WGPU_EXPORT void wgpuRenderBundleRelease(WGPURenderBundle renderBundle); - typedef enum WGPUSType { // webgpu.h upstream: WGPUSType_Invalid = 0x00000000, diff --git a/gpu/src/main.zig b/gpu/src/main.zig index f9f916c7..dd538015 100644 --- a/gpu/src/main.zig +++ b/gpu/src/main.zig @@ -41,6 +41,7 @@ pub const Sampler = @import("Sampler.zig"); pub const RenderPipeline = @import("RenderPipeline.zig"); pub const RenderPassEncoder = @import("RenderPassEncoder.zig"); pub const RenderBundleEncoder = @import("RenderBundleEncoder.zig"); +pub const RenderBundle = @import("RenderBundle.zig"); pub const Feature = @import("enums.zig").Feature; pub const TextureUsage = @import("enums.zig").TextureUsage; @@ -106,6 +107,7 @@ test "syntax" { _ = RenderPipeline; _ = RenderPassEncoder; _ = RenderBundleEncoder; + _ = RenderBundle; _ = Feature; }