gpu: implement Device.createBindGroupLayout

Signed-off-by: Stephen Gutekanst <stephen@hexops.com>
This commit is contained in:
Stephen Gutekanst 2022-03-18 14:55:51 -07:00 committed by Stephen Gutekanst
parent 8588a08e05
commit d635bee216
6 changed files with 63 additions and 11 deletions

View file

@ -92,7 +92,8 @@ pub const BindingType = enum(u32) {
read_only_storage = 0x00000003, read_only_storage = 0x00000003,
}; };
pub const BindingLayout = struct { pub const BindingLayout = extern struct {
reserved: ?*anyopaque = null,
type: BindingType, type: BindingType,
has_dynamic_offset: bool, has_dynamic_offset: bool,
min_binding_size: u64, min_binding_size: u64,

View file

@ -16,6 +16,7 @@ const RenderPipeline = @import("RenderPipeline.zig");
const CommandEncoder = @import("CommandEncoder.zig"); const CommandEncoder = @import("CommandEncoder.zig");
const ComputePipeline = @import("ComputePipeline.zig"); const ComputePipeline = @import("ComputePipeline.zig");
const BindGroup = @import("BindGroup.zig"); const BindGroup = @import("BindGroup.zig");
const BindGroupLayout = @import("BindGroupLayout.zig");
const Device = @This(); const Device = @This();
@ -28,8 +29,7 @@ pub const VTable = struct {
reference: fn (ptr: *anyopaque) void, reference: fn (ptr: *anyopaque) void,
release: fn (ptr: *anyopaque) void, release: fn (ptr: *anyopaque) void,
createBindGroup: fn (ptr: *anyopaque, descriptor: *const BindGroup.Descriptor) BindGroup, createBindGroup: fn (ptr: *anyopaque, descriptor: *const BindGroup.Descriptor) BindGroup,
// createBindGroupLayout: fn (ptr: *anyopaque, descriptor: *const BindGroupLayout.Descriptor) BindGroupLayout, createBindGroupLayout: fn (ptr: *anyopaque, descriptor: *const BindGroupLayout.Descriptor) BindGroupLayout,
// WGPU_EXPORT WGPUBindGroupLayout wgpuDeviceCreateBindGroupLayout(WGPUDevice device, WGPUBindGroupLayoutDescriptor const * descriptor);
// createBuffer: fn (ptr: *anyopaque, descriptor: *const Buffer.Descriptor) Buffer, // createBuffer: fn (ptr: *anyopaque, descriptor: *const Buffer.Descriptor) Buffer,
// WGPU_EXPORT WGPUBuffer wgpuDeviceCreateBuffer(WGPUDevice device, WGPUBufferDescriptor const * descriptor); // WGPU_EXPORT WGPUBuffer wgpuDeviceCreateBuffer(WGPUDevice device, WGPUBufferDescriptor const * descriptor);
createCommandEncoder: fn (ptr: *anyopaque, descriptor: ?*const CommandEncoder.Descriptor) CommandEncoder, createCommandEncoder: fn (ptr: *anyopaque, descriptor: ?*const CommandEncoder.Descriptor) CommandEncoder,
@ -103,8 +103,12 @@ pub inline fn getQueue(device: Device) Queue {
return device.vtable.getQueue(device.ptr); return device.vtable.getQueue(device.ptr);
} }
pub inline fn createBindGroup(device: Device, descriptor: *const BindGroup.Descriptor) void { pub inline fn createBindGroup(device: Device, descriptor: *const BindGroup.Descriptor) BindGroup {
device.vtable.createBindGroup(device.ptr, descriptor); return device.vtable.createBindGroup(device.ptr, descriptor);
}
pub inline fn createBindGroupLayout(device: Device, descriptor: *const BindGroupLayout.Descriptor) BindGroupLayout {
return device.vtable.createBindGroupLayout(device.ptr, descriptor);
} }
pub inline fn createShaderModule(device: Device, descriptor: *const ShaderModule.Descriptor) ShaderModule { pub inline fn createShaderModule(device: Device, descriptor: *const ShaderModule.Descriptor) ShaderModule {
@ -163,9 +167,11 @@ pub const LostReason = enum(u32) {
test { test {
_ = VTable; _ = VTable;
_ = getQueue;
_ = reference; _ = reference;
_ = release; _ = release;
_ = getQueue;
_ = createBindGroup;
_ = createBindGroupLayout;
_ = createShaderModule; _ = createShaderModule;
_ = nativeCreateSwapChain; _ = nativeCreateSwapChain;
_ = destroy; _ = destroy;

View file

@ -365,6 +365,48 @@ const device_vtable = Device.VTable{
return wrapBindGroup(c.wgpuDeviceCreateBindGroup(@ptrCast(c.WGPUDevice, ptr), &desc)); return wrapBindGroup(c.wgpuDeviceCreateBindGroup(@ptrCast(c.WGPUDevice, ptr), &desc));
} }
}).createBindGroup, }).createBindGroup,
.createBindGroupLayout = (struct {
pub fn createBindGroupLayout(ptr: *anyopaque, descriptor: *const BindGroupLayout.Descriptor) BindGroupLayout {
var few_entries: [16]c.WGPUBindGroupLayoutEntry = undefined;
const entries = if (descriptor.entries.len <= 8) blk: {
for (descriptor.entries) |entry, i| {
few_entries[i] = c.WGPUBindGroupLayoutEntry{
.nextInChain = null,
.binding = entry.binding,
.visibility = @enumToInt(entry.visibility),
.buffer = @bitCast(c.WGPUBufferBindingLayout, entry.buffer),
.sampler = @bitCast(c.WGPUSamplerBindingLayout, entry.sampler),
.texture = @bitCast(c.WGPUTextureBindingLayout, entry.texture),
.storageTexture = @bitCast(c.WGPUStorageTextureBindingLayout, entry.storage_texture),
};
}
break :blk few_entries[0..descriptor.entries.len];
} else blk: {
const mem = std.heap.page_allocator.alloc(c.WGPUBindGroupLayoutEntry, descriptor.entries.len) catch unreachable;
for (descriptor.entries) |entry, i| {
mem[i] = c.WGPUBindGroupLayoutEntry{
.nextInChain = null,
.binding = entry.binding,
.visibility = @enumToInt(entry.visibility),
.buffer = @bitCast(c.WGPUBufferBindingLayout, entry.buffer),
.sampler = @bitCast(c.WGPUSamplerBindingLayout, entry.sampler),
.texture = @bitCast(c.WGPUTextureBindingLayout, entry.texture),
.storageTexture = @bitCast(c.WGPUStorageTextureBindingLayout, entry.storage_texture),
};
}
break :blk mem;
};
defer if (entries.len > 8) std.heap.page_allocator.free(entries);
const desc = c.WGPUBindGroupLayoutDescriptor{
.nextInChain = null,
.label = if (descriptor.label) |l| l else null,
.entryCount = @intCast(u32, entries.len),
.entries = &entries[0],
};
return wrapBindGroupLayout(c.wgpuDeviceCreateBindGroupLayout(@ptrCast(c.WGPUDevice, ptr), &desc));
}
}).createBindGroupLayout,
.createShaderModule = (struct { .createShaderModule = (struct {
pub fn createShaderModule(ptr: *anyopaque, descriptor: *const ShaderModule.Descriptor) ShaderModule { pub fn createShaderModule(ptr: *anyopaque, descriptor: *const ShaderModule.Descriptor) ShaderModule {
switch (descriptor.code) { switch (descriptor.code) {
@ -676,7 +718,7 @@ const queue_vtable = Queue.VTable{
} }
var few_commands: [16]c.WGPUCommandBuffer = undefined; var few_commands: [16]c.WGPUCommandBuffer = undefined;
const commands = if (cmds.len <= 8) blk: { const commands = if (cmds.len <= 16) blk: {
for (cmds) |cmd, i| { for (cmds) |cmd, i| {
few_commands[i] = @ptrCast(c.WGPUCommandBuffer, cmd.ptr); few_commands[i] = @ptrCast(c.WGPUCommandBuffer, cmd.ptr);
} }
@ -688,7 +730,7 @@ const queue_vtable = Queue.VTable{
} }
break :blk mem; break :blk mem;
}; };
defer if (cmds.len > 8) std.heap.page_allocator.free(cmds); defer if (cmds.len > 16) std.heap.page_allocator.free(cmds);
c.wgpuQueueSubmit( c.wgpuQueueSubmit(
wgpu_queue, wgpu_queue,

View file

@ -34,7 +34,8 @@ pub const BindingType = enum(u32) {
comparison = 0x00000003, comparison = 0x00000003,
}; };
pub const BindingLayout = struct { pub const BindingLayout = extern struct {
reserved: ?*anyopaque = null,
type: BindingType, type: BindingType,
}; };

View file

@ -187,7 +187,8 @@ pub const SampleType = enum(u32) {
uint = 0x00000005, uint = 0x00000005,
}; };
pub const BindingLayout = struct { pub const BindingLayout = extern struct {
reserved: ?*anyopaque = null,
sample_type: SampleType, sample_type: SampleType,
view_dimension: TextureView.Dimension, view_dimension: TextureView.Dimension,
multisampled: bool, multisampled: bool,

View file

@ -35,7 +35,8 @@ pub const PrimitiveState = struct {
cull_mode: CullMode, cull_mode: CullMode,
}; };
pub const StorageTextureBindingLayout = struct { pub const StorageTextureBindingLayout = extern struct {
reserved: ?*anyopaque = null,
access: StorageTextureAccess, access: StorageTextureAccess,
format: Texture.Format, format: Texture.Format,
view_dimension: TextureView.Dimension, view_dimension: TextureView.Dimension,