rafx_api/
semaphore.rs

1#[cfg(feature = "rafx-dx12")]
2use crate::dx12::RafxSemaphoreDx12;
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::RafxSemaphoreEmpty;
14#[cfg(feature = "rafx-gles2")]
15use crate::gles2::RafxSemaphoreGles2;
16#[cfg(feature = "rafx-gles3")]
17use crate::gles3::RafxSemaphoreGles3;
18#[cfg(feature = "rafx-metal")]
19use crate::metal::RafxSemaphoreMetal;
20#[cfg(feature = "rafx-vulkan")]
21use crate::vulkan::RafxSemaphoreVulkan;
22
23/// A GPU -> GPU synchronization mechanism.
24///
25/// A semaphore is either "signalled" or "unsignalled". Only the GPU can read or write this status.
26///
27/// Semaphores can be used to queue multiple dependent units of work to the GPU where one unit of
28/// work cannot start until another unit of work completes.
29///
30/// Semaphores must not be dropped if they are in use by the GPU.
31pub enum RafxSemaphore {
32    #[cfg(feature = "rafx-dx12")]
33    Dx12(RafxSemaphoreDx12),
34    #[cfg(feature = "rafx-vulkan")]
35    Vk(RafxSemaphoreVulkan),
36    #[cfg(feature = "rafx-metal")]
37    Metal(RafxSemaphoreMetal),
38    #[cfg(feature = "rafx-gles2")]
39    Gles2(RafxSemaphoreGles2),
40    #[cfg(feature = "rafx-gles3")]
41    Gles3(RafxSemaphoreGles3),
42    #[cfg(any(
43        feature = "rafx-empty",
44        not(any(
45            feature = "rafx-dx12",
46            feature = "rafx-metal",
47            feature = "rafx-vulkan",
48            feature = "rafx-gles2",
49            feature = "rafx-gles3"
50        ))
51    ))]
52    Empty(RafxSemaphoreEmpty),
53}
54
55impl RafxSemaphore {
56    /// Get the underlying dx12 API object. This provides access to any internally created
57    /// dx12 objects.
58    #[cfg(feature = "rafx-dx12")]
59    pub fn dx12_semaphore(&self) -> Option<&RafxSemaphoreDx12> {
60        match self {
61            #[cfg(feature = "rafx-dx12")]
62            RafxSemaphore::Dx12(inner) => Some(inner),
63            #[cfg(feature = "rafx-vulkan")]
64            RafxSemaphore::Vk(_) => None,
65            #[cfg(feature = "rafx-metal")]
66            RafxSemaphore::Metal(_) => None,
67            #[cfg(feature = "rafx-gles2")]
68            RafxSemaphore::Gles2(_) => None,
69            #[cfg(feature = "rafx-gles3")]
70            RafxSemaphore::Gles3(_) => None,
71            #[cfg(any(
72                feature = "rafx-empty",
73                not(any(
74                    feature = "rafx-dx12",
75                    feature = "rafx-metal",
76                    feature = "rafx-vulkan",
77                    feature = "rafx-gles2",
78                    feature = "rafx-gles3"
79                ))
80            ))]
81            RafxSemaphore::Empty(_) => None,
82        }
83    }
84
85    /// Get the underlying vulkan API object. This provides access to any internally created
86    /// vulkan objects.
87    #[cfg(feature = "rafx-vulkan")]
88    pub fn vk_semaphore(&self) -> Option<&RafxSemaphoreVulkan> {
89        match self {
90            #[cfg(feature = "rafx-dx12")]
91            RafxSemaphore::Dx12(_) => None,
92            #[cfg(feature = "rafx-vulkan")]
93            RafxSemaphore::Vk(inner) => Some(inner),
94            #[cfg(feature = "rafx-metal")]
95            RafxSemaphore::Metal(_) => None,
96            #[cfg(feature = "rafx-gles2")]
97            RafxSemaphore::Gles2(_) => None,
98            #[cfg(feature = "rafx-gles3")]
99            RafxSemaphore::Gles3(_) => None,
100            #[cfg(any(
101                feature = "rafx-empty",
102                not(any(
103                    feature = "rafx-dx12",
104                    feature = "rafx-metal",
105                    feature = "rafx-vulkan",
106                    feature = "rafx-gles2",
107                    feature = "rafx-gles3"
108                ))
109            ))]
110            RafxSemaphore::Empty(_) => None,
111        }
112    }
113
114    /// Get the underlying metal API object. This provides access to any internally created
115    /// metal objects.
116    #[cfg(feature = "rafx-metal")]
117    pub fn metal_semaphore(&self) -> Option<&RafxSemaphoreMetal> {
118        match self {
119            #[cfg(feature = "rafx-dx12")]
120            RafxSemaphore::Dx12(_) => None,
121            #[cfg(feature = "rafx-vulkan")]
122            RafxSemaphore::Vk(_) => None,
123            #[cfg(feature = "rafx-metal")]
124            RafxSemaphore::Metal(inner) => Some(inner),
125            #[cfg(feature = "rafx-gles2")]
126            RafxSemaphore::Gles2(_) => None,
127            #[cfg(feature = "rafx-gles3")]
128            RafxSemaphore::Gles3(_) => None,
129            #[cfg(any(
130                feature = "rafx-empty",
131                not(any(
132                    feature = "rafx-dx12",
133                    feature = "rafx-metal",
134                    feature = "rafx-vulkan",
135                    feature = "rafx-gles2",
136                    feature = "rafx-gles3"
137                ))
138            ))]
139            RafxSemaphore::Empty(_) => None,
140        }
141    }
142
143    /// Get the underlying gl API object. This provides access to any internally created
144    /// metal objects.
145    #[cfg(feature = "rafx-gles2")]
146    pub fn gles2_semaphore(&self) -> Option<&RafxSemaphoreGles2> {
147        match self {
148            #[cfg(feature = "rafx-dx12")]
149            RafxSemaphore::Dx12(_) => None,
150            #[cfg(feature = "rafx-vulkan")]
151            RafxSemaphore::Vk(_) => None,
152            #[cfg(feature = "rafx-metal")]
153            RafxSemaphore::Metal(_) => None,
154            #[cfg(feature = "rafx-gles2")]
155            RafxSemaphore::Gles2(inner) => Some(inner),
156            #[cfg(feature = "rafx-gles3")]
157            RafxSemaphore::Gles3(_) => None,
158            #[cfg(any(
159                feature = "rafx-empty",
160                not(any(
161                    feature = "rafx-dx12",
162                    feature = "rafx-metal",
163                    feature = "rafx-vulkan",
164                    feature = "rafx-gles2",
165                    feature = "rafx-gles3"
166                ))
167            ))]
168            RafxSemaphore::Empty(_) => None,
169        }
170    }
171
172    /// Get the underlying gl API object. This provides access to any internally created
173    /// metal objects.
174    #[cfg(feature = "rafx-gles3")]
175    pub fn gles3_semaphore(&self) -> Option<&RafxSemaphoreGles3> {
176        match self {
177            #[cfg(feature = "rafx-dx12")]
178            RafxSemaphore::Dx12(_) => None,
179            #[cfg(feature = "rafx-vulkan")]
180            RafxSemaphore::Vk(_) => None,
181            #[cfg(feature = "rafx-metal")]
182            RafxSemaphore::Metal(_) => None,
183            #[cfg(feature = "rafx-gles2")]
184            RafxSemaphore::Gles2(_) => None,
185            #[cfg(feature = "rafx-gles3")]
186            RafxSemaphore::Gles3(inner) => Some(inner),
187            #[cfg(any(
188                feature = "rafx-empty",
189                not(any(
190                    feature = "rafx-dx12",
191                    feature = "rafx-metal",
192                    feature = "rafx-vulkan",
193                    feature = "rafx-gles2",
194                    feature = "rafx-gles3"
195                ))
196            ))]
197            RafxSemaphore::Empty(_) => None,
198        }
199    }
200
201    /// Get the underlying metal API object. This provides access to any internally created
202    /// metal objects.
203    #[cfg(any(
204        feature = "rafx-empty",
205        not(any(
206            feature = "rafx-dx12",
207            feature = "rafx-metal",
208            feature = "rafx-vulkan",
209            feature = "rafx-gles2",
210            feature = "rafx-gles3"
211        ))
212    ))]
213    pub fn empty_semaphore(&self) -> Option<&RafxSemaphoreEmpty> {
214        match self {
215            #[cfg(feature = "rafx-dx12")]
216            RafxSemaphore::Dx12(_) => None,
217            #[cfg(feature = "rafx-vulkan")]
218            RafxSemaphore::Vk(_) => None,
219            #[cfg(feature = "rafx-metal")]
220            RafxSemaphore::Metal(_) => None,
221            #[cfg(feature = "rafx-gles2")]
222            RafxSemaphore::Gles2(_) => None,
223            #[cfg(feature = "rafx-gles3")]
224            RafxSemaphore::Gles3(_) => None,
225            #[cfg(any(
226                feature = "rafx-empty",
227                not(any(
228                    feature = "rafx-dx12",
229                    feature = "rafx-metal",
230                    feature = "rafx-vulkan",
231                    feature = "rafx-gles2",
232                    feature = "rafx-gles3"
233                ))
234            ))]
235            RafxSemaphore::Empty(inner) => Some(inner),
236        }
237    }
238}