1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
use crate::graphics::vulkan::Device;
use anyhow::Result;
use ash::{version::DeviceV1_0, vk};
pub struct FrameSync {
pub image_available_semaphore: vk::Semaphore,
pub render_finished_semaphore: vk::Semaphore,
pub graphics_finished_fence: vk::Fence,
}
impl FrameSync {
pub fn new<Name>(device: &Device, name: Name) -> Result<Self>
where
Name: Into<String>,
{
let owned_name = name.into();
let image_available_semaphore = unsafe {
device.logical_device.create_semaphore(
&vk::SemaphoreCreateInfo {
..Default::default()
},
None,
)?
};
device.name_vulkan_object(
format!("{} Swapchain Image Available", &owned_name),
vk::ObjectType::SEMAPHORE,
&image_available_semaphore,
)?;
let render_finished_semaphore = unsafe {
device.logical_device.create_semaphore(
&vk::SemaphoreCreateInfo {
..Default::default()
},
None,
)?
};
device.name_vulkan_object(
format!("{} Render Finished", &owned_name),
vk::ObjectType::SEMAPHORE,
&render_finished_semaphore,
)?;
let graphics_finished_fence = unsafe {
device.logical_device.create_fence(
&vk::FenceCreateInfo {
flags: vk::FenceCreateFlags::SIGNALED,
..Default::default()
},
None,
)?
};
device.name_vulkan_object(
format!("{} Graphics Finished", &owned_name),
vk::ObjectType::FENCE,
&graphics_finished_fence,
)?;
Ok(Self {
image_available_semaphore,
render_finished_semaphore,
graphics_finished_fence,
})
}
pub unsafe fn destroy(&mut self, device: &Device) {
device
.logical_device
.destroy_semaphore(self.image_available_semaphore, None);
device
.logical_device
.destroy_semaphore(self.render_finished_semaphore, None);
device
.logical_device
.destroy_fence(self.graphics_finished_fence, None);
}
}