gpu: improve optional handling

Helps hexops/mach#182
This commit is contained in:
Andrew Gutekanst 2022-04-12 21:14:31 -04:00 committed by Stephen Gutekanst
parent 9489fe7083
commit 9e945ce951
8 changed files with 53 additions and 49 deletions

View file

@ -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 { 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); 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 { 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, label: ?[*:0]const u8 = null,
usage: BufferUsage, usage: BufferUsage,
size: usize, size: usize,
mapped_at_creation: bool, mapped_at_creation: bool = false,
}; };
pub const BindingType = enum(u32) { pub const BindingType = enum(u32) {

View file

@ -19,7 +19,7 @@ vtable: *const VTable,
pub const VTable = struct { pub const VTable = struct {
reference: fn (ptr: *anyopaque) void, reference: fn (ptr: *anyopaque) void,
release: 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, beginRenderPass: fn (ptr: *anyopaque, descriptor: *const RenderPassEncoder.Descriptor) RenderPassEncoder,
clearBuffer: fn (ptr: *anyopaque, buffer: Buffer, offset: u64, size: u64) void, 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, 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); 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); return enc.vtable.beginComputePass(enc.ptr, descriptor);
} }

View file

@ -20,7 +20,7 @@ pub const VTable = struct {
insertDebugMarker: fn (ptr: *anyopaque, marker_label: [*:0]const u8) void, insertDebugMarker: fn (ptr: *anyopaque, marker_label: [*:0]const u8) void,
popDebugGroup: fn (ptr: *anyopaque) void, popDebugGroup: fn (ptr: *anyopaque) void,
pushDebugGroup: fn (ptr: *anyopaque, group_label: [*:0]const u8) 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, setLabel: fn (ptr: *anyopaque, label: [:0]const u8) void,
setPipeline: fn (ptr: *anyopaque, pipeline: ComputePipeline) void, setPipeline: fn (ptr: *anyopaque, pipeline: ComputePipeline) void,
writeTimestamp: fn (ptr: *anyopaque, query_set: QuerySet, query_index: u32) void, writeTimestamp: fn (ptr: *anyopaque, query_set: QuerySet, query_index: u32) void,
@ -71,7 +71,7 @@ pub inline fn setBindGroup(
enc: ComputePassEncoder, enc: ComputePassEncoder,
group_index: u32, group_index: u32,
group: BindGroup, group: BindGroup,
dynamic_offsets: []u32, dynamic_offsets: ?[]u32,
) void { ) void {
enc.vtable.setBindGroup(enc.ptr, group_index, group, dynamic_offsets); enc.vtable.setBindGroup(enc.ptr, group_index, group, dynamic_offsets);
} }

View file

@ -34,7 +34,7 @@ pub inline fn getBindGroupLayout(pipeline: ComputePipeline, group_index: u32) Bi
pub const Descriptor = struct { pub const Descriptor = struct {
label: ?[*:0]const u8 = null, label: ?[*:0]const u8 = null,
layout: PipelineLayout, layout: ?PipelineLayout = null,
compute: ProgrammableStageDescriptor, compute: ProgrammableStageDescriptor,
}; };

View file

