Avoid creating SurfaceConfiguration in prepare_windows (#6255)
# Objective - Avoids creating a `SurfaceConfiguration` for every window in every frame for the `prepare_windows` system - As such also avoid calling `get_supported_formats` for every window in every frame ## Solution - Construct `SurfaceConfiguration` lazyly in `prepare_windows` --- This also changes the error message for failed initial surface configuration from "Failed to acquire next swapchain texture" to "Error configuring surface".
This commit is contained in:
parent
0cbd1bbe43
commit
3689d5d086
@ -180,7 +180,8 @@ pub fn prepare_windows(
|
|||||||
render_instance.create_surface(&window.raw_handle.as_ref().unwrap().get_handle())
|
render_instance.create_surface(&window.raw_handle.as_ref().unwrap().get_handle())
|
||||||
});
|
});
|
||||||
|
|
||||||
let swap_chain_descriptor = wgpu::SurfaceConfiguration {
|
// Creates a closure to avoid calling this logic unnecessarily
|
||||||
|
let create_swap_chain_descriptor = || wgpu::SurfaceConfiguration {
|
||||||
format: *surface
|
format: *surface
|
||||||
.get_supported_formats(&render_adapter)
|
.get_supported_formats(&render_adapter)
|
||||||
.get(0)
|
.get(0)
|
||||||
@ -211,22 +212,25 @@ pub fn prepare_windows(
|
|||||||
|
|
||||||
// Do the initial surface configuration if it hasn't been configured yet. Or if size or
|
// Do the initial surface configuration if it hasn't been configured yet. Or if size or
|
||||||
// present mode changed.
|
// present mode changed.
|
||||||
if window_surfaces.configured_windows.insert(window.id)
|
let frame = if window_surfaces.configured_windows.insert(window.id)
|
||||||
|| window.size_changed
|
|| window.size_changed
|
||||||
|| window.present_mode_changed
|
|| window.present_mode_changed
|
||||||
{
|
{
|
||||||
render_device.configure_surface(surface, &swap_chain_descriptor);
|
render_device.configure_surface(surface, &create_swap_chain_descriptor());
|
||||||
}
|
surface
|
||||||
|
.get_current_texture()
|
||||||
let frame = match surface.get_current_texture() {
|
.expect("Error configuring surface")
|
||||||
Ok(swap_chain_frame) => swap_chain_frame,
|
} else {
|
||||||
Err(wgpu::SurfaceError::Outdated) => {
|
match surface.get_current_texture() {
|
||||||
render_device.configure_surface(surface, &swap_chain_descriptor);
|
Ok(swap_chain_frame) => swap_chain_frame,
|
||||||
surface
|
Err(wgpu::SurfaceError::Outdated) => {
|
||||||
.get_current_texture()
|
render_device.configure_surface(surface, &create_swap_chain_descriptor());
|
||||||
.expect("Error reconfiguring surface")
|
surface
|
||||||
|
.get_current_texture()
|
||||||
|
.expect("Error reconfiguring surface")
|
||||||
|
}
|
||||||
|
err => err.expect("Failed to acquire next swap chain texture!"),
|
||||||
}
|
}
|
||||||
err => err.expect("Failed to acquire next swap chain texture!"),
|
|
||||||
};
|
};
|
||||||
|
|
||||||
window.swap_chain_texture = Some(TextureView::from(frame));
|
window.swap_chain_texture = Some(TextureView::from(frame));
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user