1#[cfg(feature = "rafx-dx12")]
2use crate::dx12::RafxFenceDx12;
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::RafxFenceEmpty;
14#[cfg(feature = "rafx-gles2")]
15use crate::gles2::RafxFenceGles2;
16#[cfg(feature = "rafx-gles3")]
17use crate::gles3::RafxFenceGles3;
18#[cfg(feature = "rafx-metal")]
19use crate::metal::RafxFenceMetal;
20#[cfg(feature = "rafx-vulkan")]
21use crate::vulkan::RafxFenceVulkan;
22use crate::{RafxFenceStatus, RafxResult};
23
24pub enum RafxFence {
37    #[cfg(feature = "rafx-dx12")]
38    Dx12(RafxFenceDx12),
39    #[cfg(feature = "rafx-vulkan")]
40    Vk(RafxFenceVulkan),
41    #[cfg(feature = "rafx-metal")]
42    Metal(RafxFenceMetal),
43    #[cfg(feature = "rafx-gles2")]
44    Gles2(RafxFenceGles2),
45    #[cfg(feature = "rafx-gles3")]
46    Gles3(RafxFenceGles3),
47    #[cfg(any(
48        feature = "rafx-empty",
49        not(any(
50            feature = "rafx-dx12",
51            feature = "rafx-metal",
52            feature = "rafx-vulkan",
53            feature = "rafx-gles2",
54            feature = "rafx-gles3"
55        ))
56    ))]
57    Empty(RafxFenceEmpty),
58}
59
60impl RafxFence {
61    pub fn get_fence_status(&self) -> RafxResult<RafxFenceStatus> {
67        match self {
68            #[cfg(feature = "rafx-dx12")]
69            RafxFence::Dx12(inner) => inner.get_fence_status(),
70            #[cfg(feature = "rafx-vulkan")]
71            RafxFence::Vk(inner) => inner.get_fence_status(),
72            #[cfg(feature = "rafx-metal")]
73            RafxFence::Metal(inner) => inner.get_fence_status(),
74            #[cfg(feature = "rafx-gles2")]
75            RafxFence::Gles2(inner) => inner.get_fence_status(),
76            #[cfg(feature = "rafx-gles3")]
77            RafxFence::Gles3(inner) => inner.get_fence_status(),
78            #[cfg(any(
79                feature = "rafx-empty",
80                not(any(
81                    feature = "rafx-dx12",
82                    feature = "rafx-metal",
83                    feature = "rafx-vulkan",
84                    feature = "rafx-gles2",
85                    feature = "rafx-gles3"
86                ))
87            ))]
88            RafxFence::Empty(inner) => inner.get_fence_status(),
89        }
90    }
91
92    pub fn wait(&self) -> RafxResult<()> {
94        match self {
95            #[cfg(feature = "rafx-dx12")]
96            RafxFence::Dx12(inner) => inner.wait(),
97            #[cfg(feature = "rafx-vulkan")]
98            RafxFence::Vk(inner) => inner.wait(),
99            #[cfg(feature = "rafx-metal")]
100            RafxFence::Metal(inner) => inner.wait(),
101            #[cfg(feature = "rafx-gles2")]
102            RafxFence::Gles2(inner) => inner.wait(),
103            #[cfg(feature = "rafx-gles3")]
104            RafxFence::Gles3(inner) => inner.wait(),
105            #[cfg(any(
106                feature = "rafx-empty",
107                not(any(
108                    feature = "rafx-dx12",
109                    feature = "rafx-metal",
110                    feature = "rafx-vulkan",
111                    feature = "rafx-gles2",
112                    feature = "rafx-gles3"
113                ))
114            ))]
115            RafxFence::Empty(inner) => inner.wait(),
116        }
117    }
118
119    #[cfg(feature = "rafx-dx12")]
122    pub fn dx12_fence(&self) -> Option<&RafxFenceDx12> {
123        match self {
124            #[cfg(feature = "rafx-dx12")]
125            RafxFence::Dx12(inner) => Some(inner),
126            #[cfg(feature = "rafx-vulkan")]
127            RafxFence::Vk(_) => None,
128            #[cfg(feature = "rafx-metal")]
129            RafxFence::Metal(_) => None,
130            #[cfg(feature = "rafx-gles2")]
131            RafxFence::Gles2(_) => None,
132            #[cfg(feature = "rafx-gles3")]
133            RafxFence::Gles3(_) => None,
134            #[cfg(any(
135                feature = "rafx-empty",
136                not(any(
137                    feature = "rafx-dx12",
138                    feature = "rafx-metal",
139                    feature = "rafx-vulkan",
140                    feature = "rafx-gles2",
141                    feature = "rafx-gles3"
142                ))
143            ))]
144            RafxFence::Empty(_) => None,
145        }
146    }
147
148    #[cfg(feature = "rafx-vulkan")]
151    pub fn vk_fence(&self) -> Option<&RafxFenceVulkan> {
152        match self {
153            #[cfg(feature = "rafx-dx12")]
154            RafxFence::Dx12(_) => None,
155            #[cfg(feature = "rafx-vulkan")]
156            RafxFence::Vk(inner) => Some(inner),
157            #[cfg(feature = "rafx-metal")]
158            RafxFence::Metal(_) => None,
159            #[cfg(feature = "rafx-gles2")]
160            RafxFence::Gles2(_) => None,
161            #[cfg(feature = "rafx-gles3")]
162            RafxFence::Gles3(_) => None,
163            #[cfg(any(
164                feature = "rafx-empty",
165                not(any(
166                    feature = "rafx-dx12",
167                    feature = "rafx-metal",
168                    feature = "rafx-vulkan",
169                    feature = "rafx-gles2",
170                    feature = "rafx-gles3"
171                ))
172            ))]
173            RafxFence::Empty(_) => None,
174        }
175    }
176
177    #[cfg(feature = "rafx-metal")]
180    pub fn metal_fence(&self) -> Option<&RafxFenceMetal> {
181        match self {
182            #[cfg(feature = "rafx-dx12")]
183            RafxFence::Dx12(_) => None,
184            #[cfg(feature = "rafx-vulkan")]
185            RafxFence::Vk(_) => None,
186            #[cfg(feature = "rafx-metal")]
187            RafxFence::Metal(inner) => Some(inner),
188            #[cfg(feature = "rafx-gles2")]
189            RafxFence::Gles2(_) => None,
190            #[cfg(feature = "rafx-gles3")]
191            RafxFence::Gles3(_) => None,
192            #[cfg(any(
193                feature = "rafx-empty",
194                not(any(
195                    feature = "rafx-dx12",
196                    feature = "rafx-metal",
197                    feature = "rafx-vulkan",
198                    feature = "rafx-gles2",
199                    feature = "rafx-gles3"
200                ))
201            ))]
202            RafxFence::Empty(_) => None,
203        }
204    }
205
206    #[cfg(feature = "rafx-gles2")]
209    pub fn gles2_fence(&self) -> Option<&RafxFenceGles2> {
210        match self {
211            #[cfg(feature = "rafx-dx12")]
212            RafxFence::Dx12(_) => None,
213            #[cfg(feature = "rafx-vulkan")]
214            RafxFence::Vk(_) => None,
215            #[cfg(feature = "rafx-metal")]
216            RafxFence::Metal(_) => None,
217            #[cfg(feature = "rafx-gles2")]
218            RafxFence::Gles2(inner) => Some(inner),
219            #[cfg(feature = "rafx-gles3")]
220            RafxFence::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            RafxFence::Empty(_) => None,
232        }
233    }
234
235    #[cfg(feature = "rafx-gles3")]
238    pub fn gles3_fence(&self) -> Option<&RafxFenceGles3> {
239        match self {
240            #[cfg(feature = "rafx-dx12")]
241            RafxFence::Dx12(_) => None,
242            #[cfg(feature = "rafx-vulkan")]
243            RafxFence::Vk(_) => None,
244            #[cfg(feature = "rafx-metal")]
245            RafxFence::Metal(_) => None,
246            #[cfg(feature = "rafx-gles2")]
247            RafxFence::Gles2(_) => None,
248            #[cfg(feature = "rafx-gles3")]
249            RafxFence::Gles3(inner) => Some(inner),
250            #[cfg(any(
251                feature = "rafx-empty",
252                not(any(
253                    feature = "rafx-dx12",
254                    feature = "rafx-metal",
255                    feature = "rafx-vulkan",
256                    feature = "rafx-gles2",
257                    feature = "rafx-gles3"
258                ))
259            ))]
260            RafxFence::Empty(_) => None,
261        }
262    }
263
264    #[cfg(any(
267        feature = "rafx-empty",
268        not(any(
269            feature = "rafx-dx12",
270            feature = "rafx-metal",
271            feature = "rafx-vulkan",
272            feature = "rafx-gles2",
273            feature = "rafx-gles3"
274        ))
275    ))]
276    pub fn empty_fence(&self) -> Option<&RafxFenceEmpty> {
277        match self {
278            #[cfg(feature = "rafx-dx12")]
279            RafxFence::Dx12(_) => None,
280            #[cfg(feature = "rafx-vulkan")]
281            RafxFence::Vk(_) => None,
282            #[cfg(feature = "rafx-metal")]
283            RafxFence::Metal(_) => None,
284            #[cfg(feature = "rafx-gles2")]
285            RafxFence::Gles2(_) => None,
286            #[cfg(feature = "rafx-gles3")]
287            RafxFence::Gles3(_) => None,
288            #[cfg(any(
289                feature = "rafx-empty",
290                not(any(
291                    feature = "rafx-dx12",
292                    feature = "rafx-metal",
293                    feature = "rafx-vulkan",
294                    feature = "rafx-gles2",
295                    feature = "rafx-gles3"
296                ))
297            ))]
298            RafxFence::Empty(inner) => Some(inner),
299        }
300    }
301}