@ -775,7 +775,7 @@ inline fn convertComputePipelineDescriptor(descriptor: *const ComputePipeline.De
return .{ return .{
.nextInChain = null, .nextInChain = null,
.label = if (descriptor.label) |l| l else 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{ .compute = c.WGPUProgrammableStageDescriptor{
.nextInChain = null, .nextInChain = null,
.module = @ptrCast(c.WGPUShaderModule, descriptor.compute.module.ptr), .module = @ptrCast(c.WGPUShaderModule, descriptor.compute.module.ptr),
@ -1842,37 +1842,41 @@ const command_encoder_vtable = CommandEncoder.VTable{
} }
}).setLabel, }).setLabel,
.beginComputePass = (struct { .beginComputePass = (struct {
pub fn beginComputePass(ptr: *anyopaque, d: *const ComputePassEncoder.Descriptor) ComputePassEncoder { pub fn beginComputePass(ptr: *anyopaque, descriptor: ?*const ComputePassEncoder.Descriptor) ComputePassEncoder {
var few_timestamp_writes: [8]c.WGPUComputePassTimestampWrite = undefined; if (descriptor) |d| {
const timestamp_writes = if (d.timestamp_writes.len <= 8) blk: { var few_timestamp_writes: [8]c.WGPUComputePassTimestampWrite = undefined;
for (d.timestamp_writes) |v, i| { const timestamp_writes = if (d.timestamp_writes.len <= 8) blk: {
few_timestamp_writes[i] = c.WGPUComputePassTimestampWrite{ for (d.timestamp_writes) |v, i| {
.querySet = @ptrCast(c.WGPUQuerySet, v.query_set.ptr), few_timestamp_writes[i] = c.WGPUComputePassTimestampWrite{
.queryIndex = v.query_index, .querySet = @ptrCast(c.WGPUQuerySet, v.query_set.ptr),
.location = @enumToInt(v.location), .queryIndex = v.query_index,
}; .location = @enumToInt(v.location),
} };
break :blk few_timestamp_writes[0..d.timestamp_writes.len]; }
} else blk: { break :blk few_timestamp_writes[0..d.timestamp_writes.len];
const mem = std.heap.page_allocator.alloc(c.WGPUComputePassTimestampWrite, d.timestamp_writes.len) catch unreachable; } else blk: {
for (d.timestamp_writes) |v, i| { const mem = std.heap.page_allocator.alloc(c.WGPUComputePassTimestampWrite, d.timestamp_writes.len) catch unreachable;
mem[i] = c.WGPUComputePassTimestampWrite{ for (d.timestamp_writes) |v, i| {
.querySet = @ptrCast(c.WGPUQuerySet, v.query_set.ptr), mem[i] = c.WGPUComputePassTimestampWrite{
.queryIndex = v.query_index, .querySet = @ptrCast(c.WGPUQuerySet, v.query_set.ptr),
.location = @enumToInt(v.location), .queryIndex = v.query_index,
}; .location = @enumToInt(v.location),
} };
break :blk mem; }
}; break :blk mem;
defer if (d.timestamp_writes.len > 8) std.heap.page_allocator.free(timestamp_writes); };
defer if (d.timestamp_writes.len > 8) std.heap.page_allocator.free(timestamp_writes);
const desc = c.WGPUComputePassDescriptor{ const desc = c.WGPUComputePassDescriptor{
.nextInChain = null, .nextInChain = null,
.label = if (d.label) |l| l else null, .label = if (d.label) |l| l else null,
.timestampWriteCount = @intCast(u32, timestamp_writes.len), .timestampWriteCount = @intCast(u32, timestamp_writes.len),
.timestampWrites = @ptrCast([*]const c.WGPUComputePassTimestampWrite, timestamp_writes.ptr), .timestampWrites = @ptrCast([*]const c.WGPUComputePassTimestampWrite, timestamp_writes.ptr),
}; };
return wrapComputePassEncoder(c.wgpuCommandEncoderBeginComputePass(@ptrCast(c.WGPUCommandEncoder, ptr), &desc)); return wrapComputePassEncoder(c.wgpuCommandEncoderBeginComputePass(@ptrCast(c.WGPUCommandEncoder, ptr), &desc));
} else {
return wrapComputePassEncoder(c.wgpuCommandEncoderBeginComputePass(@ptrCast(c.WGPUCommandEncoder, ptr), null));
}
} }
}).beginComputePass, }).beginComputePass,
.beginRenderPass = (struct { .beginRenderPass = (struct {
@ -2157,14 +2161,14 @@ const compute_pass_encoder_vtable = ComputePassEncoder.VTable{
ptr: *anyopaque, ptr: *anyopaque,
group_index: u32, group_index: u32,
group: BindGroup, group: BindGroup,
dynamic_offsets: []const u32, dynamic_offsets: ?[]const u32,
) void { ) void {
c.wgpuComputePassEncoderSetBindGroup( c.wgpuComputePassEncoderSetBindGroup(
@ptrCast(c.WGPUComputePassEncoder, ptr), @ptrCast(c.WGPUComputePassEncoder, ptr),
group_index, group_index,
@ptrCast(c.WGPUBindGroup, group.ptr), @ptrCast(c.WGPUBindGroup, group.ptr),
@intCast(u32, dynamic_offsets.len), if (dynamic_offsets) |d| @intCast(u32, d.len) else 0,
dynamic_offsets.ptr, if (dynamic_offsets) |d| d.ptr else null,
); );
} }
}).setBindGroup, }).setBindGroup,

View file

@ -182,7 +182,7 @@ pub inline fn writeTimestamp(pass: RenderPassEncoder, query_set: QuerySet, query
pub const Descriptor = struct { pub const Descriptor = struct {
label: ?[*:0]const u8 = null, label: ?[*:0]const u8 = null,
color_attachments: []const RenderPassColorAttachment, color_attachments: []const RenderPassColorAttachment,
depth_stencil_attachment: ?*const RenderPassDepthStencilAttachment, depth_stencil_attachment: ?*const RenderPassDepthStencilAttachment = null,
occlusion_query_set: ?QuerySet = null, occlusion_query_set: ?QuerySet = null,
timestamp_writes: ?[]RenderPassTimestampWrite = null, timestamp_writes: ?[]RenderPassTimestampWrite = null,
}; };

View file

@ -38,12 +38,12 @@ pub inline fn getBindGroupLayout(pipeline: RenderPipeline, group_index: u32) Bin
pub const Descriptor = struct { pub const Descriptor = struct {
label: ?[*:0]const u8 = null, label: ?[*:0]const u8 = null,
layout: ?PipelineLayout, layout: ?PipelineLayout = null,
vertex: VertexState, vertex: VertexState,
primitive: PrimitiveState, primitive: PrimitiveState = .{},
depth_stencil: ?*const DepthStencilState, depth_stencil: ?*const DepthStencilState = null,
multisample: MultisampleState, multisample: MultisampleState = .{},
fragment: ?*const FragmentState, fragment: ?*const FragmentState = null,
}; };
pub const CreateStatus = enum(u32) { pub const CreateStatus = enum(u32) {

View file

@ -69,7 +69,7 @@ pub const ProgrammableStageDescriptor = struct {
label: ?[*:0]const u8 = null, label: ?[*:0]const u8 = null,
module: ShaderModule, module: ShaderModule,
entry_point: [*:0]const u8, entry_point: [*:0]const u8,
constants: ?[]const ConstantEntry, constants: ?[]const ConstantEntry = null,
}; };
pub const ComputePassTimestampWrite = struct { pub const ComputePassTimestampWrite = struct {
@ -123,7 +123,7 @@ pub const FragmentState = struct {
pub const ColorTargetState = extern struct { pub const ColorTargetState = extern struct {
reserved: ?*anyopaque = null, reserved: ?*anyopaque = null,
format: Texture.Format, format: Texture.Format,
blend: *const BlendState, blend: ?*const BlendState = null,
write_mask: ColorWriteMask = ColorWriteMask.all, write_mask: ColorWriteMask = ColorWriteMask.all,
}; };