- This improves rendering performance on windows 10x and doesn't result in noticeable tearing. The user can decide if they want it anyways.
84 lines
2.7 KiB
Rust
84 lines
2.7 KiB
Rust
//! Configure a renderer.
|
|
use crate::core::{Font, Pixels};
|
|
use crate::graphics::{self, Antialiasing};
|
|
|
|
/// The settings of a [`Renderer`].
|
|
///
|
|
/// [`Renderer`]: crate::Renderer
|
|
#[derive(Debug, Clone, Copy, PartialEq)]
|
|
pub struct Settings {
|
|
/// The present mode of the [`Renderer`].
|
|
///
|
|
/// [`Renderer`]: crate::Renderer
|
|
pub present_mode: wgpu::PresentMode,
|
|
|
|
/// The graphics backends to use.
|
|
pub backends: wgpu::Backends,
|
|
|
|
/// The default [`Font`] to use.
|
|
pub default_font: Font,
|
|
|
|
/// The default size of text.
|
|
///
|
|
/// By default, it will be set to `16.0`.
|
|
pub default_text_size: Pixels,
|
|
|
|
/// The antialiasing strategy that will be used for triangle primitives.
|
|
///
|
|
/// By default, it is `None`.
|
|
pub antialiasing: Option<Antialiasing>,
|
|
}
|
|
|
|
impl Default for Settings {
|
|
fn default() -> Settings {
|
|
Settings {
|
|
present_mode: wgpu::PresentMode::AutoVsync,
|
|
backends: wgpu::Backends::all(),
|
|
default_font: Font::default(),
|
|
default_text_size: Pixels(16.0),
|
|
antialiasing: None,
|
|
}
|
|
}
|
|
}
|
|
|
|
impl From<graphics::Settings> for Settings {
|
|
fn from(settings: graphics::Settings) -> Self {
|
|
Self {
|
|
present_mode: if settings.vsync {
|
|
wgpu::PresentMode::AutoVsync
|
|
} else {
|
|
wgpu::PresentMode::AutoNoVsync
|
|
},
|
|
default_font: settings.default_font,
|
|
default_text_size: settings.default_text_size,
|
|
antialiasing: settings.antialiasing,
|
|
..Settings::default()
|
|
}
|
|
}
|
|
}
|
|
|
|
/// Obtains a [`wgpu::PresentMode`] from the current environment
|
|
/// configuration, if set.
|
|
///
|
|
/// The value returned by this function can be changed by setting
|
|
/// the `ICED_PRESENT_MODE` env variable. The possible values are:
|
|
///
|
|
/// - `vsync` → [`wgpu::PresentMode::AutoVsync`]
|
|
/// - `no_vsync` → [`wgpu::PresentMode::AutoNoVsync`]
|
|
/// - `immediate` → [`wgpu::PresentMode::Immediate`]
|
|
/// - `fifo` → [`wgpu::PresentMode::Fifo`]
|
|
/// - `fifo_relaxed` → [`wgpu::PresentMode::FifoRelaxed`]
|
|
/// - `mailbox` → [`wgpu::PresentMode::Mailbox`]
|
|
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,
|
|
}
|
|
}
|