use crate::RenderOptions;
use roxlap_gpu::PowerPreference;
#[allow(clippy::struct_field_names)]
#[derive(Default)]
pub(crate) struct EnvOverrides {
pub gpu_power: Option<PowerPreference>,
pub gpu_sprite_lod_px: Option<f32>,
pub gpu_mip_scan_dist: Option<f32>,
pub gpu_chunk_upload_budget: Option<u32>,
pub gpu_clip_upload_budget: Option<u32>,
}
#[cfg(not(target_arch = "wasm32"))]
fn parse_var<T: std::str::FromStr>(var: &str) -> Option<T> {
let raw = std::env::var(var).ok()?;
match raw.parse() {
Ok(v) => Some(v),
Err(_) => {
log::warn!("ignoring unparseable env override {var}={raw}");
None
}
}
}
impl EnvOverrides {
pub(crate) fn from_env() -> Self {
#[cfg(target_arch = "wasm32")]
{
Self::default()
}
#[cfg(not(target_arch = "wasm32"))]
{
let gpu_power = match std::env::var("ROXLAP_GPU_POWER").as_deref() {
Ok("low") => Some(PowerPreference::Low),
Ok("high") => Some(PowerPreference::High),
Ok(other) => {
log::warn!("ignoring unparseable env override ROXLAP_GPU_POWER={other}");
None
}
Err(_) => None,
};
Self {
gpu_power,
gpu_sprite_lod_px: parse_var("ROXLAP_GPU_SPRITE_LOD_PX"),
gpu_mip_scan_dist: parse_var("ROXLAP_GPU_MIP_SCAN_DIST"),
gpu_chunk_upload_budget: parse_var("ROXLAP_GPU_CHUNK_BUDGET"),
gpu_clip_upload_budget: parse_var("ROXLAP_GPU_CLIP_BUDGET"),
}
}
}
pub(crate) fn applied(&self, opts: &RenderOptions) -> RenderOptions {
let mut o = opts.clone();
if let Some(p) = self.gpu_power {
o.gpu.power_preference = p;
}
if let Some(v) = self.gpu_sprite_lod_px {
o.gpu_sprite_lod_px = v;
}
if let Some(v) = self.gpu_mip_scan_dist {
o.gpu_mip_scan_dist = v;
}
if let Some(v) = self.gpu_chunk_upload_budget {
o.gpu_chunk_upload_budget = v;
}
if let Some(v) = self.gpu_clip_upload_budget {
o.gpu_clip_upload_budget = v;
}
o
}
}