2022-12-27 21:09:42 +00:00
|
|
|
use crate::globals::GlobalsUniform;
|
2022-12-27 22:18:03 +00:00
|
|
|
use crate::{ColorAdjustments, GradientStorage, GradientUniforms, TextureTransforms, Transforms};
|
2022-12-27 21:09:42 +00:00
|
|
|
|
2022-09-07 02:45:33 +00:00
|
|
|
#[derive(Debug)]
|
|
|
|
pub struct BindLayouts {
|
|
|
|
pub globals: wgpu::BindGroupLayout,
|
|
|
|
pub transforms: wgpu::BindGroupLayout,
|
2022-12-27 22:18:03 +00:00
|
|
|
pub color_transforms: wgpu::BindGroupLayout,
|
2022-09-07 02:45:33 +00:00
|
|
|
pub bitmap: wgpu::BindGroupLayout,
|
|
|
|
pub gradient: wgpu::BindGroupLayout,
|
2022-12-18 14:10:07 +00:00
|
|
|
pub blend: wgpu::BindGroupLayout,
|
2022-09-07 02:45:33 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
impl BindLayouts {
|
|
|
|
pub fn new(device: &wgpu::Device) -> Self {
|
|
|
|
let uniform_buffer_layout_label = create_debug_label!("Uniform buffer bind group layout");
|
2023-01-06 17:41:24 +00:00
|
|
|
let transforms = if device.limits().max_storage_buffers_per_shader_stage > 0 {
|
|
|
|
device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor {
|
|
|
|
entries: &[],
|
|
|
|
label: uniform_buffer_layout_label.as_deref(),
|
|
|
|
})
|
|
|
|
} else {
|
|
|
|
device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor {
|
|
|
|
entries: &[wgpu::BindGroupLayoutEntry {
|
|
|
|
binding: 0,
|
|
|
|
visibility: wgpu::ShaderStages::VERTEX | wgpu::ShaderStages::FRAGMENT,
|
|
|
|
ty: wgpu::BindingType::Buffer {
|
|
|
|
ty: wgpu::BufferBindingType::Uniform,
|
|
|
|
has_dynamic_offset: true,
|
|
|
|
min_binding_size: wgpu::BufferSize::new(
|
|
|
|
std::mem::size_of::<Transforms>() as u64
|
|
|
|
),
|
|
|
|
},
|
|
|
|
count: None,
|
|
|
|
}],
|
|
|
|
label: uniform_buffer_layout_label.as_deref(),
|
|
|
|
})
|
|
|
|
};
|
2022-09-07 02:45:33 +00:00
|
|
|
|
2022-12-27 22:18:03 +00:00
|
|
|
let color_transforms = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor {
|
|
|
|
entries: &[wgpu::BindGroupLayoutEntry {
|
|
|
|
binding: 0,
|
|
|
|
visibility: wgpu::ShaderStages::VERTEX | wgpu::ShaderStages::FRAGMENT,
|
|
|
|
ty: wgpu::BindingType::Buffer {
|
|
|
|
ty: wgpu::BufferBindingType::Uniform,
|
|
|
|
has_dynamic_offset: true,
|
|
|
|
min_binding_size: wgpu::BufferSize::new(
|
|
|
|
std::mem::size_of::<ColorAdjustments>() as u64,
|
|
|
|
),
|
|
|
|
},
|
|
|
|
count: None,
|
|
|
|
}],
|
|
|
|
label: create_debug_label!("Color transforms bind group layout").as_deref(),
|
|
|
|
});
|
|
|
|
|
2022-09-07 02:45:33 +00:00
|
|
|
let globals_layout_label = create_debug_label!("Globals bind group layout");
|
|
|
|
let globals = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor {
|
|
|
|
label: globals_layout_label.as_deref(),
|
|
|
|
entries: &[wgpu::BindGroupLayoutEntry {
|
|
|
|
binding: 0,
|
|
|
|
visibility: wgpu::ShaderStages::VERTEX,
|
|
|
|
ty: wgpu::BindingType::Buffer {
|
|
|
|
ty: wgpu::BufferBindingType::Uniform,
|
|
|
|
has_dynamic_offset: false,
|
2022-12-27 21:09:42 +00:00
|
|
|
min_binding_size: wgpu::BufferSize::new(
|
|
|
|
std::mem::size_of::<GlobalsUniform>() as u64
|
|
|
|
),
|
2022-09-07 02:45:33 +00:00
|
|
|
},
|
|
|
|
count: None,
|
|
|
|
}],
|
|
|
|
});
|
|
|
|
|
|
|
|
let bitmap_bind_layout_label = create_debug_label!("Bitmap shape bind group layout");
|
|
|
|
let bitmap = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor {
|
|
|
|
entries: &[
|
|
|
|
wgpu::BindGroupLayoutEntry {
|
|
|
|
binding: 0,
|
|
|
|
visibility: wgpu::ShaderStages::VERTEX,
|
|
|
|
ty: wgpu::BindingType::Buffer {
|
|
|
|
ty: wgpu::BufferBindingType::Uniform,
|
|
|
|
has_dynamic_offset: false,
|
2022-12-27 21:09:42 +00:00
|
|
|
min_binding_size: wgpu::BufferSize::new(
|
|
|
|
std::mem::size_of::<TextureTransforms>() as u64,
|
|
|
|
),
|
2022-09-07 02:45:33 +00:00
|
|
|
},
|
|
|
|
count: None,
|
|
|
|
},
|
|
|
|
wgpu::BindGroupLayoutEntry {
|
|
|
|
binding: 1,
|
|
|
|
visibility: wgpu::ShaderStages::FRAGMENT,
|
|
|
|
ty: wgpu::BindingType::Texture {
|
|
|
|
multisampled: false,
|
|
|
|
sample_type: wgpu::TextureSampleType::Float { filterable: true },
|
|
|
|
view_dimension: wgpu::TextureViewDimension::D2,
|
|
|
|
},
|
|
|
|
count: None,
|
|
|
|
},
|
2022-09-08 20:13:16 +00:00
|
|
|
wgpu::BindGroupLayoutEntry {
|
|
|
|
binding: 2,
|
|
|
|
visibility: wgpu::ShaderStages::FRAGMENT,
|
|
|
|
ty: wgpu::BindingType::Sampler(wgpu::SamplerBindingType::Filtering),
|
|
|
|
count: None,
|
|
|
|
},
|
2022-09-07 02:45:33 +00:00
|
|
|
],
|
|
|
|
label: bitmap_bind_layout_label.as_deref(),
|
|
|
|
});
|
|
|
|
|
2022-12-18 14:10:07 +00:00
|
|
|
let blend_bind_layout_label = create_debug_label!("Blend bind group layout");
|
|
|
|
let blend = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor {
|
|
|
|
entries: &[
|
|
|
|
wgpu::BindGroupLayoutEntry {
|
|
|
|
binding: 0,
|
|
|
|
visibility: wgpu::ShaderStages::FRAGMENT,
|
|
|
|
ty: wgpu::BindingType::Texture {
|
|
|
|
multisampled: false,
|
|
|
|
sample_type: wgpu::TextureSampleType::Float { filterable: false },
|
|
|
|
view_dimension: wgpu::TextureViewDimension::D2,
|
|
|
|
},
|
|
|
|
count: None,
|
|
|
|
},
|
|
|
|
wgpu::BindGroupLayoutEntry {
|
|
|
|
binding: 1,
|
|
|
|
visibility: wgpu::ShaderStages::FRAGMENT,
|
|
|
|
ty: wgpu::BindingType::Texture {
|
|
|
|
multisampled: false,
|
|
|
|
sample_type: wgpu::TextureSampleType::Float { filterable: false },
|
|
|
|
view_dimension: wgpu::TextureViewDimension::D2,
|
|
|
|
},
|
|
|
|
count: None,
|
|
|
|
},
|
|
|
|
wgpu::BindGroupLayoutEntry {
|
|
|
|
binding: 2,
|
|
|
|
visibility: wgpu::ShaderStages::FRAGMENT,
|
|
|
|
ty: wgpu::BindingType::Sampler(wgpu::SamplerBindingType::NonFiltering),
|
|
|
|
count: None,
|
|
|
|
},
|
|
|
|
],
|
|
|
|
label: blend_bind_layout_label.as_deref(),
|
|
|
|
});
|
|
|
|
|
2022-09-07 02:45:33 +00:00
|
|
|
let gradient_bind_layout_label = create_debug_label!("Gradient shape bind group");
|
|
|
|
let gradient = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor {
|
|
|
|
entries: &[
|
|
|
|
wgpu::BindGroupLayoutEntry {
|
|
|
|
binding: 0,
|
|
|
|
visibility: wgpu::ShaderStages::VERTEX,
|
|
|
|
ty: wgpu::BindingType::Buffer {
|
|
|
|
ty: wgpu::BufferBindingType::Uniform,
|
|
|
|
has_dynamic_offset: false,
|
2022-12-27 21:09:42 +00:00
|
|
|
min_binding_size: wgpu::BufferSize::new(
|
|
|
|
std::mem::size_of::<TextureTransforms>() as u64,
|
|
|
|
),
|
2022-09-07 02:45:33 +00:00
|
|
|
},
|
|
|
|
count: None,
|
|
|
|
},
|
|
|
|
wgpu::BindGroupLayoutEntry {
|
|
|
|
binding: 1,
|
|
|
|
visibility: wgpu::ShaderStages::FRAGMENT,
|
|
|
|
ty: wgpu::BindingType::Buffer {
|
|
|
|
ty: if device.limits().max_storage_buffers_per_shader_stage > 0 {
|
|
|
|
wgpu::BufferBindingType::Storage { read_only: true }
|
|
|
|
} else {
|
|
|
|
wgpu::BufferBindingType::Uniform
|
|
|
|
},
|
|
|
|
has_dynamic_offset: false,
|
2022-12-27 21:09:42 +00:00
|
|
|
min_binding_size: wgpu::BufferSize::new(
|
|
|
|
if device.limits().max_storage_buffers_per_shader_stage > 0 {
|
|
|
|
std::mem::size_of::<GradientStorage>() as u64
|
|
|
|
} else {
|
|
|
|
std::mem::size_of::<GradientUniforms>() as u64
|
|
|
|
},
|
|
|
|
),
|
2022-09-07 02:45:33 +00:00
|
|
|
},
|
|
|
|
count: None,
|
|
|
|
},
|
|
|
|
],
|
|
|
|
label: gradient_bind_layout_label.as_deref(),
|
|
|
|
});
|
|
|
|
|
|
|
|
Self {
|
|
|
|
globals,
|
|
|
|
transforms,
|
2022-12-27 22:18:03 +00:00
|
|
|
color_transforms,
|
2022-09-07 02:45:33 +00:00
|
|
|
bitmap,
|
|
|
|
gradient,
|
2022-12-18 14:10:07 +00:00
|
|
|
blend,
|
2022-09-07 02:45:33 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|