fix(renderer): align synchronization with working save and force FIFO
This commit is contained in:
parent
3997fa5fd9
commit
1c3eb69cbf
39
Cargo.lock
generated
39
Cargo.lock
generated
|
|
@ -31,6 +31,15 @@ dependencies = [
|
||||||
"zerocopy",
|
"zerocopy",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "aho-corasick"
|
||||||
|
version = "1.1.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301"
|
||||||
|
dependencies = [
|
||||||
|
"memchr",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "android-activity"
|
name = "android-activity"
|
||||||
version = "0.6.1"
|
version = "0.6.1"
|
||||||
|
|
@ -636,6 +645,15 @@ dependencies = [
|
||||||
"libc",
|
"libc",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "matchers"
|
||||||
|
version = "0.2.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9"
|
||||||
|
dependencies = [
|
||||||
|
"regex-automata",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "memchr"
|
name = "memchr"
|
||||||
version = "2.8.0"
|
version = "2.8.0"
|
||||||
|
|
@ -1121,6 +1139,23 @@ dependencies = [
|
||||||
"bitflags 2.11.1",
|
"bitflags 2.11.1",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "regex-automata"
|
||||||
|
version = "0.4.14"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f"
|
||||||
|
dependencies = [
|
||||||
|
"aho-corasick",
|
||||||
|
"memchr",
|
||||||
|
"regex-syntax",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "regex-syntax"
|
||||||
|
version = "0.8.10"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "renderer"
|
name = "renderer"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
|
|
@ -1498,10 +1533,14 @@ version = "0.3.23"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319"
|
checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"matchers",
|
||||||
"nu-ansi-term",
|
"nu-ansi-term",
|
||||||
|
"once_cell",
|
||||||
|
"regex-automata",
|
||||||
"sharded-slab",
|
"sharded-slab",
|
||||||
"smallvec",
|
"smallvec",
|
||||||
"thread_local",
|
"thread_local",
|
||||||
|
"tracing",
|
||||||
"tracing-core",
|
"tracing-core",
|
||||||
"tracing-log",
|
"tracing-log",
|
||||||
]
|
]
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@ edition = "2024"
|
||||||
[dependencies]
|
[dependencies]
|
||||||
anyhow = "1.0.102"
|
anyhow = "1.0.102"
|
||||||
tracing = "0.1.44"
|
tracing = "0.1.44"
|
||||||
tracing-subscriber = "0.3.23"
|
tracing-subscriber = { version = "0.3.23", features = ["env-filter"] }
|
||||||
winit = "0.30.13"
|
winit = "0.30.13"
|
||||||
renderer = { path = "../renderer" }
|
renderer = { path = "../renderer" }
|
||||||
raw-window-handle = "0.6.2"
|
raw-window-handle = "0.6.2"
|
||||||
|
|
|
||||||
|
|
@ -54,7 +54,9 @@ impl ApplicationHandler for App {
|
||||||
renderer.draw_frame().expect("Failed to draw frame");
|
renderer.draw_frame().expect("Failed to draw frame");
|
||||||
}
|
}
|
||||||
|
|
||||||
self.window.as_ref().unwrap().request_redraw();
|
if let Some(window) = self.window.as_ref() {
|
||||||
|
window.request_redraw();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
_ => (),
|
_ => (),
|
||||||
}
|
}
|
||||||
|
|
@ -62,7 +64,9 @@ impl ApplicationHandler for App {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() -> Result<()> {
|
fn main() -> Result<()> {
|
||||||
tracing_subscriber::fmt().init();
|
tracing_subscriber::fmt()
|
||||||
|
.with_env_filter(tracing_subscriber::EnvFilter::from_default_env())
|
||||||
|
.init();
|
||||||
info!("Starting Project Catalyst client");
|
info!("Starting Project Catalyst client");
|
||||||
|
|
||||||
let event_loop = EventLoop::new().context("Failed to create event loop")?;
|
let event_loop = EventLoop::new().context("Failed to create event loop")?;
|
||||||
|
|
|
||||||
|
|
@ -51,14 +51,6 @@ impl Renderer {
|
||||||
)?
|
)?
|
||||||
};
|
};
|
||||||
|
|
||||||
// If the acquired image is still being used by a previous frame, wait for it
|
|
||||||
let image_fence = self.sync.images_in_flight[image_index as usize];
|
|
||||||
if image_fence != vk::Fence::null() {
|
|
||||||
unsafe { self.device.wait_for_fences(&[image_fence], true, u64::MAX)? };
|
|
||||||
}
|
|
||||||
// Mark the image as being in use by the current frame's fence
|
|
||||||
self.sync.images_in_flight[image_index as usize] = in_flight_fence;
|
|
||||||
|
|
||||||
// Use the semaphore tied to this specific swapchain image for rendering completion
|
// Use the semaphore tied to this specific swapchain image for rendering completion
|
||||||
let render_finished_semaphore = self.sync.render_finished[image_index as usize];
|
let render_finished_semaphore = self.sync.render_finished[image_index as usize];
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@ pub fn create_swapchain(
|
||||||
let surface_formats = unsafe {
|
let surface_formats = unsafe {
|
||||||
surface_loader.get_physical_device_surface_formats(physical_device, surface)?
|
surface_loader.get_physical_device_surface_formats(physical_device, surface)?
|
||||||
};
|
};
|
||||||
let surface_present_modes = unsafe {
|
let _surface_present_modes = unsafe {
|
||||||
surface_loader.get_physical_device_surface_present_modes(physical_device, surface)?
|
surface_loader.get_physical_device_surface_present_modes(physical_device, surface)?
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -25,10 +25,7 @@ pub fn create_swapchain(
|
||||||
.find(|f| f.format == vk::Format::B8G8R8A8_SRGB && f.color_space == vk::ColorSpaceKHR::SRGB_NONLINEAR)
|
.find(|f| f.format == vk::Format::B8G8R8A8_SRGB && f.color_space == vk::ColorSpaceKHR::SRGB_NONLINEAR)
|
||||||
.unwrap_or(&surface_formats[0]);
|
.unwrap_or(&surface_formats[0]);
|
||||||
|
|
||||||
let present_mode = surface_present_modes.iter()
|
let present_mode = vk::PresentModeKHR::FIFO;
|
||||||
.copied()
|
|
||||||
.find(|&m| m == vk::PresentModeKHR::MAILBOX)
|
|
||||||
.unwrap_or(vk::PresentModeKHR::FIFO);
|
|
||||||
|
|
||||||
let extent = if surface_capabilities.current_extent.width != u32::MAX {
|
let extent = if surface_capabilities.current_extent.width != u32::MAX {
|
||||||
surface_capabilities.current_extent
|
surface_capabilities.current_extent
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,6 @@ pub struct SyncPrimitives {
|
||||||
pub image_available: Vec<vk::Semaphore>,
|
pub image_available: Vec<vk::Semaphore>,
|
||||||
pub render_finished: Vec<vk::Semaphore>,
|
pub render_finished: Vec<vk::Semaphore>,
|
||||||
pub in_flight: Vec<vk::Fence>,
|
pub in_flight: Vec<vk::Fence>,
|
||||||
pub images_in_flight: Vec<vk::Fence>,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Creates all synchronization primitives for the given number of frames and images.
|
/// Creates all synchronization primitives for the given number of frames and images.
|
||||||
|
|
@ -32,13 +31,10 @@ pub fn create_sync_primitives(
|
||||||
render_finished.push(unsafe { device.create_semaphore(&semaphore_info, None)? });
|
render_finished.push(unsafe { device.create_semaphore(&semaphore_info, None)? });
|
||||||
}
|
}
|
||||||
|
|
||||||
let images_in_flight = vec![vk::Fence::null(); image_count];
|
|
||||||
|
|
||||||
Ok(SyncPrimitives {
|
Ok(SyncPrimitives {
|
||||||
image_available,
|
image_available,
|
||||||
render_finished,
|
render_finished,
|
||||||
in_flight,
|
in_flight,
|
||||||
images_in_flight,
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue