Add more syncing to make sure we aren't wastefully rendering
This commit is contained in:
parent
61bd125414
commit
d0871fa4c5
30
src/app.rs
30
src/app.rs
@ -78,6 +78,12 @@ impl App {
|
|||||||
/// # Safety
|
/// # Safety
|
||||||
/// Here be Dragons
|
/// Here be Dragons
|
||||||
pub unsafe fn render(&mut self, _window: &Window) -> Result<()> {
|
pub unsafe fn render(&mut self, _window: &Window) -> Result<()> {
|
||||||
|
self.device.wait_for_fences(
|
||||||
|
&[self.data.in_flight_fences[self.frame]],
|
||||||
|
true,
|
||||||
|
u64::max_value(),
|
||||||
|
)?;
|
||||||
|
|
||||||
let image_index = self
|
let image_index = self
|
||||||
.device
|
.device
|
||||||
.acquire_next_image_khr(
|
.acquire_next_image_khr(
|
||||||
@ -88,6 +94,16 @@ impl App {
|
|||||||
)?
|
)?
|
||||||
.0 as usize;
|
.0 as usize;
|
||||||
|
|
||||||
|
if !self.data.images_in_flight[image_index as usize].is_null() {
|
||||||
|
self.device.wait_for_fences(
|
||||||
|
&[self.data.images_in_flight[image_index as usize]],
|
||||||
|
true,
|
||||||
|
u64::max_value(),
|
||||||
|
)?;
|
||||||
|
}
|
||||||
|
|
||||||
|
self.data.images_in_flight[image_index as usize] = self.data.in_flight_fences[self.frame];
|
||||||
|
|
||||||
let wait_semaphores = &[self.data.image_available_semaphores[self.frame]];
|
let wait_semaphores = &[self.data.image_available_semaphores[self.frame]];
|
||||||
let wait_stages = &[vk::PipelineStageFlags::COLOR_ATTACHMENT_OUTPUT];
|
let wait_stages = &[vk::PipelineStageFlags::COLOR_ATTACHMENT_OUTPUT];
|
||||||
let command_buffers = &[self.data.command_buffers[image_index as usize]];
|
let command_buffers = &[self.data.command_buffers[image_index as usize]];
|
||||||
@ -99,7 +115,13 @@ impl App {
|
|||||||
.signal_semaphores(signal_semaphores);
|
.signal_semaphores(signal_semaphores);
|
||||||
|
|
||||||
self.device
|
self.device
|
||||||
.queue_submit(self.data.graphics_queue, &[submit_info], vk::Fence::null())?;
|
.reset_fences(&[self.data.in_flight_fences[self.frame]])?;
|
||||||
|
|
||||||
|
self.device.queue_submit(
|
||||||
|
self.data.graphics_queue,
|
||||||
|
&[submit_info],
|
||||||
|
self.data.in_flight_fences[self.frame],
|
||||||
|
)?;
|
||||||
|
|
||||||
let swapchains = &[self.data.swapchain];
|
let swapchains = &[self.data.swapchain];
|
||||||
let image_indices = &[image_index as u32];
|
let image_indices = &[image_index as u32];
|
||||||
@ -121,6 +143,10 @@ impl App {
|
|||||||
/// # Safety
|
/// # Safety
|
||||||
/// Here be Dragons
|
/// Here be Dragons
|
||||||
pub unsafe fn destroy(&mut self) {
|
pub unsafe fn destroy(&mut self) {
|
||||||
|
self.data
|
||||||
|
.in_flight_fences
|
||||||
|
.iter()
|
||||||
|
.for_each(|f| self.device.destroy_fence(*f, None));
|
||||||
self.data
|
self.data
|
||||||
.render_finished_semaphores
|
.render_finished_semaphores
|
||||||
.iter()
|
.iter()
|
||||||
@ -186,6 +212,8 @@ pub struct AppData {
|
|||||||
// Sync Objects
|
// Sync Objects
|
||||||
image_available_semaphores: Vec<vk::Semaphore>,
|
image_available_semaphores: Vec<vk::Semaphore>,
|
||||||
render_finished_semaphores: Vec<vk::Semaphore>,
|
render_finished_semaphores: Vec<vk::Semaphore>,
|
||||||
|
in_flight_fences: Vec<vk::Fence>,
|
||||||
|
images_in_flight: Vec<vk::Fence>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl AppData {}
|
impl AppData {}
|
||||||
|
@ -629,13 +629,23 @@ pub(super) unsafe fn create_command_buffers(device: &Device, data: &mut AppData)
|
|||||||
|
|
||||||
pub(super) unsafe fn create_sync_objects(device: &Device, data: &mut AppData) -> Result<()> {
|
pub(super) unsafe fn create_sync_objects(device: &Device, data: &mut AppData) -> Result<()> {
|
||||||
let semaphore_info = vk::SemaphoreCreateInfo::builder();
|
let semaphore_info = vk::SemaphoreCreateInfo::builder();
|
||||||
|
let fence_info = vk::FenceCreateInfo::builder().flags(vk::FenceCreateFlags::SIGNALED);
|
||||||
|
|
||||||
for _ in 0..MAX_FRAMES_IN_FLIGHT {
|
for _ in 0..MAX_FRAMES_IN_FLIGHT {
|
||||||
data.image_available_semaphores
|
data.image_available_semaphores
|
||||||
.push(device.create_semaphore(&semaphore_info, None)?);
|
.push(device.create_semaphore(&semaphore_info, None)?);
|
||||||
data.render_finished_semaphores
|
data.render_finished_semaphores
|
||||||
.push(device.create_semaphore(&semaphore_info, None)?);
|
.push(device.create_semaphore(&semaphore_info, None)?);
|
||||||
|
|
||||||
|
data.in_flight_fences
|
||||||
|
.push(device.create_fence(&fence_info, None)?);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
data.images_in_flight = data
|
||||||
|
.swapchain_images
|
||||||
|
.iter()
|
||||||
|
.map(|_| vk::Fence::null())
|
||||||
|
.collect();
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user