iced_wgpu/
settings.rs

1//! Configure a renderer.
2use crate::core::{Font, Pixels};
3use crate::graphics::{self, Antialiasing};
4
5/// The settings of a [`Renderer`].
6///
7/// [`Renderer`]: crate::Renderer
8#[derive(Debug, Clone, Copy, PartialEq)]
9pub struct Settings {
10    /// The present mode of the [`Renderer`].
11    ///
12    /// [`Renderer`]: crate::Renderer
13    pub present_mode: wgpu::PresentMode,
14
15    /// The graphics backends to use.
16    pub backends: wgpu::Backends,
17
18    /// The default [`Font`] to use.
19    pub default_font: Font,
20
21    /// The default size of text.
22    ///
23    /// By default, it will be set to `16.0`.
24    pub default_text_size: Pixels,
25
26    /// The antialiasing strategy that will be used for triangle primitives.
27    ///
28    /// By default, it is `None`.
29    pub antialiasing: Option<Antialiasing>,
30}
31
32impl Default for Settings {
33    fn default() -> Settings {
34        Settings {
35            present_mode: wgpu::PresentMode::AutoVsync,
36            backends: wgpu::Backends::all(),
37            default_font: Font::default(),
38            default_text_size: Pixels(16.0),
39            antialiasing: None,
40        }
41    }
42}
43
44impl From<graphics::Settings> for Settings {
45    fn from(settings: graphics::Settings) -> Self {
46        Self {
47            present_mode: if settings.vsync {
48                wgpu::PresentMode::AutoVsync
49            } else {
50                wgpu::PresentMode::AutoNoVsync
51            },
52            default_font: settings.default_font,
53            default_text_size: settings.default_text_size,
54            antialiasing: settings.antialiasing,
55            ..Settings::default()
56        }
57    }
58}
59
60/// Obtains a [`wgpu::PresentMode`] from the current environment
61/// configuration, if set.
62///
63/// The value returned by this function can be changed by setting
64/// the `ICED_PRESENT_MODE` env variable. The possible values are:
65///
66/// - `vsync` → [`wgpu::PresentMode::AutoVsync`]
67/// - `no_vsync` → [`wgpu::PresentMode::AutoNoVsync`]
68/// - `immediate` → [`wgpu::PresentMode::Immediate`]
69/// - `fifo` → [`wgpu::PresentMode::Fifo`]
70/// - `fifo_relaxed` → [`wgpu::PresentMode::FifoRelaxed`]
71/// - `mailbox` → [`wgpu::PresentMode::Mailbox`]
72pub fn present_mode_from_env() -> Option<wgpu::PresentMode> {
73    let present_mode = std::env::var("ICED_PRESENT_MODE").ok()?;
74
75    match present_mode.to_lowercase().as_str() {
76        "vsync" => Some(wgpu::PresentMode::AutoVsync),
77        "no_vsync" => Some(wgpu::PresentMode::AutoNoVsync),
78        "immediate" => Some(wgpu::PresentMode::Immediate),
79        "fifo" => Some(wgpu::PresentMode::Fifo),
80        "fifo_relaxed" => Some(wgpu::PresentMode::FifoRelaxed),
81        "mailbox" => Some(wgpu::PresentMode::Mailbox),
82        _ => None,
83    }
84}