crystal-vk 0.1.1

Graphics wrapper for Vulkan
Documentation
pub mod descriptor_set_layout;
pub mod layout;

use std::{
    error::Error,
    sync::{Arc, Mutex},
};

use ash::vk;

use crate::device::Device;

pub struct DescriptorPool {
    pub(crate) handle: vk::DescriptorPool,
    pub device: Arc<Device>,
}

unsafe impl Send for DescriptorPool {}
unsafe impl Sync for DescriptorPool {}

impl Drop for DescriptorPool {
    fn drop(&mut self) {
        unsafe {
            self.device
                .handle
                .destroy_descriptor_pool(self.handle, None);
        }
    }
}

impl DescriptorPool {
    pub fn new(
        device: Arc<Device>,
        descriptor_sizes: &[vk::DescriptorPoolSize],
    ) -> Result<Arc<Mutex<Self>>, Box<dyn Error>> {
        let pool_info = vk::DescriptorPoolCreateInfo::default()
            .pool_sizes(descriptor_sizes)
            .max_sets(
                descriptor_sizes
                    .iter()
                    .map(|size| size.descriptor_count)
                    .sum(),
            )
            .flags(
                vk::DescriptorPoolCreateFlags::UPDATE_AFTER_BIND
                    & vk::DescriptorPoolCreateFlags::FREE_DESCRIPTOR_SET,
            );

        let descriptor_pool = unsafe { device.handle.create_descriptor_pool(&pool_info, None) }?;

        let descriptor_pool = Arc::new(Mutex::new(Self {
            handle: descriptor_pool,
            device,
        }));

        Ok(descriptor_pool)
    }
}