use std::collections::BTreeMap;
use std::sync::Arc;
use vulkano::descriptor_set::layout::{
DescriptorSetLayout, DescriptorSetLayoutBinding, DescriptorSetLayoutCreateInfo, DescriptorType,
};
use vulkano::device::Device;
use vulkano::shader::ShaderStages;
pub struct PipelineDescriptorSetLayouts {
pub global: Arc<DescriptorSetLayout>,
pub material: Arc<DescriptorSetLayout>,
pub rig: Arc<DescriptorSetLayout>,
}
impl PipelineDescriptorSetLayouts {
pub fn new(device: Arc<Device>) -> Result<Self, Box<dyn std::error::Error>> {
let mut bindings = BTreeMap::new();
let mut camera_binding =
DescriptorSetLayoutBinding::descriptor_type(DescriptorType::UniformBuffer);
camera_binding.descriptor_count = 1;
camera_binding.stages = ShaderStages::VERTEX | ShaderStages::FRAGMENT;
bindings.insert(0, camera_binding);
let mut lights_binding =
DescriptorSetLayoutBinding::descriptor_type(DescriptorType::StorageBuffer);
lights_binding.descriptor_count = 1;
lights_binding.stages = ShaderStages::FRAGMENT;
bindings.insert(1, lights_binding);
let global = DescriptorSetLayout::new(
device.clone(),
DescriptorSetLayoutCreateInfo {
bindings,
..Default::default()
},
)?;
let mut material_bindings = BTreeMap::new();
let mut material_params =
DescriptorSetLayoutBinding::descriptor_type(DescriptorType::UniformBuffer);
material_params.descriptor_count = 1;
material_params.stages = ShaderStages::FRAGMENT;
material_bindings.insert(0, material_params);
let mut base_color_tex =
DescriptorSetLayoutBinding::descriptor_type(DescriptorType::CombinedImageSampler);
base_color_tex.descriptor_count = 1;
base_color_tex.stages = ShaderStages::FRAGMENT;
material_bindings.insert(1, base_color_tex);
let material = DescriptorSetLayout::new(
device.clone(),
DescriptorSetLayoutCreateInfo {
bindings: material_bindings,
..Default::default()
},
)?;
let mut rig_bindings = BTreeMap::new();
let mut per_instance_lighting =
DescriptorSetLayoutBinding::descriptor_type(DescriptorType::StorageBuffer);
per_instance_lighting.descriptor_count = 1;
per_instance_lighting.stages = ShaderStages::FRAGMENT;
rig_bindings.insert(0, per_instance_lighting);
let mut deformation =
DescriptorSetLayoutBinding::descriptor_type(DescriptorType::StorageBuffer);
deformation.descriptor_count = 1;
deformation.stages = ShaderStages::VERTEX;
rig_bindings.insert(1, deformation);
let rig = DescriptorSetLayout::new(
device,
DescriptorSetLayoutCreateInfo {
bindings: rig_bindings,
..Default::default()
},
)?;
Ok(Self {
global,
material,
rig,
})
}
}