diff --git a/gpu/README.md b/gpu/README.md index 51d5e3c1..0388cdec 100644 --- a/gpu/README.md +++ b/gpu/README.md @@ -155,10 +155,13 @@ The slice helpers are: * `Buffer.getConstMappedRange` * `Buffer.getMappedRange` * `CommandEncoder.writeBuffer` +* `ComputePassEncoder.setBindGroup` * `Device.enumerateFeaturesOwned` * `Queue.writeTexture` * `Queue.writeBuffer` * `RenderPassEncoder.executeBundles` +* `RenderBundleEncoder.setBindGroup` +* `RenderPassEncoder.setBindGroup` ### Typed callbacks @@ -220,7 +223,4 @@ There may be other opportunities for helpers, to improve the existing APIs, or a The following are definitive candidates for helpers we haven't implemented yet: -* `gpu.ComputePassEncoder.setBindGroup` (slice param) -* `gpu.RenderBundleEncoder.setBindGroup` (slice param) -* `gpu.RenderPassEncoder.setBindGroup` (slice param) -* Other `next_in_chain` extensions (look at dawn.json after the bug to get this documented was fixed) +* Other `next_in_chain` extensions (marked with a `// TODO` already) diff --git a/gpu/src/compute_pass_encoder.zig b/gpu/src/compute_pass_encoder.zig index 6617f60e..1d7481e9 100644 --- a/gpu/src/compute_pass_encoder.zig +++ b/gpu/src/compute_pass_encoder.zig @@ -33,8 +33,14 @@ pub const ComputePassEncoder = opaque { /// Default `dynamic_offset_count`: 0 /// Default `dynamic_offsets`: null - pub inline fn setBindGroup(compute_pass_encoder: *ComputePassEncoder, group_index: u32, group: *BindGroup, dynamic_offset_count: u32, dynamic_offsets: ?[*]const u32) void { - Impl.computePassEncoderSetBindGroup(compute_pass_encoder, group_index, group, dynamic_offset_count, dynamic_offsets); + pub inline fn setBindGroup(compute_pass_encoder: *ComputePassEncoder, group_index: u32, group: *BindGroup, dynamic_offsets: ?[]const u32) void { + Impl.computePassEncoderSetBindGroup( + compute_pass_encoder, + group_index, + group, + if (dynamic_offsets) |v| @intCast(u32, v.len) else 0, + if (dynamic_offsets) |v| v.ptr else null, + ); } pub inline fn setLabel(compute_pass_encoder: *ComputePassEncoder, label: [*:0]const u8) void { diff --git a/gpu/src/dawn_impl.zig b/gpu/src/dawn_impl.zig index 1a7f27bc..fa38601c 100644 --- a/gpu/src/dawn_impl.zig +++ b/gpu/src/dawn_impl.zig @@ -547,10 +547,10 @@ pub const Interface = struct { procs.deviceDestroy.?(@ptrCast(c.WGPUDevice, device)); } - pub inline fn deviceEnumerateFeatures(device: *gpu.Device, features: [*]gpu.FeatureName) usize { + pub inline fn deviceEnumerateFeatures(device: *gpu.Device, features: ?[*]gpu.FeatureName) usize { return procs.deviceEnumerateFeatures.?( @ptrCast(c.WGPUDevice, device), - @ptrCast([*]c.WGPUFeatureName, features), + @ptrCast(?[*]c.WGPUFeatureName, features), ); } diff --git a/gpu/src/device.zig b/gpu/src/device.zig index 718a1489..5844df80 100644 --- a/gpu/src/device.zig +++ b/gpu/src/device.zig @@ -1,3 +1,4 @@ +const std = @import("std"); const Queue = @import("queue.zig").Queue; const BindGroup = @import("bind_group.zig").BindGroup; const BindGroupLayout = @import("bind_group_layout.zig").BindGroupLayout; @@ -184,7 +185,7 @@ pub const Device = opaque { /// Call once with null to determine the array length, and again to fetch the feature list. /// /// Consider using the enumerateFeaturesOwned helper. - pub inline fn enumerateFeatures(device: *Device, features: [*]FeatureName) usize { + pub inline fn enumerateFeatures(device: *Device, features: ?[*]FeatureName) usize { return Impl.deviceEnumerateFeatures(device, features); } diff --git a/gpu/src/interface.zig b/gpu/src/interface.zig index 71d4f11d..a4024227 100644 --- a/gpu/src/interface.zig +++ b/gpu/src/interface.zig @@ -101,7 +101,7 @@ pub fn Interface(comptime T: type) type { assertDecl(T, "deviceCreateSwapChain", fn (device: *gpu.Device, surface: ?*gpu.Surface, descriptor: *const gpu.SwapChain.Descriptor) callconv(.Inline) *gpu.SwapChain); assertDecl(T, "deviceCreateTexture", fn (device: *gpu.Device, descriptor: *const gpu.Texture.Descriptor) callconv(.Inline) *gpu.Texture); assertDecl(T, "deviceDestroy", fn (device: *gpu.Device) callconv(.Inline) void); - assertDecl(T, "deviceEnumerateFeatures", fn (device: *gpu.Device, features: [*]gpu.FeatureName) callconv(.Inline) usize); + assertDecl(T, "deviceEnumerateFeatures", fn (device: *gpu.Device, features: ?[*]gpu.FeatureName) callconv(.Inline) usize); assertDecl(T, "deviceGetLimits", fn (device: *gpu.Device, limits: *gpu.SupportedLimits) callconv(.Inline) bool); assertDecl(T, "deviceGetQueue", fn (device: *gpu.Device) callconv(.Inline) *gpu.Queue); assertDecl(T, "deviceHasFeature", fn (device: *gpu.Device, feature: gpu.FeatureName) callconv(.Inline) bool); @@ -651,7 +651,7 @@ pub fn Export(comptime T: type) type { } // WGPU_EXPORT size_t wgpuDeviceEnumerateFeatures(WGPUDevice device, WGPUFeatureName * features); - export fn wgpuDeviceEnumerateFeatures(device: *gpu.Device, features: [*]gpu.FeatureName) usize { + export fn wgpuDeviceEnumerateFeatures(device: *gpu.Device, features: ?[*]gpu.FeatureName) usize { return T.deviceEnumerateFeatures(device, features); } @@ -1747,7 +1747,7 @@ pub const StubInterface = Interface(struct { unreachable; } - pub inline fn deviceEnumerateFeatures(device: *gpu.Device, features: [*]gpu.FeatureName) usize { + pub inline fn deviceEnumerateFeatures(device: *gpu.Device, features: ?[*]gpu.FeatureName) usize { _ = device; _ = features; unreachable; diff --git a/gpu/src/render_bundle_encoder.zig b/gpu/src/render_bundle_encoder.zig index 3ca34a63..f915b0ea 100644 --- a/gpu/src/render_bundle_encoder.zig +++ b/gpu/src/render_bundle_encoder.zig @@ -60,8 +60,14 @@ pub const RenderBundleEncoder = opaque { /// Default `dynamic_offsets_count`: 0 /// Default `dynamic_offsets`: `null` - pub inline fn setBindGroup(render_bundle_encoder: *RenderBundleEncoder, group_index: u32, group: *BindGroup, dynamic_offset_count: u32, dynamic_offsets: ?[*]const u32) void { - Impl.renderBundleEncoderSetBindGroup(render_bundle_encoder, group_index, group, dynamic_offset_count, dynamic_offsets); + pub inline fn setBindGroup(render_bundle_encoder: *RenderBundleEncoder, group_index: u32, group: *BindGroup, dynamic_offsets: ?[]const u32) void { + Impl.renderBundleEncoderSetBindGroup( + render_bundle_encoder, + group_index, + group, + if (dynamic_offsets) |v| @intCast(u32, v.len) else 0, + if (dynamic_offsets) |v| v.ptr else null, + ); } /// Default `offset`: 0 diff --git a/gpu/src/render_pass_encoder.zig b/gpu/src/render_pass_encoder.zig index 416d677d..41710857 100644 --- a/gpu/src/render_pass_encoder.zig +++ b/gpu/src/render_pass_encoder.zig @@ -68,8 +68,14 @@ pub const RenderPassEncoder = opaque { /// Default `dynamic_offsets_count`: 0 /// Default `dynamic_offsets`: `null` - pub inline fn setBindGroup(render_pass_encoder: *RenderPassEncoder, group_index: u32, group: *BindGroup, dynamic_offset_count: u32, dynamic_offsets: ?[*]const u32) void { - Impl.renderPassEncoderSetBindGroup(render_pass_encoder, group_index, group, dynamic_offset_count, dynamic_offsets); + pub inline fn setBindGroup(render_pass_encoder: *RenderPassEncoder, group_index: u32, group: *BindGroup, dynamic_offsets: ?[]const u32) void { + Impl.renderPassEncoderSetBindGroup( + render_pass_encoder, + group_index, + group, + if (dynamic_offsets) |v| @intCast(u32, v.len) else 0, + if (dynamic_offsets) |v| v.ptr else null, + ); } pub inline fn setBlendConstant(render_pass_encoder: *RenderPassEncoder, color: *const Color) void {