use anyhow::Result;
use ash::vk;
use crate::util::cache::{Resource, ResourceKey};
use crate::Device;
#[derive(Derivative)]
#[derivative(Debug)]
pub struct DescriptorSetLayout {
#[derivative(Debug = "ignore")]
device: Device,
handle: vk::DescriptorSetLayout,
}
impl DescriptorSetLayout {
pub unsafe fn handle(&self) -> vk::DescriptorSetLayout {
self.handle
}
}
#[derive(Debug, Clone, Default)]
pub struct DescriptorSetLayoutCreateInfo {
pub bindings: Vec<vk::DescriptorSetLayoutBinding>,
pub persistent: bool,
}
impl ResourceKey for DescriptorSetLayoutCreateInfo {
fn persistent(&self) -> bool {
self.persistent
}
}
impl Resource for DescriptorSetLayout {
type Key = DescriptorSetLayoutCreateInfo;
type ExtraParams<'a> = ();
const MAX_TIME_TO_LIVE: u32 = 8;
fn create(device: Device, key: &Self::Key, _: Self::ExtraParams<'_>) -> Result<Self> {
let info = vk::DescriptorSetLayoutCreateInfo::builder()
.bindings(key.bindings.as_slice())
.build();
let handle = unsafe { device.create_descriptor_set_layout(&info, None)? };
#[cfg(feature = "log-objects")]
trace!("Created new VkDescriptorSetLayout {handle:p}");
Ok(Self {
device: device.clone(),
handle,
})
}
}
impl Drop for DescriptorSetLayout {
fn drop(&mut self) {
#[cfg(feature = "log-objects")]
trace!("Destroying VkDescriptorSetLayout {:p}", self.handle);
unsafe {
self.device.destroy_descriptor_set_layout(self.handle, None);
}
}
}