use wgpu::ShaderStages;
#[derive(Debug)]
pub struct BindingGroup {
pub wgpu: wgpu::BindGroup,
pub set_index: u32,
}
impl BindingGroup {
pub fn new(set_index: u32, wgpu: wgpu::BindGroup) -> Self {
Self { wgpu, set_index }
}
}
#[derive(Debug)]
pub struct BindingGroupLayout {
pub wgpu: wgpu::BindGroupLayout,
pub size: usize,
pub set_index: u32,
}
impl BindingGroupLayout {
pub fn new(set_index: u32, layout: wgpu::BindGroupLayout, size: usize) -> Self {
Self {
wgpu: layout,
size,
set_index,
}
}
}
pub trait Bind {
fn binding(&self, index: u32) -> wgpu::BindGroupEntry;
}
#[derive(Debug)]
pub enum BindingType {
UniformBuffer,
UniformBufferDynamic,
Sampler,
SampledTexture { multisampled: bool },
}
impl BindingType {
pub fn to_wgpu(&self) -> wgpu::BindingType {
match self {
BindingType::UniformBuffer => wgpu::BindingType::Buffer {
ty: wgpu::BufferBindingType::Uniform,
has_dynamic_offset: false,
min_binding_size: None,
},
BindingType::UniformBufferDynamic => wgpu::BindingType::Buffer {
ty: wgpu::BufferBindingType::Uniform,
has_dynamic_offset: false,
min_binding_size: None,
},
BindingType::SampledTexture { multisampled } => wgpu::BindingType::Texture {
sample_type: wgpu::TextureSampleType::Float { filterable: true },
multisampled: *multisampled,
view_dimension: wgpu::TextureViewDimension::D2,
},
BindingType::Sampler => wgpu::BindingType::Sampler(wgpu::SamplerBindingType::Filtering),
}
}
}
#[derive(Debug)]
pub struct Binding {
pub binding: BindingType,
pub stage: ShaderStages,
}