diff --git a/gpu/src/bind_group_layout.zig b/gpu/src/bind_group_layout.zig index 6a888c35..38a6341a 100644 --- a/gpu/src/bind_group_layout.zig +++ b/gpu/src/bind_group_layout.zig @@ -3,7 +3,9 @@ const ShaderStageFlags = @import("types.zig").ShaderStageFlags; const Buffer = @import("buffer.zig").Buffer; const Sampler = @import("sampler.zig").Sampler; const Texture = @import("texture.zig").Texture; +const TextureView = @import("texture_view.zig").TextureView; const StorageTextureBindingLayout = @import("types.zig").StorageTextureBindingLayout; +const StorageTextureAccess = @import("types.zig").StorageTextureAccess; const Impl = @import("interface.zig").Impl; pub const BindGroupLayout = opaque { @@ -11,10 +13,80 @@ pub const BindGroupLayout = opaque { next_in_chain: ?*const ChainedStruct = null, binding: u32, visibility: ShaderStageFlags, - buffer: Buffer.BindingLayout, - sampler: Sampler.BindingLayout, - texture: Texture.BindingLayout, - storage_texture: StorageTextureBindingLayout, + buffer: Buffer.BindingLayout = .{}, + sampler: Sampler.BindingLayout = .{}, + texture: Texture.BindingLayout = .{}, + storage_texture: StorageTextureBindingLayout = .{}, + + /// Helper to create a buffer BindGroupLayout.Entry. + pub fn buffer( + binding: u32, + visibility: ShaderStageFlags, + binding_type: Buffer.BindingType, + has_dynamic_offset: bool, + min_binding_size: u64, + ) Entry { + return .{ + .binding = binding, + .visibility = visibility, + .buffer = .{ + .type = binding_type, + .has_dynamic_offset = has_dynamic_offset, + .min_binding_size = min_binding_size, + }, + }; + } + + /// Helper to create a sampler BindGroupLayout.Entry. + pub fn sampler( + binding: u32, + visibility: ShaderStageFlags, + binding_type: Sampler.BindingType, + ) Entry { + return .{ + .binding = binding, + .visibility = visibility, + .sampler = .{ .type = binding_type }, + }; + } + + /// Helper to create a texture BindGroupLayout.Entry. + pub fn texture( + binding: u32, + visibility: ShaderStageFlags, + sample_type: Texture.SampleType, + view_dimension: TextureView.Dimension, + multisampled: bool, + ) Entry { + return .{ + .binding = binding, + .visibility = visibility, + .texture = .{ + .sample_type = sample_type, + .view_dimension = view_dimension, + .multisampled = multisampled, + }, + }; + } + + /// Helper to create a storage texture BindGroupLayout.Entry. + pub fn storageTexture( + binding: u32, + visibility: ShaderStageFlags, + access: StorageTextureAccess, + format: Texture.Format, + view_dimension: TextureView.Dimension, + ) Entry { + return .{ + .binding = binding, + .visibility = visibility, + .storage_texture = .{ + .access = access, + .format = format, + .view_dimension = view_dimension, + }, + }; + } }; pub const Descriptor = extern struct {