1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
use std::ptr;
use crate::device::Device;
use crate::image::Filter;
use crate::image::Wrap;
use crate::vk;
pub(crate) struct Sampler {
handle: vk::Sampler,
}
impl Sampler {
pub(crate) fn new(
device: &Device,
wrap: Wrap,
filter: Filter,
mipmaps: bool,
anisotropy: f32,
) -> Self {
let max_lod = if mipmaps { 16.0 } else { 0.0 };
let mipmap_mode = if mipmaps {
vk::SAMPLER_MIPMAP_MODE_LINEAR
} else {
vk::SAMPLER_MIPMAP_MODE_NEAREST
};
let max_anisotropy = if mipmaps { anisotropy } else { 0.0 };
let anisotropy_enable = if mipmaps { vk::TRUE } else { vk::FALSE };
let info = vk::SamplerCreateInfo {
s_type: vk::STRUCTURE_TYPE_SAMPLER_CREATE_INFO,
p_next: ptr::null(),
flags: 0,
mag_filter: filter.flag(),
min_filter: filter.flag(),
address_mode_u: wrap.flag(),
address_mode_v: wrap.flag(),
address_mode_w: wrap.flag(),
mip_lod_bias: 0.0,
compare_enable: vk::TRUE,
compare_op: vk::COMPARE_OP_LESS_OR_EQUAL,
min_lod: 0.0,
border_color: vk::BORDER_COLOR_FLOAT_OPAQUE_WHITE,
unnormalized_coordinates: vk::FALSE,
mipmap_mode,
anisotropy_enable,
max_anisotropy,
max_lod,
};
let handle = device.create_sampler(&info);
Self { handle }
}
pub(crate) fn destroy(&self, device: &Device) {
device.destroy_sampler(self.handle);
}
pub(crate) const fn handle(&self) -> vk::Sampler {
self.handle
}
}