use std::mem;
use std::ptr;
use std::sync::Arc;
use device::Device;
use device::DeviceOwned;
use OomError;
use Success;
use VulkanObject;
use VulkanPointers;
use check_errors;
use vk;
#[derive(Debug)]
pub struct Event {
event: vk::Event,
device: Arc<Device>,
}
impl Event {
#[inline]
pub fn raw(device: Arc<Device>) -> Result<Event, OomError> {
let event = unsafe {
static mut INFOS: vk::EventCreateInfo = vk::EventCreateInfo {
sType: vk::STRUCTURE_TYPE_EVENT_CREATE_INFO,
pNext: 0 as *const _, flags: 0, };
let mut output = mem::uninitialized();
let vk = device.pointers();
try!(check_errors(vk.CreateEvent(device.internal_object(), &INFOS,
ptr::null(), &mut output)));
output
};
Ok(Event {
device: device,
event: event,
})
}
#[inline]
pub fn new(device: Arc<Device>) -> Arc<Event> {
Arc::new(Event::raw(device).unwrap())
}
#[inline]
pub fn signaled(&self) -> Result<bool, OomError> {
unsafe {
let vk = self.device.pointers();
let result = try!(check_errors(vk.GetEventStatus(self.device.internal_object(),
self.event)));
match result {
Success::EventSet => Ok(true),
Success::EventReset => Ok(false),
_ => unreachable!()
}
}
}
#[inline]
pub fn set_raw(&mut self) -> Result<(), OomError> {
unsafe {
let vk = self.device.pointers();
try!(check_errors(vk.SetEvent(self.device.internal_object(), self.event)));
Ok(())
}
}
#[inline]
pub fn set(&mut self) {
self.set_raw().unwrap();
}
#[inline]
pub fn reset_raw(&mut self) -> Result<(), OomError> {
unsafe {
let vk = self.device.pointers();
try!(check_errors(vk.ResetEvent(self.device.internal_object(), self.event)));
Ok(())
}
}
#[inline]
pub fn reset(&mut self) {
self.reset_raw().unwrap();
}
}
unsafe impl DeviceOwned for Event {
#[inline]
fn device(&self) -> &Arc<Device> {
&self.device
}
}
unsafe impl VulkanObject for Event {
type Object = vk::Event;
#[inline]
fn internal_object(&self) -> vk::Event {
self.event
}
}
impl Drop for Event {
#[inline]
fn drop(&mut self) {
unsafe {
let vk = self.device.pointers();
vk.DestroyEvent(self.device.internal_object(), self.event, ptr::null());
}
}
}
#[cfg(test)]
mod tests {
use std::sync::Arc;
use sync::Event;
#[test]
fn event_create() {
let (device, _) = gfx_dev_and_queue!();
let event = Event::new(device);
assert!(!event.signaled().unwrap());
}
#[test]
fn event_set() {
let (device, _) = gfx_dev_and_queue!();
let mut event = Event::new(device);
assert!(!event.signaled().unwrap());
Arc::get_mut(&mut event).unwrap().set();
assert!(event.signaled().unwrap());
}
#[test]
fn event_reset() {
let (device, _) = gfx_dev_and_queue!();
let mut event = Event::new(device);
Arc::get_mut(&mut event).unwrap().set();
assert!(event.signaled().unwrap());
Arc::get_mut(&mut event).unwrap().reset();
assert!(!event.signaled().unwrap());
}
}