From c3166e552b72d19a6743057514db003f78e02010 Mon Sep 17 00:00:00 2001 From: adrien Date: Mon, 18 May 2026 10:49:11 +0200 Subject: [PATCH] GpuBuffer init now take a EnumSet of BufferUsage and not a c.WGPUBufferUsage --- src/GpuBuffer.zig | 26 +++++++++++++++++++++++--- src/Vec.zig | 6 +++--- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/src/GpuBuffer.zig b/src/GpuBuffer.zig index f996473..c52c51d 100644 --- a/src/GpuBuffer.zig +++ b/src/GpuBuffer.zig @@ -7,18 +7,38 @@ size: u64, usage: c.WGPUBufferUsage, gloc: *GpuAllocator, +const BufferUsage = enum(u64) { + None = 0x0000000000000000, + MapRead = 0x0000000000000001, + MapWrite = 0x0000000000000002, + CopySrc = 0x0000000000000004, + CopyDst = 0x0000000000000008, + Index = 0x0000000000000010, + Vertex = 0x0000000000000020, + Uniform = 0x0000000000000040, + Storage = 0x0000000000000080, + Indirect = 0x0000000000000100, + QueryResolve = 0x0000000000000200, +}; + /// Allocates the underlying WebGPU handle and registers it to the parent GpuAllocator -pub fn init(gloc: *GpuAllocator, T: type, len: usize, usage: c.WGPUBufferUsage) !@This() { +pub fn init(gloc: *GpuAllocator, T: type, len: usize, usage: std.EnumSet(BufferUsage)) !@This() { switch (@typeInfo(T)) { .int, .float => {}, else => @compileError("GpuBuffer can only use int and float type"), } + + var use: u64 = 0; + var iter = usage.iterator(); + while (iter.next()) |flag| use |= @intFromEnum(flag); + const bytes = @sizeOf(T) * len; - const raw_handle = try gloc.registerBuffer(bytes, usage); + const raw_handle = try gloc.registerBuffer(bytes, use); + return .{ .raw = raw_handle, .size = bytes, - .usage = usage, + .usage = use, .gloc = gloc, }; } diff --git a/src/Vec.zig b/src/Vec.zig index 81ce9c1..c05ff9e 100644 --- a/src/Vec.zig +++ b/src/Vec.zig @@ -17,7 +17,7 @@ pub fn initZero(gloc: *GpuAllocator, len: usize) !Vec { gloc, f16, len, - c.WGPUBufferUsage_Storage | c.WGPUBufferUsage_CopyDst | c.WGPUBufferUsage_CopySrc, + .initMany(&.{ .Storage, .CopyDst, .CopySrc }), ), .len = len, }; @@ -68,7 +68,7 @@ pub fn read(self: Vec, gloc: *GpuAllocator, alloc: std.mem.Allocator) ![]f16 { gloc, f16, self.len, - c.WGPUBufferUsage_MapRead | c.WGPUBufferUsage_CopyDst, + .initMany(&.{ .MapRead, .CopyDst }), ); defer staging.deinit(); @@ -129,7 +129,7 @@ fn dispatch2in1out( gloc, u32, 1, - c.WGPUBufferUsage_Uniform | c.WGPUBufferUsage_CopyDst, + .initMany(&.{ .Uniform, .CopyDst }), ); defer info_buf.deinit();