use std::mem;
use std::ptr;
use std::sync::Arc;
use device::Device;
use device::DeviceOwned;
use OomError;
use SafeDeref;
use VulkanObject;
use VulkanPointers;
use check_errors;
use vk;
#[derive(Debug)]
pub struct Semaphore<D = Arc<Device>> where D: SafeDeref<Target = Device> {
semaphore: vk::Semaphore,
device: D,
}
impl<D> Semaphore<D> where D: SafeDeref<Target = Device> {
#[inline]
pub fn new(device: D) -> Result<Semaphore<D>, OomError> {
let semaphore = unsafe {
static mut INFOS: vk::SemaphoreCreateInfo = vk::SemaphoreCreateInfo {
sType: vk::STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO,
pNext: 0 as *const _, flags: 0, };
let vk = device.pointers();
let mut output = mem::uninitialized();
try!(check_errors(vk.CreateSemaphore(device.internal_object(), &INFOS,
ptr::null(), &mut output)));
output
};
Ok(Semaphore {
device: device,
semaphore: semaphore,
})
}
}
unsafe impl DeviceOwned for Semaphore {
#[inline]
fn device(&self) -> &Arc<Device> {
&self.device
}
}
unsafe impl<D> VulkanObject for Semaphore<D> where D: SafeDeref<Target = Device> {
type Object = vk::Semaphore;
#[inline]
fn internal_object(&self) -> vk::Semaphore {
self.semaphore
}
}
impl<D> Drop for Semaphore<D> where D: SafeDeref<Target = Device> {
#[inline]
fn drop(&mut self) {
unsafe {
let vk = self.device.pointers();
vk.DestroySemaphore(self.device.internal_object(), self.semaphore, ptr::null());
}
}
}
#[cfg(test)]
mod tests {
use sync::Semaphore;
#[test]
fn semaphore_create() {
let (device, _) = gfx_dev_and_queue!();
let _ = Semaphore::new(device.clone());
}
}