Remember power preerence and force fallback
This commit is contained in:
+69
-4
@@ -1,5 +1,5 @@
|
||||
use anyhow::Result;
|
||||
use clap::Parser;
|
||||
use clap::{Parser, ValueEnum};
|
||||
use egui::{Color32, Pos2, Vec2};
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
@@ -47,6 +47,28 @@ pub struct CliArgs {
|
||||
/// Map the first connected controller to Player 2
|
||||
#[arg(long)]
|
||||
pub player2_controller: bool,
|
||||
/// Force the application to render with CPU, rather than GPU.
|
||||
#[arg(long)]
|
||||
pub wgpu_force_fallback: Option<bool>,
|
||||
/// Set a preference for whether to use a low-power or high-performance GPU adapter
|
||||
#[arg(long)]
|
||||
pub wgpu_power_preference: Option<PowerPreferenceWrapper>,
|
||||
}
|
||||
|
||||
#[derive(ValueEnum, Clone, Copy)]
|
||||
pub enum PowerPreferenceWrapper {
|
||||
Low,
|
||||
High,
|
||||
None,
|
||||
}
|
||||
impl From<PowerPreferenceWrapper> for wgpu::PowerPreference {
|
||||
fn from(value: PowerPreferenceWrapper) -> Self {
|
||||
match value {
|
||||
PowerPreferenceWrapper::Low => wgpu::PowerPreference::LowPower,
|
||||
PowerPreferenceWrapper::High => wgpu::PowerPreference::HighPerformance,
|
||||
PowerPreferenceWrapper::None => wgpu::PowerPreference::None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub const COLOR_PRESETS: [[Color32; 2]; 3] = [
|
||||
@@ -64,6 +86,49 @@ pub const COLOR_PRESETS: [[Color32; 2]; 3] = [
|
||||
],
|
||||
];
|
||||
|
||||
const fn default_power_preference() -> wgpu::PowerPreference {
|
||||
wgpu::PowerPreference::LowPower
|
||||
}
|
||||
|
||||
#[derive(Serialize, Deserialize, Clone, PartialEq, Eq)]
|
||||
pub struct AppConfig {
|
||||
#[serde(default = "default_power_preference")]
|
||||
pub power_preference: wgpu::PowerPreference,
|
||||
#[serde(default)]
|
||||
pub force_fallback: bool,
|
||||
}
|
||||
|
||||
impl AppConfig {
|
||||
pub fn load(persistence: &Persistence) -> Self {
|
||||
if let Ok(config) = persistence.load_config(APP_CONFIG_FILENAME) {
|
||||
return config;
|
||||
}
|
||||
Self {
|
||||
power_preference: default_power_preference(),
|
||||
force_fallback: false,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn save(&self, persistence: &Persistence) -> Result<()> {
|
||||
persistence.save_config(APP_CONFIG_FILENAME, &self)
|
||||
}
|
||||
|
||||
pub fn update(&mut self, args: &CliArgs) -> bool {
|
||||
let mut updated = false;
|
||||
if let Some(pref) = args.wgpu_power_preference {
|
||||
self.power_preference = pref.into();
|
||||
updated = true;
|
||||
}
|
||||
if let Some(force_fallback) = args.wgpu_force_fallback {
|
||||
self.force_fallback = force_fallback;
|
||||
updated = true;
|
||||
}
|
||||
updated
|
||||
}
|
||||
}
|
||||
|
||||
const APP_CONFIG_FILENAME: &str = "config";
|
||||
|
||||
const fn default_audio_enabled() -> bool {
|
||||
true
|
||||
}
|
||||
@@ -81,7 +146,7 @@ pub struct SimConfig {
|
||||
|
||||
impl SimConfig {
|
||||
pub fn load(persistence: &Persistence, sim_id: SimId) -> Self {
|
||||
if let Ok(config) = persistence.load_config(config_filename(sim_id)) {
|
||||
if let Ok(config) = persistence.load_config(sim_config_filename(sim_id)) {
|
||||
return config;
|
||||
}
|
||||
Self {
|
||||
@@ -94,11 +159,11 @@ impl SimConfig {
|
||||
}
|
||||
|
||||
pub fn save(&self, persistence: &Persistence, sim_id: SimId) -> Result<()> {
|
||||
persistence.save_config(config_filename(sim_id), self)
|
||||
persistence.save_config(sim_config_filename(sim_id), self)
|
||||
}
|
||||
}
|
||||
|
||||
fn config_filename(sim_id: SimId) -> &'static str {
|
||||
fn sim_config_filename(sim_id: SimId) -> &'static str {
|
||||
match sim_id {
|
||||
SimId::Player1 => "config_p1",
|
||||
SimId::Player2 => "config_p2",
|
||||
|
||||
Reference in New Issue
Block a user