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#[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 ensure!(!samplers.is_empty());
95 ensure!(!sampler_create_infos.is_empty());
96 ensure!(samplers.len() == sampler_create_infos.len());
97
98 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}