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}