diff --git a/gpu/src/NativeInstance.zig b/gpu/src/NativeInstance.zig index 3341b8aa..6a75c568 100644 --- a/gpu/src/NativeInstance.zig +++ b/gpu/src/NativeInstance.zig @@ -950,6 +950,30 @@ const render_pass_encoder_vtable = RenderPassEncoder.VTable{ c.wgpuRenderPassEncoderEnd(@ptrCast(c.WGPURenderPassEncoder, ptr)); } }).end, + .executeBundles = (struct { + pub fn executeBundles(ptr: *anyopaque, bundles: []RenderBundle) void { + var few_bundles: [16]c.WGPURenderBundle = undefined; + const c_bundles = if (bundles.len <= 8) blk: { + for (bundles) |bundle, i| { + few_bundles[i] = @ptrCast(c.WGPURenderBundle, bundle.ptr); + } + break :blk few_bundles[0..bundles.len]; + } else blk: { + const mem = std.heap.page_allocator.alloc(c.WGPURenderBundle, bundles.len) catch unreachable; + for (bundles) |bundle, i| { + mem[i] = @ptrCast(c.WGPURenderBundle, bundle.ptr); + } + break :blk mem; + }; + defer if (bundles.len > 8) std.heap.page_allocator.free(c_bundles); + + c.wgpuRenderPassEncoderExecuteBundles( + @ptrCast(c.WGPURenderPassEncoder, ptr), + @intCast(u32, c_bundles.len), + &c_bundles[0], + ); + } + }).executeBundles, }; fn wrapRenderBundleEncoder(enc: c.WGPURenderBundleEncoder) RenderBundleEncoder { diff --git a/gpu/src/RenderPassEncoder.zig b/gpu/src/RenderPassEncoder.zig index 06c80406..cfbd2ac1 100644 --- a/gpu/src/RenderPassEncoder.zig +++ b/gpu/src/RenderPassEncoder.zig @@ -4,6 +4,7 @@ const RenderPassDepthStencilAttachment = @import("structs.zig").RenderPassDepthS const RenderPassTimestampWrite = @import("structs.zig").RenderPassTimestampWrite; const RenderPipeline = @import("RenderPipeline.zig"); const Buffer = @import("Buffer.zig"); +const RenderBundle = @import("RenderBundle.zig"); const RenderPassEncoder = @This(); @@ -29,7 +30,7 @@ pub const VTable = struct { beginOcclusionQuery: fn (ptr: *anyopaque, query_index: u32) void, endOcclusionQuery: fn (ptr: *anyopaque) void, end: fn (ptr: *anyopaque) void, - // WGPU_EXPORT void wgpuRenderPassEncoderExecuteBundles(WGPURenderPassEncoder renderPassEncoder, uint32_t bundlesCount, WGPURenderBundle const * bundles); + executeBundles: fn (ptr: *anyopaque, bundles: []RenderBundle) void, // WGPU_EXPORT void wgpuRenderPassEncoderInsertDebugMarker(WGPURenderPassEncoder renderPassEncoder, char const * markerLabel); // WGPU_EXPORT void wgpuRenderPassEncoderPopDebugGroup(WGPURenderPassEncoder renderPassEncoder); // WGPU_EXPORT void wgpuRenderPassEncoderPushDebugGroup(WGPURenderPassEncoder renderPassEncoder, char const * groupLabel); @@ -94,6 +95,10 @@ pub inline fn end(pass: RenderPassEncoder) void { pass.vtable.end(pass.ptr); } +pub inline fn executeBundles(pass: RenderPassEncoder, bundles: []RenderBundle) void { + pass.vtable.executeBundles(pass.ptr, bundles); +} + pub inline fn setLabel(pass: RenderPassEncoder, label: [:0]const u8) void { pass.vtable.setLabel(pass.ptr, label); }