bort_vk/
semaphore.rs

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    // dependencies
10    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    // Getters
33
34    #[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}