Introduce ICED_PRESENT_MODE env var to pick a wgpu::PresentMode

This commit is contained in:
Héctor Ramón Jiménez 2024-05-07 21:05:29 +02:00
parent db07b9ba9e
commit 8a0701a0d9
No known key found for this signature in database
GPG key ID: 7CC46565708259A7
2 changed files with 29 additions and 10 deletions

View file

@ -51,3 +51,17 @@ impl From<graphics::Settings> for Settings {
} }
} }
} }
pub fn present_mode_from_env() -> Option<wgpu::PresentMode> {
let present_mode = std::env::var("ICED_PRESENT_MODE").ok()?;
match present_mode.to_lowercase().as_str() {
"vsync" => Some(wgpu::PresentMode::AutoVsync),
"no_vsync" => Some(wgpu::PresentMode::AutoNoVsync),
"immediate" => Some(wgpu::PresentMode::Immediate),
"fifo" => Some(wgpu::PresentMode::Fifo),
"fifo_relaxed" => Some(wgpu::PresentMode::FifoRelaxed),
"mailbox" => Some(wgpu::PresentMode::Mailbox),
_ => None,
}
}

View file

@ -4,7 +4,8 @@ use crate::graphics::color;
use crate::graphics::compositor; use crate::graphics::compositor;
use crate::graphics::error; use crate::graphics::error;
use crate::graphics::{self, Viewport}; use crate::graphics::{self, Viewport};
use crate::{Engine, Renderer, Settings}; use crate::settings::{self, Settings};
use crate::{Engine, Renderer};
/// A window graphics backend for iced powered by `wgpu`. /// A window graphics backend for iced powered by `wgpu`.
#[allow(missing_debug_implementations)] #[allow(missing_debug_implementations)]
@ -270,15 +271,19 @@ impl graphics::Compositor for Compositor {
backend: Option<&str>, backend: Option<&str>,
) -> Result<Self, graphics::Error> { ) -> Result<Self, graphics::Error> {
match backend { match backend {
None | Some("wgpu") => Ok(new( None | Some("wgpu") => {
Settings { let mut settings = Settings::from(settings);
backends: wgpu::util::backend_bits_from_env()
.unwrap_or(wgpu::Backends::all()), if let Some(backends) = wgpu::util::backend_bits_from_env() {
..settings.into() settings.backends = backends;
}, }
compatible_window,
) if let Some(present_mode) = settings::present_mode_from_env() {
.await?), settings.present_mode = present_mode;
}
Ok(new(settings, compatible_window).await?)
}
Some(backend) => Err(graphics::Error::GraphicsAdapterNotFound { Some(backend) => Err(graphics::Error::GraphicsAdapterNotFound {
backend: "wgpu", backend: "wgpu",
reason: error::Reason::DidNotMatch { reason: error::Reason::DidNotMatch {