1use crate::{Device, DeviceOwned, ALLOCATION_CALLBACK_NONE};
2use ash::prelude::VkResult;
3use ash::vk::{self, Handle};
4use std::sync::Arc;
5
6pub struct Semaphore {
7 handle: vk::Semaphore,
8
9 device: Arc<Device>,
11}
12
13impl Semaphore {
14 pub fn new(device: Arc<Device>) -> VkResult<Self> {
15 let create_info_builder = vk::SemaphoreCreateInfo::builder();
16 unsafe { Self::new_from_create_info(device, create_info_builder) }
17 }
18
19 pub unsafe fn new_from_create_info(
20 device: Arc<Device>,
21 create_info_builder: vk::SemaphoreCreateInfoBuilder,
22 ) -> VkResult<Self> {
23 let handle = unsafe {
24 device
25 .inner()
26 .create_semaphore(&create_info_builder, ALLOCATION_CALLBACK_NONE)
27 }?;
28
29 Ok(Self { handle, device })
30 }
31
32 #[inline]
35 pub fn handle(&self) -> vk::Semaphore {
36 self.handle
37 }
38}
39
40impl DeviceOwned for Semaphore {
41 #[inline]
42 fn device(&self) -> &Arc<Device> {
43 &self.device
44 }
45
46 #[inline]
47 fn handle_raw(&self) -> u64 {
48 self.handle.as_raw()
49 }
50}
51
52impl Drop for Semaphore {
53 fn drop(&mut self) {
54 unsafe {
55 self.device
56 .inner()
57 .destroy_semaphore(self.handle, ALLOCATION_CALLBACK_NONE);
58 }
59 }
60}