naga/back/msl/
sampler.rs

1#[cfg(feature = "deserialize")]
2use serde::Deserialize;
3#[cfg(feature = "serialize")]
4use serde::Serialize;
5use std::{num::NonZeroU32, ops::Range};
6
7#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
8#[cfg_attr(feature = "serialize", derive(Serialize))]
9#[cfg_attr(feature = "deserialize", derive(Deserialize))]
10pub enum Coord {
11    Normalized,
12    Pixel,
13}
14
15impl Default for Coord {
16    fn default() -> Self {
17        Self::Normalized
18    }
19}
20
21impl Coord {
22    pub const fn as_str(&self) -> &'static str {
23        match *self {
24            Self::Normalized => "normalized",
25            Self::Pixel => "pixel",
26        }
27    }
28}
29
30#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
31#[cfg_attr(feature = "serialize", derive(Serialize))]
32#[cfg_attr(feature = "deserialize", derive(Deserialize))]
33pub enum Address {
34    Repeat,
35    MirroredRepeat,
36    ClampToEdge,
37    ClampToZero,
38    ClampToBorder,
39}
40
41impl Default for Address {
42    fn default() -> Self {
43        Self::ClampToEdge
44    }
45}
46
47impl Address {
48    pub const fn as_str(&self) -> &'static str {
49        match *self {
50            Self::Repeat => "repeat",
51            Self::MirroredRepeat => "mirrored_repeat",
52            Self::ClampToEdge => "clamp_to_edge",
53            Self::ClampToZero => "clamp_to_zero",
54            Self::ClampToBorder => "clamp_to_border",
55        }
56    }
57}
58
59#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
60#[cfg_attr(feature = "serialize", derive(Serialize))]
61#[cfg_attr(feature = "deserialize", derive(Deserialize))]
62pub enum BorderColor {
63    TransparentBlack,
64    OpaqueBlack,
65    OpaqueWhite,
66}
67
68impl Default for BorderColor {
69    fn default() -> Self {
70        Self::TransparentBlack
71    }
72}
73
74impl BorderColor {
75    pub const fn as_str(&self) -> &'static str {
76        match *self {
77            Self::TransparentBlack => "transparent_black",
78            Self::OpaqueBlack => "opaque_black",
79            Self::OpaqueWhite => "opaque_white",
80        }
81    }
82}
83
84#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
85#[cfg_attr(feature = "serialize", derive(Serialize))]
86#[cfg_attr(feature = "deserialize", derive(Deserialize))]
87pub enum Filter {
88    Nearest,
89    Linear,
90}
91
92impl Filter {
93    pub const fn as_str(&self) -> &'static str {
94        match *self {
95            Self::Nearest => "nearest",
96            Self::Linear => "linear",
97        }
98    }
99}
100
101impl Default for Filter {
102    fn default() -> Self {
103        Self::Nearest
104    }
105}
106
107#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
108#[cfg_attr(feature = "serialize", derive(Serialize))]
109#[cfg_attr(feature = "deserialize", derive(Deserialize))]
110pub enum CompareFunc {
111    Never,
112    Less,
113    LessEqual,
114    Greater,
115    GreaterEqual,
116    Equal,
117    NotEqual,
118    Always,
119}
120
121impl Default for CompareFunc {
122    fn default() -> Self {
123        Self::Never
124    }
125}
126
127impl CompareFunc {
128    pub const fn as_str(&self) -> &'static str {
129        match *self {
130            Self::Never => "never",
131            Self::Less => "less",
132            Self::LessEqual => "less_equal",
133            Self::Greater => "greater",
134            Self::GreaterEqual => "greater_equal",
135            Self::Equal => "equal",
136            Self::NotEqual => "not_equal",
137            Self::Always => "always",
138        }
139    }
140}
141
142#[derive(Clone, Debug, Default, PartialEq)]
143#[cfg_attr(feature = "serialize", derive(Serialize))]
144#[cfg_attr(feature = "deserialize", derive(Deserialize))]
145pub struct InlineSampler {
146    pub coord: Coord,
147    pub address: [Address; 3],
148    pub border_color: BorderColor,
149    pub mag_filter: Filter,
150    pub min_filter: Filter,
151    pub mip_filter: Option<Filter>,
152    pub lod_clamp: Option<Range<f32>>,
153    pub max_anisotropy: Option<NonZeroU32>,
154    pub compare_func: CompareFunc,
155}
156
157impl Eq for InlineSampler {}
158
159#[allow(renamed_and_removed_lints)]
160#[allow(clippy::derive_hash_xor_eq)]
161impl std::hash::Hash for InlineSampler {
162    fn hash<H: std::hash::Hasher>(&self, hasher: &mut H) {
163        self.coord.hash(hasher);
164        self.address.hash(hasher);
165        self.border_color.hash(hasher);
166        self.mag_filter.hash(hasher);
167        self.min_filter.hash(hasher);
168        self.mip_filter.hash(hasher);
169        self.lod_clamp
170            .as_ref()
171            .map(|range| (range.start.to_bits(), range.end.to_bits()))
172            .hash(hasher);
173        self.max_anisotropy.hash(hasher);
174        self.compare_func.hash(hasher);
175    }
176}