From acb304973978435eae2d734d323ea39eb1496663 Mon Sep 17 00:00:00 2001 From: Stephen Gutekanst Date: Fri, 18 Mar 2022 17:31:39 -0700 Subject: [PATCH] gpu: implement Device.createPipelineLayout Signed-off-by: Stephen Gutekanst --- gpu/src/Device.zig | 13 ++++++------- gpu/src/NativeInstance.zig | 30 +++++++++++++++++++++++++----- 2 files changed, 31 insertions(+), 12 deletions(-) diff --git a/gpu/src/Device.zig b/gpu/src/Device.zig index c6b80400..3c4e4b58 100644 --- a/gpu/src/Device.zig +++ b/gpu/src/Device.zig @@ -20,6 +20,7 @@ const BindGroup = @import("BindGroup.zig"); const BindGroupLayout = @import("BindGroupLayout.zig"); const Buffer = @import("Buffer.zig"); const ExternalTexture = @import("ExternalTexture.zig"); +const PipelineLayout = @import("PipelineLayout.zig"); const Device = @This(); @@ -43,7 +44,7 @@ pub const VTable = struct { ) void, createErrorBuffer: fn (ptr: *anyopaque) Buffer, createExternalTexture: fn (ptr: *anyopaque, descriptor: *const ExternalTexture.Descriptor) ExternalTexture, - // createPipelineLayout: fn (ptr: *anyopaque, descriptor: *const PipelineLayout.Descriptor) PipelineLayout, + createPipelineLayout: fn (ptr: *anyopaque, descriptor: *const PipelineLayout.Descriptor) PipelineLayout, // createQuerySet: fn (ptr: *anyopaque, descriptor: *const QuerySet.Descriptor) QuerySet, // createRenderBundleEncoder: fn (ptr: *anyopaque, descriptor: *const RenderBundleEncoder.Descriptor) RenderBundleEncoder, createRenderPipeline: fn (ptr: *anyopaque, descriptor: *const RenderPipeline.Descriptor) RenderPipeline, @@ -153,11 +154,9 @@ pub inline fn createExternalTexture(device: Device, descriptor: *const ExternalT return device.vtable.createExternalTexture(device.ptr, descriptor); } -// pub inline fn createPipelineLayout(device: Device, descriptor: *const PipelineLayout.Descriptor) PipelineLayout { -// return device.vtable.createPipelineLayout(device.ptr, descriptor); -// } -// createPipelineLayout: fn (ptr: *anyopaque, descriptor: *const PipelineLayout.Descriptor) PipelineLayout, -// WGPU_EXPORT WGPUPipelineLayout wgpuDeviceCreatePipelineLayout(WGPUDevice device, WGPUPipelineLayoutDescriptor const * descriptor); +pub inline fn createPipelineLayout(device: Device, descriptor: *const PipelineLayout.Descriptor) PipelineLayout { + return device.vtable.createPipelineLayout(device.ptr, descriptor); +} // pub inline fn createQuerySet(device: Device, descriptor: *const QuerySet.Descriptor) QuerySet { // return device.vtable.createQuerySet(device.ptr, descriptor); @@ -215,7 +214,7 @@ test { _ = createComputePipelineAsync; _ = createErrorBuffer; _ = createExternalTexture; - // _ = createPipelineLayout; + _ = createPipelineLayout; // _ = createQuerySet; // _ = createRenderBundleEncoder; _ = createRenderPipeline; diff --git a/gpu/src/NativeInstance.zig b/gpu/src/NativeInstance.zig index 9378de3a..04fd0369 100644 --- a/gpu/src/NativeInstance.zig +++ b/gpu/src/NativeInstance.zig @@ -523,12 +523,32 @@ const device_vtable = Device.VTable{ return wrapExternalTexture(c.wgpuDeviceCreateExternalTexture(@ptrCast(c.WGPUDevice, ptr), &desc)); } }).createExternalTexture, + .createPipelineLayout = (struct { + pub fn createPipelineLayout(ptr: *anyopaque, descriptor: *const PipelineLayout.Descriptor) PipelineLayout { + var few_bind_group_layouts: [16]c.WGPUBindGroupLayout = undefined; + const bind_group_layouts = if (descriptor.bind_group_layouts.len <= 16) blk: { + for (descriptor.bind_group_layouts) |layout, i| { + few_bind_group_layouts[i] = @ptrCast(c.WGPUBindGroupLayout, layout.ptr); + } + break :blk few_bind_group_layouts[0..descriptor.bind_group_layouts.len]; + } else blk: { + const mem = std.heap.page_allocator.alloc(c.WGPUBindGroupLayout, descriptor.bind_group_layouts.len) catch unreachable; + for (descriptor.bind_group_layouts) |layout, i| { + mem[i] = @ptrCast(c.WGPUBindGroupLayout, layout.ptr); + } + break :blk mem; + }; + defer if (descriptor.bind_group_layouts.len > 16) std.heap.page_allocator.free(descriptor.bind_group_layouts); - // pub inline fn createPipelineLayout(device: Device, descriptor: *const PipelineLayout.Descriptor) PipelineLayout { - // return device.vtable.createPipelineLayout(device.ptr); - // } - // createPipelineLayout: fn (ptr: *anyopaque, descriptor: *const PipelineLayout.Descriptor) PipelineLayout, - // WGPU_EXPORT WGPUPipelineLayout wgpuDeviceCreatePipelineLayout(WGPUDevice device, WGPUPipelineLayoutDescriptor const * descriptor); + const desc = c.WGPUPipelineLayoutDescriptor{ + .nextInChain = null, + .label = if (descriptor.label) |l| l else null, + .bindGroupLayoutCount = @intCast(u32, bind_group_layouts.len), + .bindGroupLayouts = &bind_group_layouts[0], + }; + return wrapPipelineLayout(c.wgpuDeviceCreatePipelineLayout(@ptrCast(c.WGPUDevice, ptr), &desc)); + } + }).createPipelineLayout, // pub inline fn createQuerySet(device: Device, descriptor: *const QuerySet.Descriptor) QuerySet { // return device.vtable.createQuerySet(device.ptr);