From 65dcded5c75ecf7ee3f2386ea834a663bcc73a9c Mon Sep 17 00:00:00 2001 From: Gabriele Musco Date: Tue, 5 Mar 2024 07:55:24 +0100 Subject: [PATCH 1/3] feat: update wivrn config to new spec --- src/file_builders/wivrn_config.rs | 27 ++++------- .../factories/wivrn_encoder_group_factory.rs | 31 ------------- src/ui/wivrn_conf_editor.rs | 46 +++++++++++++++++-- test/files/wivrn_config.json | 2 +- 4 files changed, 52 insertions(+), 54 deletions(-) diff --git a/src/file_builders/wivrn_config.rs b/src/file_builders/wivrn_config.rs index 1131db6..4150043 100644 --- a/src/file_builders/wivrn_config.rs +++ b/src/file_builders/wivrn_config.rs @@ -79,8 +79,6 @@ pub struct WivrnConfEncoder { pub encoder: Encoder, pub codec: Codec, #[serde(skip_serializing_if = "Option::is_none")] - pub bitrate: Option, - #[serde(skip_serializing_if = "Option::is_none")] pub width: Option, #[serde(skip_serializing_if = "Option::is_none")] pub height: Option, @@ -97,11 +95,10 @@ impl Default for WivrnConfEncoder { Self { encoder: Encoder::X264, codec: Codec::H264, - bitrate: None, - width: None, - height: None, - offset_x: None, - offset_y: None, + width: Some(1.0), + height: Some(1.0), + offset_x: Some(0.0), + offset_y: Some(0.0), group: None, } } @@ -111,6 +108,8 @@ impl Default for WivrnConfEncoder { pub struct WivrnConfig { #[serde(skip_serializing_if = "Option::is_none")] pub scale: Option<[f32; 2]>, + #[serde(skip_serializing_if = "Option::is_none")] + pub bitrate: Option, pub encoders: Vec, } @@ -118,16 +117,8 @@ impl Default for WivrnConfig { fn default() -> Self { Self { scale: Some([0.8, 0.8]), - encoders: vec![WivrnConfEncoder { - encoder: Encoder::X264, - codec: Codec::H264, - bitrate: Some(100000000), - width: Some(1.0), - height: Some(1.0), - offset_x: Some(0.0), - offset_y: Some(0.0), - group: None, - }], + bitrate: Some(50000000), + encoders: vec![WivrnConfEncoder::default()], } } } @@ -167,7 +158,7 @@ mod tests { assert_eq!(conf.encoders.len(), 1); assert_eq!(conf.encoders.get(0).unwrap().encoder, Encoder::X264); assert_eq!(conf.encoders.get(0).unwrap().codec, Codec::H264); - assert_eq!(conf.encoders.get(0).unwrap().bitrate, Some(100000000)); + assert_eq!(conf.bitrate, Some(100000000)); assert_eq!(conf.encoders.get(0).unwrap().width, Some(1.0)); assert_eq!(conf.encoders.get(0).unwrap().height, Some(1.0)); assert_eq!(conf.encoders.get(0).unwrap().offset_x, Some(0.0)); diff --git a/src/ui/factories/wivrn_encoder_group_factory.rs b/src/ui/factories/wivrn_encoder_group_factory.rs index 4b59dae..d995ec9 100644 --- a/src/ui/factories/wivrn_encoder_group_factory.rs +++ b/src/ui/factories/wivrn_encoder_group_factory.rs @@ -22,7 +22,6 @@ pub struct WivrnEncoderModel { pub enum WivrnEncoderModelMsg { EncoderChanged(u32), CodecChanged(u32), - BitrateChanged(Option), WidthChanged(Option), HeightChanged(Option), OffsetXChanged(Option), @@ -85,33 +84,6 @@ impl AsyncFactoryComponent for WivrnEncoderModel { } } ) -> adw::ComboRow, - add: bitrate_row = &number_entry_row( - "Bitrate (Mbps)", - &self.encoder_conf.bitrate - .and_then(|n| if let Some(mbits) = bits_to_mbits(n) { - Some(mbits.to_string()) - } else { - None - }) - .unwrap_or_default(), - false, - { - let sender = sender.clone(); - move |row| { - let txt = row.text(); - sender.input(Self::Input::BitrateChanged( - if txt.is_empty() { - None - } else { - match txt.parse::() { - Ok(bits) => bits_from_mbits(bits), - Err(e) => None, - } - } - )); - } - } - ) -> adw::EntryRow, add: width_row = &spin_row( "Width", None, @@ -203,9 +175,6 @@ impl AsyncFactoryComponent for WivrnEncoderModel { Self::Input::CodecChanged(idx) => { self.encoder_conf.codec = Codec::as_vec().get(idx as usize).unwrap().clone(); } - Self::Input::BitrateChanged(val) => { - self.encoder_conf.bitrate = val; - } Self::Input::WidthChanged(val) => { self.encoder_conf.width = val; } diff --git a/src/ui/wivrn_conf_editor.rs b/src/ui/wivrn_conf_editor.rs index ff9c9ed..cbb76b3 100644 --- a/src/ui/wivrn_conf_editor.rs +++ b/src/ui/wivrn_conf_editor.rs @@ -1,7 +1,13 @@ -use super::factories::wivrn_encoder_group_factory::{WivrnEncoderModel, WivrnEncoderModelInit}; +use super::{ + factories::wivrn_encoder_group_factory::{WivrnEncoderModel, WivrnEncoderModelInit}, + util::bits_from_mbits, +}; use crate::{ file_builders::wivrn_config::{dump_wivrn_config, get_wivrn_config, WivrnConfig}, - ui::preference_rows::spin_row, + ui::{ + preference_rows::{number_entry_row, spin_row}, + util::bits_to_mbits, + }, }; use adw::prelude::*; use relm4::{factory::AsyncFactoryVecDeque, prelude::*}; @@ -17,6 +23,8 @@ pub struct WivrnConfEditor { pub scalex_row: Option, #[tracker::do_not_track] pub scaley_row: Option, + #[tracker::do_not_track] + bitrate_row: Option, } #[derive(Debug)] @@ -101,6 +109,24 @@ impl SimpleComponent for WivrnConfEditor { move |_| {} ) -> adw::SpinRow, }, + add: bitrategrp = &adw::PreferencesGroup { + set_title: "Bitrate", + add: bitrate_row = &number_entry_row( + "Bitrate (Mbps)", + &model.conf.bitrate + .and_then(|n| if let Some(mbits) = bits_to_mbits(n) { + Some(mbits.to_string()) + } else { + None + }) + .unwrap_or_default(), + false, + { + let sender = sender.clone(); + move |_| {} + } + ) -> adw::EntryRow, + }, add: encodersrgp = &adw::PreferencesGroup { set_title: "Encoders", adw::ActionRow { @@ -133,8 +159,18 @@ impl SimpleComponent for WivrnConfEditor { Self::Input::Save => { let x = self.scalex_row.as_ref().unwrap().adjustment().value(); let y = self.scaley_row.as_ref().unwrap().adjustment().value(); - Some([x as f32, y as f32]); - + self.conf.scale = Some([x as f32, y as f32]); + self.conf.bitrate = { + let txt = self.bitrate_row.as_ref().unwrap().text(); + if txt.is_empty() { + None + } else { + match txt.parse::() { + Ok(mbits) => bits_from_mbits(mbits), + Err(_) => None, + } + } + }; self.conf.encoders = self .encoder_models .as_ref() @@ -180,6 +216,7 @@ impl SimpleComponent for WivrnConfEditor { win: None, scalex_row: None, scaley_row: None, + bitrate_row: None, tracker: 0, }; @@ -187,6 +224,7 @@ impl SimpleComponent for WivrnConfEditor { model.scalex_row = Some(widgets.scalex_row.clone()); model.scaley_row = Some(widgets.scaley_row.clone()); + model.bitrate_row = Some(widgets.bitrate_row.clone()); let mut encoder_models: AsyncFactoryVecDeque = AsyncFactoryVecDeque::new(widgets.pref_page.clone(), sender.input_sender()); diff --git a/test/files/wivrn_config.json b/test/files/wivrn_config.json index aafcfd0..81958b2 100644 --- a/test/files/wivrn_config.json +++ b/test/files/wivrn_config.json @@ -1,10 +1,10 @@ { "scale": [0.8, 0.8], + "bitrate": 100000000, "encoders": [ { "encoder": "x264", "codec": "h264", - "bitrate": 100000000, "width": 1.0, "height": 1.0, "offset_x": 0.0, From 7f372968348dc3ba9cbe82ae433bb40eedbe0d53 Mon Sep 17 00:00:00 2001 From: Gabriele Musco Date: Sat, 23 Mar 2024 08:08:11 +0000 Subject: [PATCH 2/3] chore: relabel running section as build and run from source in readme --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ae95ce9..18cc0ee 100644 --- a/README.md +++ b/README.md @@ -14,11 +14,11 @@ UI for building, configuring and running Monado, the open source OpenXR runtime. Download the latest AppImage snapshot: [GitLab Pipelines](https://gitlab.com/gabmus/envision/-/pipelines?page=1&scope=all&ref=main) -## Running +## Building and running from source ```bash git clone https://gitlab.com/gabmus/envision/ -cd envision +cd envision meson setup build -Dprefix="$PWD/build/localprefix" -Dprofile=development ninja -C build ninja -C build install From ce04390058f0cde805d21313bc43ceaf4c29847d Mon Sep 17 00:00:00 2001 From: Gabriele Musco Date: Thu, 28 Mar 2024 16:40:33 +0000 Subject: [PATCH 3/3] feat: turn on CMAKE_EXPORT_COMPILE_COMMANDS for all relevant components --- src/builders/build_basalt.rs | 1 + src/builders/build_libsurvive.rs | 1 + src/builders/build_monado.rs | 1 + src/builders/build_opencomposite.rs | 1 + src/builders/build_openhmd.rs | 1 + src/builders/build_wivrn.rs | 1 + 6 files changed, 6 insertions(+) diff --git a/src/builders/build_basalt.rs b/src/builders/build_basalt.rs index 3d896a9..253fcb1 100644 --- a/src/builders/build_basalt.rs +++ b/src/builders/build_basalt.rs @@ -28,6 +28,7 @@ pub fn get_build_basalt_jobs(profile: &Profile, clean_build: bool) -> VecDeque = HashMap::new(); + cmake_vars.insert("CMAKE_EXPORT_COMPILE_COMMANDS".into(), "ON".into()); cmake_vars.insert("CMAKE_BUILD_TYPE".into(), "RelWithDebInfo".into()); cmake_vars.insert("CMAKE_INSTALL_PREFIX".into(), profile.prefix.clone()); cmake_vars.insert("BUILD_TESTS".into(), "OFF".into()); diff --git a/src/builders/build_libsurvive.rs b/src/builders/build_libsurvive.rs index 0d1134e..f78cd20 100644 --- a/src/builders/build_libsurvive.rs +++ b/src/builders/build_libsurvive.rs @@ -31,6 +31,7 @@ pub fn get_build_libsurvive_jobs(profile: &Profile, clean_build: bool) -> VecDeq profile.features.libsurvive.path.as_ref().unwrap() ); let mut cmake_vars: HashMap = HashMap::new(); + cmake_vars.insert("CMAKE_EXPORT_COMPILE_COMMANDS".into(), "ON".into()); cmake_vars.insert("CMAKE_BUILD_TYPE".into(), "RelWithDebInfo".into()); cmake_vars.insert("ENABLE_api_example".into(), "OFF".into()); cmake_vars.insert("USE_HIDAPI".into(), "ON".into()); diff --git a/src/builders/build_monado.rs b/src/builders/build_monado.rs index 9d2713d..1bb875b 100644 --- a/src/builders/build_monado.rs +++ b/src/builders/build_monado.rs @@ -33,6 +33,7 @@ pub fn get_build_monado_jobs(profile: &Profile, clean_build: bool) -> VecDeque = HashMap::new(); + cmake_vars.insert("CMAKE_EXPORT_COMPILE_COMMANDS".into(), "ON".into()); cmake_vars.insert("CMAKE_BUILD_TYPE".into(), "RelWithDebInfo".into()); cmake_vars.insert("XRT_HAVE_SYSTEM_CJSON".into(), "NO".into()); cmake_vars.insert("CMAKE_LIBDIR".into(), format!("{}/lib", profile.prefix)); diff --git a/src/builders/build_opencomposite.rs b/src/builders/build_opencomposite.rs index d9bb785..11553b3 100644 --- a/src/builders/build_opencomposite.rs +++ b/src/builders/build_opencomposite.rs @@ -28,6 +28,7 @@ pub fn get_build_opencomposite_jobs(profile: &Profile, clean_build: bool) -> Vec let build_dir = format!("{}/build", profile.opencomposite_path); let mut cmake_vars: HashMap = HashMap::new(); + cmake_vars.insert("CMAKE_EXPORT_COMPILE_COMMANDS".into(), "ON".into()); cmake_vars.insert("CMAKE_BUILD_TYPE".into(), "RelWithDebInfo".into()); let cmake = Cmake { env: None, diff --git a/src/builders/build_openhmd.rs b/src/builders/build_openhmd.rs index 26c3b7e..322cf63 100644 --- a/src/builders/build_openhmd.rs +++ b/src/builders/build_openhmd.rs @@ -28,6 +28,7 @@ pub fn get_build_openhmd_jobs(profile: &Profile, clean_build: bool) -> VecDeque< let build_dir = format!("{}/build", profile.features.openhmd.path.as_ref().unwrap()); let mut cmake_vars: HashMap = HashMap::new(); + cmake_vars.insert("CMAKE_EXPORT_COMPILE_COMMANDS".into(), "ON".into()); cmake_vars.insert("CMAKE_BUILD_TYPE".into(), "RelWithDebInfo".into()); cmake_vars.insert("CMAKE_INSTALL_PREFIX".into(), profile.prefix.clone()); cmake_vars.insert( diff --git a/src/builders/build_wivrn.rs b/src/builders/build_wivrn.rs index 9836fcc..7c39591 100644 --- a/src/builders/build_wivrn.rs +++ b/src/builders/build_wivrn.rs @@ -28,6 +28,7 @@ pub fn get_build_wivrn_jobs(profile: &Profile, clean_build: bool) -> VecDeque = HashMap::new(); + cmake_vars.insert("CMAKE_EXPORT_COMPILE_COMMANDS".into(), "ON".into()); cmake_vars.insert("CMAKE_BUILD_TYPE".into(), "RelWithDebInfo".into()); cmake_vars.insert("XRT_HAVE_SYSTEM_CJSON".into(), "NO".into()); cmake_vars.insert("WIVRN_BUILD_CLIENT".into(), "OFF".into());