diff --git a/gpu/src/Buffer.zig b/gpu/src/Buffer.zig index 883e0b98..54f0778d 100644 --- a/gpu/src/Buffer.zig +++ b/gpu/src/Buffer.zig @@ -43,7 +43,7 @@ pub inline fn getConstMappedRange(buf: Buffer, comptime T: type, offset: usize, pub inline fn getMappedRange(buf: Buffer, comptime T: type, offset: usize, len: usize) []T { const data = buf.vtable.getMappedRange(buf.ptr, offset, @sizeOf(T) * len); - return @ptrCast([*]T, data.ptr)[0..len]; + return @ptrCast([*]T, @alignCast(@alignOf(T), data.ptr))[0..len]; } pub inline fn setLabel(buf: Buffer, label: [:0]const u8) void { @@ -91,7 +91,7 @@ pub const Descriptor = extern struct { label: ?[*:0]const u8 = null, usage: BufferUsage, size: usize, - mapped_at_creation: bool, + mapped_at_creation: bool = false, }; pub const BindingType = enum(u32) { diff --git a/gpu/src/CommandEncoder.zig b/gpu/src/CommandEncoder.zig index 421cd284..843fa017 100644 --- a/gpu/src/CommandEncoder.zig +++ b/gpu/src/CommandEncoder.zig @@ -19,7 +19,7 @@ vtable: *const VTable, pub const VTable = struct { reference: fn (ptr: *anyopaque) void, release: fn (ptr: *anyopaque) void, - beginComputePass: fn (ptr: *anyopaque, descriptor: *const ComputePassEncoder.Descriptor) ComputePassEncoder, + beginComputePass: fn (ptr: *anyopaque, descriptor: ?*const ComputePassEncoder.Descriptor) ComputePassEncoder, beginRenderPass: fn (ptr: *anyopaque, descriptor: *const RenderPassEncoder.Descriptor) RenderPassEncoder, clearBuffer: fn (ptr: *anyopaque, buffer: Buffer, offset: u64, size: u64) void, copyBufferToBuffer: fn (ptr: *anyopaque, source: Buffer, source_offset: u64, destination: Buffer, destination_offset: u64, size: u64) void, @@ -45,7 +45,7 @@ pub inline fn release(enc: CommandEncoder) void { enc.vtable.release(enc.ptr); } -pub inline fn beginComputePass(enc: CommandEncoder, descriptor: *const ComputePassEncoder.Descriptor) ComputePassEncoder { +pub inline fn beginComputePass(enc: CommandEncoder, descriptor: ?*const ComputePassEncoder.Descriptor) ComputePassEncoder { return enc.vtable.beginComputePass(enc.ptr, descriptor); } diff --git a/gpu/src/ComputePassEncoder.zig b/gpu/src/ComputePassEncoder.zig index d1453840..f490a2e4 100644 --- a/gpu/src/ComputePassEncoder.zig +++ b/gpu/src/ComputePassEncoder.zig @@ -20,7 +20,7 @@ pub const VTable = struct { insertDebugMarker: fn (ptr: *anyopaque, marker_label: [*:0]const u8) void, popDebugGroup: fn (ptr: *anyopaque) void, pushDebugGroup: fn (ptr: *anyopaque, group_label: [*:0]const u8) void, - setBindGroup: fn (ptr: *anyopaque, group_index: u32, group: BindGroup, dynamic_offsets: []u32) void, + setBindGroup: fn (ptr: *anyopaque, group_index: u32, group: BindGroup, dynamic_offsets: ?[]u32) void, setLabel: fn (ptr: *anyopaque, label: [:0]const u8) void, setPipeline: fn (ptr: *anyopaque, pipeline: ComputePipeline) void, writeTimestamp: fn (ptr: *anyopaque, query_set: QuerySet, query_index: u32) void, @@ -71,7 +71,7 @@ pub inline fn setBindGroup( enc: ComputePassEncoder, group_index: u32, group: BindGroup, - dynamic_offsets: []u32, + dynamic_offsets: ?[]u32, ) void { enc.vtable.setBindGroup(enc.ptr, group_index, group, dynamic_offsets); } diff --git a/gpu/src/ComputePipeline.zig b/gpu/src/ComputePipeline.zig index 7d842034..cce73d60 100644 --- a/gpu/src/ComputePipeline.zig +++ b/gpu/src/ComputePipeline.zig @@ -34,7 +34,7 @@ pub inline fn getBindGroupLayout(pipeline: ComputePipeline, group_index: u32) Bi pub const Descriptor = struct { label: ?[*:0]const u8 = null, - layout: PipelineLayout, + layout: ?PipelineLayout = null, compute: ProgrammableStageDescriptor, }; diff --git a/gpu/src/NativeInstance.zig b/gpu/src/NativeInstance.zig index 591f201a..151fb1ca 100644 --- a/gpu/src/NativeInstance.zig +++ b/gpu/src/NativeInstance.zig @@ -775,7 +775,7 @@ inline fn convertComputePipelineDescriptor(descriptor: *const ComputePipeline.De return .{ .nextInChain = null, .label = if (descriptor.label) |l| l else null, - .layout = @ptrCast(c.WGPUPipelineLayout, descriptor.layout.ptr), + .layout = if (descriptor.layout) |l| @ptrCast(c.WGPUPipelineLayout, l.ptr) else null, .compute = c.WGPUProgrammableStageDescriptor{ .nextInChain = null, .module = @ptrCast(c.WGPUShaderModule, descriptor.compute.module.ptr), @@ -1842,37 +1842,41 @@ const command_encoder_vtable = CommandEncoder.VTable{ } }).setLabel, .beginComputePass = (struct { - pub fn beginComputePass(ptr: *anyopaque, d: *const ComputePassEncoder.Descriptor) ComputePassEncoder { - var few_timestamp_writes: [8]c.WGPUComputePassTimestampWrite = undefined; - const timestamp_writes = if (d.timestamp_writes.len <= 8) blk: { - for (d.timestamp_writes) |v, i| { - few_timestamp_writes[i] = c.WGPUComputePassTimestampWrite{ - .querySet = @ptrCast(c.WGPUQuerySet, v.query_set.ptr), - .queryIndex = v.query_index, - .location = @enumToInt(v.location), - }; - } - break :blk few_timestamp_writes[0..d.timestamp_writes.len]; - } else blk: { - const mem = std.heap.page_allocator.alloc(c.WGPUComputePassTimestampWrite, d.timestamp_writes.len) catch unreachable; - for (d.timestamp_writes) |v, i| { - mem[i] = c.WGPUComputePassTimestampWrite{ - .querySet = @ptrCast(c.WGPUQuerySet, v.query_set.ptr), - .queryIndex = v.query_index, - .location = @enumToInt(v.location), - }; - } - break :blk mem; - }; - defer if (d.timestamp_writes.len > 8) std.heap.page_allocator.free(timestamp_writes); + pub fn beginComputePass(ptr: *anyopaque, descriptor: ?*const ComputePassEncoder.Descriptor) ComputePassEncoder { + if (descriptor) |d| { + var few_timestamp_writes: [8]c.WGPUComputePassTimestampWrite = undefined; + const timestamp_writes = if (d.timestamp_writes.len <= 8) blk: { + for (d.timestamp_writes) |v, i| { + few_timestamp_writes[i] = c.WGPUComputePassTimestampWrite{ + .querySet = @ptrCast(c.WGPUQuerySet, v.query_set.ptr), + .queryIndex = v.query_index, + .location = @enumToInt(v.location), + }; + } + break :blk few_timestamp_writes[0..d.timestamp_writes.len]; + } else blk: { + const mem = std.heap.page_allocator.alloc(c.WGPUComputePassTimestampWrite, d.timestamp_writes.len) catch unreachable; + for (d.timestamp_writes) |v, i| { + mem[i] = c.WGPUComputePassTimestampWrite{ + .querySet = @ptrCast(c.WGPUQuerySet, v.query_set.ptr), + .queryIndex = v.query_index, + .location = @enumToInt(v.location), + }; + } + break :blk mem; + }; + defer if (d.timestamp_writes.len > 8) std.heap.page_allocator.free(timestamp_writes); - const desc = c.WGPUComputePassDescriptor{ - .nextInChain = null, - .label = if (d.label) |l| l else null, - .timestampWriteCount = @intCast(u32, timestamp_writes.len), - .timestampWrites = @ptrCast([*]const c.WGPUComputePassTimestampWrite, timestamp_writes.ptr), - }; - return wrapComputePassEncoder(c.wgpuCommandEncoderBeginComputePass(@ptrCast(c.WGPUCommandEncoder, ptr), &desc)); + const desc = c.WGPUComputePassDescriptor{ + .nextInChain = null, + .label = if (d.label) |l| l else null, + .timestampWriteCount = @intCast(u32, timestamp_writes.len), + .timestampWrites = @ptrCast([*]const c.WGPUComputePassTimestampWrite, timestamp_writes.ptr), + }; + return wrapComputePassEncoder(c.wgpuCommandEncoderBeginComputePass(@ptrCast(c.WGPUCommandEncoder, ptr), &desc)); + } else { + return wrapComputePassEncoder(c.wgpuCommandEncoderBeginComputePass(@ptrCast(c.WGPUCommandEncoder, ptr), null)); + } } }).beginComputePass, .beginRenderPass = (struct { @@ -2157,14 +2161,14 @@ const compute_pass_encoder_vtable = ComputePassEncoder.VTable{ ptr: *anyopaque, group_index: u32, group: BindGroup, - dynamic_offsets: []const u32, + dynamic_offsets: ?[]const u32, ) void { c.wgpuComputePassEncoderSetBindGroup( @ptrCast(c.WGPUComputePassEncoder, ptr), group_index, @ptrCast(c.WGPUBindGroup, group.ptr), - @intCast(u32, dynamic_offsets.len), - dynamic_offsets.ptr, + if (dynamic_offsets) |d| @intCast(u32, d.len) else 0, + if (dynamic_offsets) |d| d.ptr else null, ); } }).setBindGroup, diff --git a/gpu/src/RenderPassEncoder.zig b/gpu/src/RenderPassEncoder.zig index 9570082d..22d5c02e 100644 --- a/gpu/src/RenderPassEncoder.zig +++ b/gpu/src/RenderPassEncoder.zig @@ -182,7 +182,7 @@ pub inline fn writeTimestamp(pass: RenderPassEncoder, query_set: QuerySet, query pub const Descriptor = struct { label: ?[*:0]const u8 = null, color_attachments: []const RenderPassColorAttachment, - depth_stencil_attachment: ?*const RenderPassDepthStencilAttachment, + depth_stencil_attachment: ?*const RenderPassDepthStencilAttachment = null, occlusion_query_set: ?QuerySet = null, timestamp_writes: ?[]RenderPassTimestampWrite = null, }; diff --git a/gpu/src/RenderPipeline.zig b/gpu/src/RenderPipeline.zig index 37c35803..2bf9d54f 100644 --- a/gpu/src/RenderPipeline.zig +++ b/gpu/src/RenderPipeline.zig @@ -38,12 +38,12 @@ pub inline fn getBindGroupLayout(pipeline: RenderPipeline, group_index: u32) Bin pub const Descriptor = struct { label: ?[*:0]const u8 = null, - layout: ?PipelineLayout, + layout: ?PipelineLayout = null, vertex: VertexState, - primitive: PrimitiveState, - depth_stencil: ?*const DepthStencilState, - multisample: MultisampleState, - fragment: ?*const FragmentState, + primitive: PrimitiveState = .{}, + depth_stencil: ?*const DepthStencilState = null, + multisample: MultisampleState = .{}, + fragment: ?*const FragmentState = null, }; pub const CreateStatus = enum(u32) { diff --git a/gpu/src/structs.zig b/gpu/src/structs.zig index 7d8607db..ffe6f816 100644 --- a/gpu/src/structs.zig +++ b/gpu/src/structs.zig @@ -69,7 +69,7 @@ pub const ProgrammableStageDescriptor = struct { label: ?[*:0]const u8 = null, module: ShaderModule, entry_point: [*:0]const u8, - constants: ?[]const ConstantEntry, + constants: ?[]const ConstantEntry = null, }; pub const ComputePassTimestampWrite = struct { @@ -123,7 +123,7 @@ pub const FragmentState = struct { pub const ColorTargetState = extern struct { reserved: ?*anyopaque = null, format: Texture.Format, - blend: *const BlendState, + blend: ?*const BlendState = null, write_mask: ColorWriteMask = ColorWriteMask.all, };