crystal-vk 0.2.0

Graphics wrapper for Vulkan
Documentation
pub mod descriptor_set;

use std::{collections::BTreeMap, error::Error, sync::Arc};

use ash::vk;

use crate::device::Device;

#[derive(Clone)]
pub struct LayoutAllocInfo {
    pub stages: vk::ShaderStageFlags,
    pub typ: vk::DescriptorType,
    pub count: u32,
}

pub struct DescriptorSetLayout {
    pub handle: vk::DescriptorSetLayout,
    pub alloc_info: BTreeMap<u32, LayoutAllocInfo>,

    pub device: Arc<Device>,
}

unsafe impl Send for DescriptorSetLayout {}
unsafe impl Sync for DescriptorSetLayout {}

impl Drop for DescriptorSetLayout {
    fn drop(&mut self) {
        unsafe {
            self.device
                .handle
                .destroy_descriptor_set_layout(self.handle, None)
        }
    }
}

impl DescriptorSetLayout {
    pub fn new(
        device: Arc<Device>,
        layout_alloc_info: BTreeMap<u32, LayoutAllocInfo>,
    ) -> Result<Arc<Self>, Box<dyn Error>> {
        let bindings = layout_alloc_info
            .iter()
            .map(|(binding, layout_info)| {
                vk::DescriptorSetLayoutBinding::default()
                    .descriptor_type(layout_info.typ)
                    .stage_flags(layout_info.stages)
                    .descriptor_count(layout_info.count)
                    .binding(*binding)
            })
            .collect::<Vec<_>>();

        let create_info = vk::DescriptorSetLayoutCreateInfo::default().bindings(&bindings);

        let handle = unsafe {
            device
                .handle
                .create_descriptor_set_layout(&create_info, None)
        }?;

        Ok(Arc::new(Self {
            handle,
            alloc_info: layout_alloc_info,
            device,
        }))
    }
}