use std::env::var;
use std::path::PathBuf;
pub use wgpu::{Backends, PowerPreference};
#[derive(Clone, PartialEq, Eq, Hash)]
pub struct Options {
pub power_preference: PowerPreference,
pub backends: Backends,
pub wgpu_trace_path: Option<PathBuf>,
}
impl Default for Options {
fn default() -> Self {
Options {
power_preference: PowerPreference::LowPower,
backends: Backends::PRIMARY,
wgpu_trace_path: None,
}
}
}
impl Options {
pub fn load_from_env(&mut self) {
if let Ok(mut v) = var("KAS_POWER_PREFERENCE") {
v.make_ascii_uppercase();
self.power_preference = match v.as_str() {
"DEFAULT" | "LOWPOWER" => PowerPreference::LowPower,
"HIGHPERFORMANCE" => PowerPreference::HighPerformance,
other => {
log::error!("from_env: bad var KAS_POWER_PREFERENCE={other}");
log::error!(
"from_env: supported power modes: DEFAULT, LOWPOWER, HIGHPERFORMANCE"
);
self.power_preference
}
}
}
if let Ok(mut v) = var("KAS_BACKENDS") {
v.make_ascii_uppercase();
self.backends = match v.as_str() {
"VULKAN" => Backends::VULKAN,
"GL" => Backends::GL,
"METAL" => Backends::METAL,
"DX12" => Backends::DX12,
"BROWSER_WEBGPU" => Backends::BROWSER_WEBGPU,
"PRIMARY" => Backends::PRIMARY,
"SECONDARY" => Backends::SECONDARY,
"FALLBACK" => Backends::empty(),
other => {
log::error!("from_env: bad var KAS_BACKENDS={other}");
log::error!("from_env: supported backends: VULKAN, GL, METAL, DX12, BROWSER_WEBGPU, PRIMARY, SECONDARY, FALLBACK");
self.backends
}
}
}
if let Ok(v) = var("KAS_WGPU_TRACE_PATH") {
self.wgpu_trace_path = Some(v.into());
}
}
pub(crate) fn adapter_options(&self) -> wgpu::RequestAdapterOptions {
wgpu::RequestAdapterOptions {
power_preference: self.power_preference,
force_fallback_adapter: self.backends.is_empty(),
compatible_surface: None,
}
}
pub(crate) fn backend(&self) -> Backends {
if self.backends.is_empty() {
Backends::PRIMARY
} else {
self.backends
}
}
}