feat(renderer): create synchronization primitives
This commit is contained in:
parent
d0fa203743
commit
e005bf1c75
|
|
@ -45,6 +45,12 @@ pub struct Renderer {
|
||||||
command_pool: vk::CommandPool,
|
command_pool: vk::CommandPool,
|
||||||
/// The buffer used to record GPU commands.
|
/// The buffer used to record GPU commands.
|
||||||
command_buffer: vk::CommandBuffer,
|
command_buffer: vk::CommandBuffer,
|
||||||
|
/// Signaled when the swapchain has provided an image to render into.
|
||||||
|
image_available_semaphore: vk::Semaphore,
|
||||||
|
/// Signaled when rendering is complete and the image is ready for presentation.
|
||||||
|
render_finished_semaphore: vk::Semaphore,
|
||||||
|
/// Signaled when the GPU has finished executing the command buffer.
|
||||||
|
in_flight_fence: vk::Fence,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Renderer {
|
impl Renderer {
|
||||||
|
|
@ -116,7 +122,7 @@ impl Renderer {
|
||||||
};
|
};
|
||||||
let surface_loader = khr::surface::Instance::new(&entry, &instance);
|
let surface_loader = khr::surface::Instance::new(&entry, &instance);
|
||||||
|
|
||||||
// Pick a physical device that supports our surface
|
// Pick a physical device that supports the surface
|
||||||
let physical_device = Self::pick_physical_device(&instance, &surface_loader, surface)?;
|
let physical_device = Self::pick_physical_device(&instance, &surface_loader, surface)?;
|
||||||
|
|
||||||
// Find the graphics queue family (which must also support presentation)
|
// Find the graphics queue family (which must also support presentation)
|
||||||
|
|
@ -135,7 +141,7 @@ impl Renderer {
|
||||||
// Create the command pool
|
// Create the command pool
|
||||||
let pool_create_info = vk::CommandPoolCreateInfo::default()
|
let pool_create_info = vk::CommandPoolCreateInfo::default()
|
||||||
.queue_family_index(graphics_queue_index)
|
.queue_family_index(graphics_queue_index)
|
||||||
// Allows us to reuse the command buffer every frame by resetting it
|
// Allows reusing the command buffer every frame by resetting it
|
||||||
.flags(vk::CommandPoolCreateFlags::RESET_COMMAND_BUFFER);
|
.flags(vk::CommandPoolCreateFlags::RESET_COMMAND_BUFFER);
|
||||||
|
|
||||||
let command_pool = unsafe { device.create_command_pool(&pool_create_info, None)? };
|
let command_pool = unsafe { device.create_command_pool(&pool_create_info, None)? };
|
||||||
|
|
@ -148,6 +154,15 @@ impl Renderer {
|
||||||
|
|
||||||
let command_buffer = unsafe { device.allocate_command_buffers(&alloc_info)?[0] };
|
let command_buffer = unsafe { device.allocate_command_buffers(&alloc_info)?[0] };
|
||||||
|
|
||||||
|
// Create semaphores and fence for synchronization
|
||||||
|
let semaphore_info = vk::SemaphoreCreateInfo::default();
|
||||||
|
let fence_info = vk::FenceCreateInfo::default()
|
||||||
|
.flags(vk::FenceCreateFlags::SIGNALED);
|
||||||
|
|
||||||
|
let image_available_semaphore = unsafe { device.create_semaphore(&semaphore_info, None)? };
|
||||||
|
let render_finished_semaphore = unsafe { device.create_semaphore(&semaphore_info, None)? };
|
||||||
|
let in_flight_fence = unsafe { device.create_fence(&fence_info, None)? };
|
||||||
|
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
_entry: entry,
|
_entry: entry,
|
||||||
instance,
|
instance,
|
||||||
|
|
@ -167,6 +182,9 @@ impl Renderer {
|
||||||
swapchain_image_views: image_views,
|
swapchain_image_views: image_views,
|
||||||
command_pool,
|
command_pool,
|
||||||
command_buffer,
|
command_buffer,
|
||||||
|
image_available_semaphore,
|
||||||
|
render_finished_semaphore,
|
||||||
|
in_flight_fence,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -379,6 +397,11 @@ impl Drop for Renderer {
|
||||||
unsafe {
|
unsafe {
|
||||||
self.device.destroy_command_pool(self.command_pool, None);
|
self.device.destroy_command_pool(self.command_pool, None);
|
||||||
|
|
||||||
|
// Destroy synchronization primitives
|
||||||
|
self.device.destroy_semaphore(self.image_available_semaphore, None);
|
||||||
|
self.device.destroy_semaphore(self.render_finished_semaphore, None);
|
||||||
|
self.device.destroy_fence(self.in_flight_fence, None);
|
||||||
|
|
||||||
// Destroy the swapchain
|
// Destroy the swapchain
|
||||||
self.swapchain_loader.destroy_swapchain(self.swapchain, None);
|
self.swapchain_loader.destroy_swapchain(self.swapchain, None);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue