Skip to main content

ursus_core/render/gfx/sampler/
store.rs

1use crate::render::gfx::sampler::desc;
2use crate::render::gfx::sampler::desc::SamplerDesc;
3use crate::render::gfx::types::SamplerId;
4use ash::vk;
5
6struct StoredSampler {
7    handle: vk::Sampler,
8}
9
10pub struct SamplerStore {
11    samplers: Vec<StoredSampler>,
12    device: ash::Device,
13}
14
15impl SamplerStore {
16    pub fn new(device: ash::Device) -> Self {
17        Self { samplers: Vec::new(), device }
18    }
19
20    pub fn create(&mut self, desc: SamplerDesc) -> anyhow::Result<SamplerId> {
21        let handle = desc::create_from_desc(&self.device, desc)?;
22        let id = SamplerId(self.samplers.len() as u32);
23        self.samplers.push(StoredSampler { handle });
24        Ok(id)
25    }
26
27    pub(crate) fn handle(&self, id: SamplerId) -> vk::Sampler {
28        self.samplers[id.0 as usize].handle
29    }
30}
31
32impl Drop for SamplerStore {
33    fn drop(&mut self) {
34        unsafe {
35            for s in &self.samplers {
36                self.device.destroy_sampler(s.handle, None);
37            }
38        }
39    }
40}