From c90fb09de1079030fbe478dde1a2ede51d397074 Mon Sep 17 00:00:00 2001 From: Stephen Gutekanst Date: Tue, 15 Mar 2022 20:17:07 -0700 Subject: [PATCH] gpu: implement Device.createComputePipeline Signed-off-by: Stephen Gutekanst --- gpu/src/Device.zig | 9 ++++++++- gpu/src/NativeInstance.zig | 41 +++++++++++++++++++++++++++----------- 2 files changed, 37 insertions(+), 13 deletions(-) diff --git a/gpu/src/Device.zig b/gpu/src/Device.zig index 0671d220..18124019 100644 --- a/gpu/src/Device.zig +++ b/gpu/src/Device.zig @@ -29,7 +29,7 @@ pub const VTable = struct { // WGPU_EXPORT WGPUBindGroupLayout wgpuDeviceCreateBindGroupLayout(WGPUDevice device, WGPUBindGroupLayoutDescriptor const * descriptor); // WGPU_EXPORT WGPUBuffer wgpuDeviceCreateBuffer(WGPUDevice device, WGPUBufferDescriptor const * descriptor); createCommandEncoder: fn (ptr: *anyopaque, descriptor: ?*const CommandEncoder.Descriptor) CommandEncoder, - // WGPU_EXPORT WGPUComputePipeline wgpuDeviceCreateComputePipeline(WGPUDevice device, WGPUComputePipelineDescriptor const * descriptor); + createComputePipeline: fn (ptr: *anyopaque, descriptor: *const ComputePipeline.Descriptor) ComputePipeline, createComputePipelineAsync: fn ( ptr: *anyopaque, descriptor: *const ComputePipeline.Descriptor, @@ -97,6 +97,13 @@ pub inline fn createCommandEncoder(device: Device, descriptor: ?*const CommandEn return device.vtable.createCommandEncoder(device.ptr, descriptor); } +pub inline fn createComputePipeline( + device: Device, + descriptor: *const ComputePipeline.Descriptor, +) ComputePipeline { + return device.vtable.createComputePipeline(device.ptr, descriptor); +} + pub inline fn createComputePipelineAsync( device: Device, descriptor: *const ComputePipeline.Descriptor, diff --git a/gpu/src/NativeInstance.zig b/gpu/src/NativeInstance.zig index 3861a567..e3a05d9e 100644 --- a/gpu/src/NativeInstance.zig +++ b/gpu/src/NativeInstance.zig @@ -382,24 +382,26 @@ const device_vtable = Device.VTable{ return wrapCommandEncoder(c.wgpuDeviceCreateCommandEncoder(@ptrCast(c.WGPUDevice, ptr), desc)); } }).createCommandEncoder, + .createComputePipeline = (struct { + pub fn createComputePipeline( + ptr: *anyopaque, + descriptor: *const ComputePipeline.Descriptor, + ) ComputePipeline { + const desc = convertComputePipelineDescriptor(descriptor); + + return wrapComputePipeline(c.wgpuDeviceCreateComputePipeline( + @ptrCast(c.WGPUDevice, ptr), + &desc, + )); + } + }).createComputePipeline, .createComputePipelineAsync = (struct { pub fn createComputePipelineAsync( ptr: *anyopaque, descriptor: *const ComputePipeline.Descriptor, callback: *ComputePipeline.CreateCallback, ) void { - const desc = c.WGPUComputePipelineDescriptor{ - .nextInChain = null, - .label = if (descriptor.label) |l| l else null, - .layout = @ptrCast(c.WGPUPipelineLayout, descriptor.layout.ptr), - .compute = c.WGPUProgrammableStageDescriptor{ - .nextInChain = null, - .module = @ptrCast(c.WGPUShaderModule, descriptor.compute.module.ptr), - .entryPoint = descriptor.compute.entry_point, - .constantCount = if (descriptor.compute.constants) |v| @intCast(u32, v.len) else 0, - .constants = if (descriptor.compute.constants) |v| @ptrCast(*const c.WGPUConstantEntry, &v[0]) else null, - }, - }; + const desc = convertComputePipelineDescriptor(descriptor); const cCallback = (struct { pub fn cCallback( @@ -436,6 +438,21 @@ const device_vtable = Device.VTable{ }).createRenderPipeline, }; +inline fn convertComputePipelineDescriptor(descriptor: *const ComputePipeline.Descriptor) c.WGPUComputePipelineDescriptor { + return .{ + .nextInChain = null, + .label = if (descriptor.label) |l| l else null, + .layout = @ptrCast(c.WGPUPipelineLayout, descriptor.layout.ptr), + .compute = c.WGPUProgrammableStageDescriptor{ + .nextInChain = null, + .module = @ptrCast(c.WGPUShaderModule, descriptor.compute.module.ptr), + .entryPoint = descriptor.compute.entry_point, + .constantCount = if (descriptor.compute.constants) |v| @intCast(u32, v.len) else 0, + .constants = if (descriptor.compute.constants) |v| @ptrCast(*const c.WGPUConstantEntry, &v[0]) else null, + }, + }; +} + inline fn convertRenderPipelineDescriptor( d: *const RenderPipeline.Descriptor, tmp_depth_stencil: *c.WGPUDepthStencilState,