vulk_ext/vkx/
sampler.rs

1use super::*;
2
3#[derive(Clone, Copy, Debug)]
4pub struct SamplerCreator(vk::SamplerCreateInfo);
5
6impl SamplerCreator {
7    #[must_use]
8    pub fn new() -> Self {
9        Self(vk::SamplerCreateInfo {
10            s_type: vk::StructureType::SamplerCreateInfo,
11            p_next: null(),
12            flags: vk::SamplerCreateFlags::empty(),
13            mag_filter: vk::Filter::Nearest,
14            min_filter: vk::Filter::Nearest,
15            mipmap_mode: vk::SamplerMipmapMode::Nearest,
16            address_mode_u: vk::SamplerAddressMode::ClampToEdge,
17            address_mode_v: vk::SamplerAddressMode::ClampToEdge,
18            address_mode_w: vk::SamplerAddressMode::ClampToEdge,
19            mip_lod_bias: 0.0,
20            anisotropy_enable: vk::FALSE,
21            max_anisotropy: 0.0,
22            compare_enable: vk::FALSE,
23            compare_op: vk::CompareOp::Always,
24            min_lod: 0.0,
25            max_lod: 0.0,
26            border_color: vk::BorderColor::FloatTransparentBlack,
27            unnormalized_coordinates: vk::FALSE,
28        })
29    }
30
31    #[must_use]
32    pub fn mag_filter(self, mag_filter: vk::Filter) -> Self {
33        Self(vk::SamplerCreateInfo {
34            mag_filter,
35            ..self.0
36        })
37    }
38
39    #[must_use]
40    pub fn min_filter(self, min_filter: vk::Filter) -> Self {
41        Self(vk::SamplerCreateInfo {
42            min_filter,
43            ..self.0
44        })
45    }
46
47    #[must_use]
48    pub fn mipmap_mode(self, mipmap_mode: vk::SamplerMipmapMode) -> Self {
49        Self(vk::SamplerCreateInfo {
50            mipmap_mode,
51            ..self.0
52        })
53    }
54
55    #[must_use]
56    pub fn address_mode_uvw(self, address_mode: vk::SamplerAddressMode) -> Self {
57        Self(vk::SamplerCreateInfo {
58            address_mode_u: address_mode,
59            address_mode_v: address_mode,
60            address_mode_w: address_mode,
61            ..self.0
62        })
63    }
64
65    pub unsafe fn create(self, device: &Device) -> Result<(vk::Sampler, vk::SamplerCreateInfo)> {
66        let sampler_create_info = self.0;
67        let sampler = device.create_sampler(&sampler_create_info)?;
68        Ok((sampler, sampler_create_info))
69    }
70}
71
72impl Default for SamplerCreator {
73    fn default() -> Self {
74        Self::new()
75    }
76}
77
78/// [`SamplerResource`] is meant to be used by a shader.
79#[derive(Debug)]
80pub struct SamplerResource {
81    sampler: vk::Sampler,
82    sampler_create_info: vk::SamplerCreateInfo,
83    descriptor: Descriptor,
84}
85
86impl SamplerResource {
87    pub unsafe fn create(
88        physical_device: &PhysicalDevice,
89        device: &Device,
90        samplers: &[vk::Sampler],
91        sampler_create_infos: &[vk::SamplerCreateInfo],
92    ) -> Result<Vec<Self>> {
93        // Validation.
94        ensure!(!samplers.is_empty());
95        ensure!(!sampler_create_infos.is_empty());
96        ensure!(samplers.len() == sampler_create_infos.len());
97
98        // Sampler resources.
99        let mut sampler_resources = vec![];
100        for i in 0..samplers.len() {
101            let sampler = samplers[i];
102            let sampler_create_info = sampler_create_infos[i];
103            let descriptor = Descriptor::create(
104                physical_device,
105                device,
106                DescriptorCreateInfo::Sampler(sampler),
107            );
108            sampler_resources.push(Self {
109                sampler,
110                sampler_create_info,
111                descriptor,
112            });
113        }
114        Ok(sampler_resources)
115    }
116
117    pub unsafe fn destroy(self, device: &Device) {
118        device.destroy_sampler(self.sampler);
119    }
120
121    #[must_use]
122    pub fn handle(&self) -> vk::Sampler {
123        self.sampler
124    }
125
126    #[must_use]
127    pub fn create_info(&self) -> &vk::SamplerCreateInfo {
128        &self.sampler_create_info
129    }
130
131    #[must_use]
132    pub fn descriptor(&self) -> Descriptor {
133        self.descriptor
134    }
135}