diff --git a/gpu/src/Buffer.zig b/gpu/src/Buffer.zig new file mode 100644 index 00000000..c0456577 --- /dev/null +++ b/gpu/src/Buffer.zig @@ -0,0 +1,32 @@ +const Buffer = @This(); + +/// The type erased pointer to the Buffer implementation +/// Equal to c.WGPUBuffer for NativeInstance. +ptr: *anyopaque, +vtable: *const VTable, + +pub const VTable = struct { + reference: fn (ptr: *anyopaque) void, + release: fn (ptr: *anyopaque) void, + // TODO: + // WGPU_EXPORT void wgpuBufferDestroy(WGPUBuffer buffer); + // WGPU_EXPORT void const * wgpuBufferGetConstMappedRange(WGPUBuffer buffer, size_t offset, size_t size); + // WGPU_EXPORT void * wgpuBufferGetMappedRange(WGPUBuffer buffer, size_t offset, size_t size); + // WGPU_EXPORT void wgpuBufferMapAsync(WGPUBuffer buffer, WGPUMapModeFlags mode, size_t offset, size_t size, WGPUBufferMapCallback callback, void * userdata); + // WGPU_EXPORT void wgpuBufferSetLabel(WGPUBuffer buffer, char const * label); + // WGPU_EXPORT void wgpuBufferUnmap(WGPUBuffer buffer); +}; + +pub inline fn reference(buffer: Buffer) void { + buffer.vtable.reference(buffer.ptr); +} + +pub inline fn release(buffer: Buffer) void { + buffer.vtable.release(buffer.ptr); +} + +test "syntax" { + _ = VTable; + _ = reference; + _ = release; +} diff --git a/gpu/src/NativeInstance.zig b/gpu/src/NativeInstance.zig index 36d1d53a..6e9008b6 100644 --- a/gpu/src/NativeInstance.zig +++ b/gpu/src/NativeInstance.zig @@ -32,6 +32,7 @@ const PipelineLayout = @import("PipelineLayout.zig"); const ExternalTexture = @import("ExternalTexture.zig"); const BindGroup = @import("BindGroup.zig"); const BindGroupLayout = @import("BindGroupLayout.zig"); +const Buffer = @import("Buffer.zig"); const TextureUsage = @import("enums.zig").TextureUsage; const TextureFormat = @import("enums.zig").TextureFormat; @@ -749,6 +750,26 @@ const bind_group_layout_vtable = BindGroupLayout.VTable{ }).release, }; +fn wrapBuffer(buffer: c.WGPUBuffer) Buffer { + return .{ + .ptr = buffer.?, + .vtable = &buffer_vtable, + }; +} + +const buffer_vtable = Buffer.VTable{ + .reference = (struct { + pub fn reference(ptr: *anyopaque) void { + c.wgpuBufferReference(@ptrCast(c.WGPUBuffer, ptr)); + } + }).reference, + .release = (struct { + pub fn release(ptr: *anyopaque) void { + c.wgpuBufferRelease(@ptrCast(c.WGPUBuffer, ptr)); + } + }).release, +}; + test "syntax" { _ = wrap; _ = interface_vtable; @@ -774,4 +795,5 @@ test "syntax" { _ = wrapExternalTexture; _ = wrapBindGroup; _ = wrapBindGroupLayout; + _ = wrapBuffer; } diff --git a/gpu/src/main.zig b/gpu/src/main.zig index 50a219f0..2c4b7e7a 100644 --- a/gpu/src/main.zig +++ b/gpu/src/main.zig @@ -47,6 +47,7 @@ pub const PipelineLayout = @import("PipelineLayout.zig"); pub const ExternalTexture = @import("ExternalTexture.zig"); pub const BindGroup = @import("BindGroup.zig"); pub const BindGroupLayout = @import("BindGroupLayout.zig"); +pub const Buffer = @import("Buffer.zig"); pub const Feature = @import("enums.zig").Feature; pub const TextureUsage = @import("enums.zig").TextureUsage; @@ -118,6 +119,7 @@ test "syntax" { _ = ExternalTexture; _ = BindGroup; _ = BindGroupLayout; + _ = Buffer; _ = Feature; }