From 9a5b0638ea434d65c681af290e2eda83ccd83cf2 Mon Sep 17 00:00:00 2001 From: Gabriele Musco Date: Thu, 25 Jul 2024 09:16:36 +0200 Subject: [PATCH 1/2] feat: system profiles --- src/config.rs | 20 +++----------------- src/profiles/mod.rs | 26 ++++++++++++++++++++++++++ src/profiles/system_monado.rs | 34 ++++++++++++++++++++++++++++++++++ src/profiles/system_wivrn.rs | 30 ++++++++++++++++++++++++++++++ 4 files changed, 93 insertions(+), 17 deletions(-) create mode 100644 src/profiles/system_monado.rs create mode 100644 src/profiles/system_wivrn.rs diff --git a/src/config.rs b/src/config.rs index e401565..3c19d1f 100644 --- a/src/config.rs +++ b/src/config.rs @@ -1,13 +1,6 @@ use crate::{ - constants::CMD_NAME, - device_prober::PhysicalXRDevice, - paths::get_config_dir, - profile::Profile, - profiles::{ - lighthouse::lighthouse_profile, openhmd::openhmd_profile, simulated::simulated_profile, - survive::survive_profile, wivrn::wivrn_profile, wmr::wmr_profile, - }, - util::file_utils::get_writer, + constants::CMD_NAME, device_prober::PhysicalXRDevice, paths::get_config_dir, profile::Profile, + profiles::default_profiles, util::file_utils::get_writer, }; use serde::{de::Error, Deserialize, Serialize}; use std::{ @@ -96,14 +89,7 @@ impl Config { } pub fn profiles(&self) -> Vec { - let mut profiles = vec![ - lighthouse_profile(), - survive_profile(), - wivrn_profile(), - wmr_profile(), - openhmd_profile(), - simulated_profile(), - ]; + let mut profiles = default_profiles(); profiles.extend(self.user_profiles.clone()); profiles.sort_unstable_by(|a, b| a.name.cmp(&b.name)); profiles diff --git a/src/profiles/mod.rs b/src/profiles/mod.rs index b942f04..eaf3f71 100644 --- a/src/profiles/mod.rs +++ b/src/profiles/mod.rs @@ -1,6 +1,32 @@ +use crate::profile::Profile; +use lighthouse::lighthouse_profile; +use openhmd::openhmd_profile; +use simulated::simulated_profile; +use survive::survive_profile; +use system_monado::system_monado_profile; +use system_wivrn::system_wivrn_profile; +use wivrn::wivrn_profile; +use wmr::wmr_profile; + pub mod lighthouse; pub mod openhmd; pub mod simulated; pub mod survive; +pub mod system_monado; +pub mod system_wivrn; pub mod wivrn; pub mod wmr; + +/// get the default built-in envision profiles +pub fn default_profiles() -> Vec { + vec![ + lighthouse_profile(), + survive_profile(), + wivrn_profile(), + wmr_profile(), + openhmd_profile(), + simulated_profile(), + system_monado_profile(), + system_wivrn_profile(), + ] +} diff --git a/src/profiles/system_monado.rs b/src/profiles/system_monado.rs new file mode 100644 index 0000000..96da61c --- /dev/null +++ b/src/profiles/system_monado.rs @@ -0,0 +1,34 @@ +use std::collections::HashMap; + +use crate::{ + constants::APP_NAME, + paths::{data_monado_path, data_opencomposite_path, SYSTEM_PREFIX}, + profile::{LighthouseDriver, Profile, ProfileFeatures, XRServiceType}, +}; + +pub fn system_monado_profile() -> Profile { + let mut environment: HashMap = HashMap::new(); + environment.insert("XRT_JSON_LOG".into(), "1".into()); + environment.insert("XRT_COMPOSITOR_SCALE_PERCENTAGE".into(), "140".into()); + environment.insert("XRT_COMPOSITOR_COMPUTE".into(), "1".into()); + environment.insert("XRT_DEBUG_GUI".into(), "1".into()); + environment.insert("XRT_CURATED_GUI".into(), "1".into()); + environment.insert("U_PACING_APP_USE_MIN_FRAME_PERIOD".into(), "1".into()); + Profile { + prefix: SYSTEM_PREFIX.into(), + uuid: "system-monado-default".into(), + name: format!("System Monado - {name} Default", name = APP_NAME), + can_be_built: false, + // does it apply to system profiles? + xrservice_path: data_monado_path(), + xrservice_type: XRServiceType::Monado, + // does it apply to system profiles? + opencomposite_path: data_opencomposite_path(), + features: ProfileFeatures::default(), + environment, + editable: false, + lighthouse_driver: LighthouseDriver::SteamVR, + pull_on_build: false, + ..Default::default() + } +} diff --git a/src/profiles/system_wivrn.rs b/src/profiles/system_wivrn.rs new file mode 100644 index 0000000..97e01ae --- /dev/null +++ b/src/profiles/system_wivrn.rs @@ -0,0 +1,30 @@ +use std::collections::HashMap; + +use crate::{ + constants::APP_NAME, + paths::{data_opencomposite_path, data_wivrn_path, SYSTEM_PREFIX}, + profile::{Profile, ProfileFeatures, XRServiceType}, +}; + +pub fn system_wivrn_profile() -> Profile { + let mut environment: HashMap = HashMap::new(); + environment.insert("XRT_DEBUG_GUI".into(), "1".into()); + environment.insert("XRT_CURATED_GUI".into(), "1".into()); + environment.insert("U_PACING_APP_USE_MIN_FRAME_PERIOD".into(), "1".into()); + Profile { + prefix: SYSTEM_PREFIX.into(), + uuid: "system-wivrn-default".into(), + name: format!("System WiVRn - {name} Default", name = APP_NAME), + can_be_built: false, + // does it apply to system profiles? + xrservice_path: data_wivrn_path(), + xrservice_type: XRServiceType::Wivrn, + // does it apply to system profiles? + opencomposite_path: data_opencomposite_path(), + features: ProfileFeatures::default(), + environment, + editable: false, + pull_on_build: false, + ..Default::default() + } +} From 281dabf534d850b302e13497576e821879cfdf28 Mon Sep 17 00:00:00 2001 From: Gabriele Musco Date: Thu, 1 Aug 2024 09:45:12 +0200 Subject: [PATCH 2/2] feat: extra profile flag for system profiles; disable building profiles that cannot be built --- src/profile.rs | 3 ++ src/profiles/system_monado.rs | 7 ++-- src/profiles/system_wivrn.rs | 7 ++-- src/ui/app.rs | 61 ++++++++++++++++++++--------------- 4 files changed, 44 insertions(+), 34 deletions(-) diff --git a/src/profile.rs b/src/profile.rs index 711b2fb..18eb608 100644 --- a/src/profile.rs +++ b/src/profile.rs @@ -270,6 +270,8 @@ pub struct Profile { pub prefix: PathBuf, pub can_be_built: bool, pub editable: bool, + #[serde(default)] + pub is_system: bool, pub pull_on_build: bool, #[serde(default = "LighthouseDriver::default")] /// Only applicable for Monado @@ -335,6 +337,7 @@ impl Default for Profile { uuid, autostart_command: None, skip_dependency_check: false, + is_system: false, } } } diff --git a/src/profiles/system_monado.rs b/src/profiles/system_monado.rs index 96da61c..035f86a 100644 --- a/src/profiles/system_monado.rs +++ b/src/profiles/system_monado.rs @@ -1,10 +1,8 @@ -use std::collections::HashMap; - use crate::{ - constants::APP_NAME, paths::{data_monado_path, data_opencomposite_path, SYSTEM_PREFIX}, profile::{LighthouseDriver, Profile, ProfileFeatures, XRServiceType}, }; +use std::collections::HashMap; pub fn system_monado_profile() -> Profile { let mut environment: HashMap = HashMap::new(); @@ -15,9 +13,10 @@ pub fn system_monado_profile() -> Profile { environment.insert("XRT_CURATED_GUI".into(), "1".into()); environment.insert("U_PACING_APP_USE_MIN_FRAME_PERIOD".into(), "1".into()); Profile { + is_system: true, prefix: SYSTEM_PREFIX.into(), uuid: "system-monado-default".into(), - name: format!("System Monado - {name} Default", name = APP_NAME), + name: "System Monado".into(), can_be_built: false, // does it apply to system profiles? xrservice_path: data_monado_path(), diff --git a/src/profiles/system_wivrn.rs b/src/profiles/system_wivrn.rs index 97e01ae..96ed0d8 100644 --- a/src/profiles/system_wivrn.rs +++ b/src/profiles/system_wivrn.rs @@ -1,10 +1,8 @@ -use std::collections::HashMap; - use crate::{ - constants::APP_NAME, paths::{data_opencomposite_path, data_wivrn_path, SYSTEM_PREFIX}, profile::{Profile, ProfileFeatures, XRServiceType}, }; +use std::collections::HashMap; pub fn system_wivrn_profile() -> Profile { let mut environment: HashMap = HashMap::new(); @@ -12,9 +10,10 @@ pub fn system_wivrn_profile() -> Profile { environment.insert("XRT_CURATED_GUI".into(), "1".into()); environment.insert("U_PACING_APP_USE_MIN_FRAME_PERIOD".into(), "1".into()); Profile { + is_system: true, prefix: SYSTEM_PREFIX.into(), uuid: "system-wivrn-default".into(), - name: format!("System WiVRn - {name} Default", name = APP_NAME), + name: "System WiVRn".into(), can_be_built: false, // does it apply to system profiles? xrservice_path: data_wivrn_path(), diff --git a/src/ui/app.rs b/src/ui/app.rs index 0643583..d44fb8e 100644 --- a/src/ui/app.rs +++ b/src/ui/app.rs @@ -419,33 +419,42 @@ impl AsyncComponent for App { let mut missing_deps = vec![]; let mut jobs = VecDeque::::new(); // profile per se can't be built, but we still need opencomp - if profile.can_be_built { - missing_deps.extend(match profile.xrservice_type { - XRServiceType::Monado => get_missing_monado_deps(), - XRServiceType::Wivrn => get_missing_wivrn_deps(), - }); - if profile.features.libsurvive.enabled { - missing_deps.extend(get_missing_libsurvive_deps()); - jobs.extend(get_build_libsurvive_jobs(&profile, clean_build)); - } - if profile.features.openhmd.enabled { - missing_deps.extend(get_missing_openhmd_deps()); - jobs.extend(get_build_openhmd_jobs(&profile, clean_build)); - } - if profile.features.basalt.enabled { - missing_deps.extend(get_missing_basalt_deps()); - jobs.extend(get_build_basalt_jobs(&profile, clean_build)); - } - if profile.features.mercury_enabled { - missing_deps.extend(get_missing_mercury_deps()); - jobs.extend(get_build_mercury_jobs(&profile)); - } - jobs.extend(match profile.xrservice_type { - XRServiceType::Monado => get_build_monado_jobs(&profile, clean_build), - XRServiceType::Wivrn => get_build_wivrn_jobs(&profile, clean_build), - }); - // no listed deps for opencomp + if !profile.can_be_built { + alert( + "This profile cannot be built", + if profile.is_system { + Some("This is a system profile: it assumes you have everything already installed in your system using your distro package manager or other means.") + } else { + None + }, + Some(&self.app_win.clone().upcast()), + ); + return; } + missing_deps.extend(match profile.xrservice_type { + XRServiceType::Monado => get_missing_monado_deps(), + XRServiceType::Wivrn => get_missing_wivrn_deps(), + }); + if profile.features.libsurvive.enabled { + missing_deps.extend(get_missing_libsurvive_deps()); + jobs.extend(get_build_libsurvive_jobs(&profile, clean_build)); + } + if profile.features.openhmd.enabled { + missing_deps.extend(get_missing_openhmd_deps()); + jobs.extend(get_build_openhmd_jobs(&profile, clean_build)); + } + if profile.features.basalt.enabled { + missing_deps.extend(get_missing_basalt_deps()); + jobs.extend(get_build_basalt_jobs(&profile, clean_build)); + } + if profile.features.mercury_enabled { + missing_deps.extend(get_missing_mercury_deps()); + jobs.extend(get_build_mercury_jobs(&profile)); + } + jobs.extend(match profile.xrservice_type { + XRServiceType::Monado => get_build_monado_jobs(&profile, clean_build), + XRServiceType::Wivrn => get_build_wivrn_jobs(&profile, clean_build), + }); jobs.extend(get_build_opencomposite_jobs(&profile, clean_build)); if !(self.skip_depcheck || profile.skip_dependency_check || missing_deps.is_empty()) {