rafx_api/
sampler.rs

1#[cfg(feature = "rafx-dx12")]
2use crate::dx12::RafxSamplerDx12;
3#[cfg(any(
4    feature = "rafx-empty",
5    not(any(
6        feature = "rafx-dx12",
7        feature = "rafx-metal",
8        feature = "rafx-vulkan",
9        feature = "rafx-gles2",
10        feature = "rafx-gles3"
11    ))
12))]
13use crate::empty::RafxSamplerEmpty;
14#[cfg(feature = "rafx-gles2")]
15use crate::gles2::RafxSamplerGles2;
16#[cfg(feature = "rafx-gles3")]
17use crate::gles3::RafxSamplerGles3;
18#[cfg(feature = "rafx-metal")]
19use crate::metal::RafxSamplerMetal;
20#[cfg(feature = "rafx-vulkan")]
21use crate::vulkan::RafxSamplerVulkan;
22
23/// Configures how images will be sampled by the GPU
24///
25/// Samplers must not be dropped if they are in use by the GPU
26#[derive(Debug, Clone)]
27pub enum RafxSampler {
28    #[cfg(feature = "rafx-dx12")]
29    Dx12(RafxSamplerDx12),
30    #[cfg(feature = "rafx-vulkan")]
31    Vk(RafxSamplerVulkan),
32    #[cfg(feature = "rafx-metal")]
33    Metal(RafxSamplerMetal),
34    #[cfg(feature = "rafx-gles2")]
35    Gles2(RafxSamplerGles2),
36    #[cfg(feature = "rafx-gles3")]
37    Gles3(RafxSamplerGles3),
38    #[cfg(any(
39        feature = "rafx-empty",
40        not(any(
41            feature = "rafx-dx12",
42            feature = "rafx-metal",
43            feature = "rafx-vulkan",
44            feature = "rafx-gles2",
45            feature = "rafx-gles3"
46        ))
47    ))]
48    Empty(RafxSamplerEmpty),
49}
50
51impl RafxSampler {
52    /// Get the underlying dx12 API object. This provides access to any internally created
53    /// vulkan objects.
54    #[cfg(feature = "rafx-dx12")]
55    pub fn dx12_sampler(&self) -> Option<&RafxSamplerDx12> {
56        match self {
57            #[cfg(feature = "rafx-dx12")]
58            RafxSampler::Dx12(inner) => Some(inner),
59            #[cfg(feature = "rafx-vulkan")]
60            RafxSampler::Vk(_) => None,
61            #[cfg(feature = "rafx-metal")]
62            RafxSampler::Metal(_) => None,
63            #[cfg(feature = "rafx-gles2")]
64            RafxSampler::Gles2(_) => None,
65            #[cfg(feature = "rafx-gles3")]
66            RafxSampler::Gles3(_) => None,
67            #[cfg(any(
68                feature = "rafx-empty",
69                not(any(
70                    feature = "rafx-dx12",
71                    feature = "rafx-metal",
72                    feature = "rafx-vulkan",
73                    feature = "rafx-gles2",
74                    feature = "rafx-gles3"
75                ))
76            ))]
77            RafxSampler::Empty(_) => None,
78        }
79    }
80
81    /// Get the underlying vulkan API object. This provides access to any internally created
82    /// vulkan objects.
83    #[cfg(feature = "rafx-vulkan")]
84    pub fn vk_sampler(&self) -> Option<&RafxSamplerVulkan> {
85        match self {
86            #[cfg(feature = "rafx-dx12")]
87            RafxSampler::Dx12(_) => None,
88            #[cfg(feature = "rafx-vulkan")]
89            RafxSampler::Vk(inner) => Some(inner),
90            #[cfg(feature = "rafx-metal")]
91            RafxSampler::Metal(_) => None,
92            #[cfg(feature = "rafx-gles2")]
93            RafxSampler::Gles2(_) => None,
94            #[cfg(feature = "rafx-gles3")]
95            RafxSampler::Gles3(_) => None,
96            #[cfg(any(
97                feature = "rafx-empty",
98                not(any(
99                    feature = "rafx-dx12",
100                    feature = "rafx-metal",
101                    feature = "rafx-vulkan",
102                    feature = "rafx-gles2",
103                    feature = "rafx-gles3"
104                ))
105            ))]
106            RafxSampler::Empty(_) => None,
107        }
108    }
109
110    /// Get the underlying metal API object. This provides access to any internally created
111    /// metal objects.
112    #[cfg(feature = "rafx-metal")]
113    pub fn metal_sampler(&self) -> Option<&RafxSamplerMetal> {
114        match self {
115            #[cfg(feature = "rafx-dx12")]
116            RafxSampler::Dx12(_) => None,
117            #[cfg(feature = "rafx-vulkan")]
118            RafxSampler::Vk(_) => None,
119            #[cfg(feature = "rafx-metal")]
120            RafxSampler::Metal(inner) => Some(inner),
121            #[cfg(feature = "rafx-gles2")]
122            RafxSampler::Gles2(_) => None,
123            #[cfg(feature = "rafx-gles3")]
124            RafxSampler::Gles3(_) => None,
125            #[cfg(any(
126                feature = "rafx-empty",
127                not(any(
128                    feature = "rafx-dx12",
129                    feature = "rafx-metal",
130                    feature = "rafx-vulkan",
131                    feature = "rafx-gles2",
132                    feature = "rafx-gles3"
133                ))
134            ))]
135            RafxSampler::Empty(_) => None,
136        }
137    }
138
139    /// Get the underlying metal API object. This provides access to any internally created
140    /// metal objects.
141    #[cfg(feature = "rafx-gles2")]
142    pub fn gles2_sampler(&self) -> Option<&RafxSamplerGles2> {
143        match self {
144            #[cfg(feature = "rafx-dx12")]
145            RafxSampler::Dx12(_) => None,
146            #[cfg(feature = "rafx-vulkan")]
147            RafxSampler::Vk(_) => None,
148            #[cfg(feature = "rafx-metal")]
149            RafxSampler::Metal(_) => None,
150            #[cfg(feature = "rafx-gles2")]
151            RafxSampler::Gles2(inner) => Some(inner),
152            #[cfg(feature = "rafx-gles3")]
153            RafxSampler::Gles3(_) => None,
154            #[cfg(any(
155                feature = "rafx-empty",
156                not(any(
157                    feature = "rafx-dx12",
158                    feature = "rafx-metal",
159                    feature = "rafx-vulkan",
160                    feature = "rafx-gles2",
161                    feature = "rafx-gles3"
162                ))
163            ))]
164            RafxSampler::Empty(_) => None,
165        }
166    }
167
168    /// Get the underlying metal API object. This provides access to any internally created
169    /// metal objects.
170    #[cfg(feature = "rafx-gles3")]
171    pub fn gles3_sampler(&self) -> Option<&RafxSamplerGles3> {
172        match self {
173            #[cfg(feature = "rafx-dx12")]
174            RafxSampler::Dx12(_) => None,
175            #[cfg(feature = "rafx-vulkan")]
176            RafxSampler::Vk(_) => None,
177            #[cfg(feature = "rafx-metal")]
178            RafxSampler::Metal(_) => None,
179            #[cfg(feature = "rafx-gles2")]
180            RafxSampler::Gles2(_) => None,
181            #[cfg(feature = "rafx-gles3")]
182            RafxSampler::Gles3(inner) => Some(inner),
183            #[cfg(any(
184                feature = "rafx-empty",
185                not(any(
186                    feature = "rafx-dx12",
187                    feature = "rafx-metal",
188                    feature = "rafx-vulkan",
189                    feature = "rafx-gles2",
190                    feature = "rafx-gles3"
191                ))
192            ))]
193            RafxSampler::Empty(_) => None,
194        }
195    }
196
197    /// Get the underlying metal API object. This provides access to any internally created
198    /// metal objects.
199    #[cfg(any(
200        feature = "rafx-empty",
201        not(any(
202            feature = "rafx-dx12",
203            feature = "rafx-metal",
204            feature = "rafx-vulkan",
205            feature = "rafx-gles2",
206            feature = "rafx-gles3"
207        ))
208    ))]
209    pub fn empty_sampler(&self) -> Option<&RafxSamplerEmpty> {
210        match self {
211            #[cfg(feature = "rafx-dx12")]
212            RafxSampler::Dx12(_) => None,
213            #[cfg(feature = "rafx-vulkan")]
214            RafxSampler::Vk(_) => None,
215            #[cfg(feature = "rafx-metal")]
216            RafxSampler::Metal(_) => None,
217            #[cfg(feature = "rafx-gles2")]
218            RafxSampler::Gles2(_) => None,
219            #[cfg(feature = "rafx-gles3")]
220            RafxSampler::Gles3(_) => None,
221            #[cfg(any(
222                feature = "rafx-empty",
223                not(any(
224                    feature = "rafx-dx12",
225                    feature = "rafx-metal",
226                    feature = "rafx-vulkan",
227                    feature = "rafx-gles2",
228                    feature = "rafx-gles3"
229                ))
230            ))]
231            RafxSampler::Empty(inner) => Some(inner),
232        }
233    }
234}