mirror of
https://github.com/ilya-zlobintsev/LACT.git
synced 2025-02-25 18:55:26 -06:00
fix: avoid setting pstates unless explicitly enabled in the gui (#465)
* feat: better pstate config * fix: reset custom pstate settings * fix: sensitivity * fix: remove pstates from config when empty * fix: react to configurable notify * fix: show on start * fix: gpu switching
This commit is contained in:
@@ -565,7 +565,11 @@ impl<'a> Handler {
|
||||
enabled_states: Vec<u8>,
|
||||
) -> anyhow::Result<u64> {
|
||||
self.edit_gpu_config(id.to_owned(), |gpu| {
|
||||
gpu.power_states.insert(kind, enabled_states);
|
||||
if enabled_states.is_empty() {
|
||||
gpu.power_states.shift_remove(&kind);
|
||||
} else {
|
||||
gpu.power_states.insert(kind, enabled_states);
|
||||
}
|
||||
})
|
||||
.await
|
||||
.context("Failed to edit GPU config and set enabled power states")
|
||||
|
||||
@@ -649,17 +649,15 @@ impl AppModel {
|
||||
let enabled_power_states = self.oc_page.model().get_enabled_power_states();
|
||||
|
||||
for (kind, states) in enabled_power_states {
|
||||
if !states.is_empty() {
|
||||
self.daemon_client
|
||||
.set_enabled_power_states(&gpu_id, kind, states)
|
||||
.await
|
||||
.context("Could not set power states")?;
|
||||
self.daemon_client
|
||||
.set_enabled_power_states(&gpu_id, kind, states)
|
||||
.await
|
||||
.context("Could not set power states")?;
|
||||
|
||||
self.daemon_client
|
||||
.confirm_pending_config(ConfirmCommand::Confirm)
|
||||
.await
|
||||
.context("Could not commit config")?;
|
||||
}
|
||||
self.daemon_client
|
||||
.confirm_pending_config(ConfirmCommand::Confirm)
|
||||
.await
|
||||
.context("Could not commit config")?;
|
||||
}
|
||||
|
||||
if !clocks_commands.is_empty() {
|
||||
|
||||
@@ -43,6 +43,7 @@ pub enum OcPageMsg {
|
||||
ClocksTable(Option<ClocksTable>),
|
||||
ProfileModesTable(Option<PowerProfileModesTable>),
|
||||
PowerStates(PowerStates),
|
||||
PerformanceLevelChanged,
|
||||
}
|
||||
|
||||
#[relm4::component(pub)]
|
||||
@@ -156,6 +157,7 @@ impl relm4::Component for OcPage {
|
||||
}
|
||||
None => self.performance_frame.hide(),
|
||||
}
|
||||
sender.input(OcPageMsg::PerformanceLevelChanged);
|
||||
}
|
||||
}
|
||||
PageUpdate::Info(info) => {
|
||||
@@ -177,6 +179,14 @@ impl relm4::Component for OcPage {
|
||||
OcPageMsg::PowerStates(states) => {
|
||||
self.power_states_frame.set_power_states(states);
|
||||
}
|
||||
OcPageMsg::PerformanceLevelChanged => {
|
||||
if let Some(PerformanceLevel::Manual) = self.get_performance_level() {
|
||||
self.power_states_frame.set_toggleable(true);
|
||||
} else {
|
||||
self.power_states_frame.set_toggleable(false);
|
||||
self.power_states_frame.set_configurable(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
self.signals_blocked.set(false);
|
||||
@@ -191,7 +201,17 @@ impl relm4::Component for OcPage {
|
||||
}
|
||||
};
|
||||
self.performance_frame.connect_settings_changed(f.clone());
|
||||
self.power_states_frame.connect_values_changed(f);
|
||||
|
||||
self.power_states_frame.connect_values_changed(f.clone());
|
||||
|
||||
{
|
||||
let sender = sender.clone();
|
||||
self.performance_frame.connect_settings_changed(move || {
|
||||
sender.input(OcPageMsg::PerformanceLevelChanged);
|
||||
});
|
||||
}
|
||||
self.power_states_frame
|
||||
.connect_configurable_notify(move |_| f());
|
||||
|
||||
self.update_view(widgets, sender);
|
||||
}
|
||||
@@ -216,10 +236,6 @@ impl OcPage {
|
||||
}
|
||||
|
||||
pub fn get_enabled_power_states(&self) -> HashMap<PowerLevelKind, Vec<u8>> {
|
||||
if self.performance_frame.get_selected_performance_level() == PerformanceLevel::Manual {
|
||||
self.power_states_frame.get_enabled_power_states()
|
||||
} else {
|
||||
HashMap::new()
|
||||
}
|
||||
self.power_states_frame.get_enabled_power_states()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,6 +26,15 @@ impl PowerStatesFrame {
|
||||
imp.expander.set_expanded(false);
|
||||
}
|
||||
|
||||
if states
|
||||
.core
|
||||
.iter()
|
||||
.chain(states.vram.iter())
|
||||
.any(|state| !state.enabled)
|
||||
{
|
||||
self.set_configurable(true);
|
||||
}
|
||||
|
||||
imp.core_states_list
|
||||
.set_power_states(states.core, "MHz", 1.0);
|
||||
imp.vram_states_list
|
||||
@@ -48,9 +57,17 @@ impl PowerStatesFrame {
|
||||
}
|
||||
|
||||
pub fn get_enabled_power_states(&self) -> HashMap<PowerLevelKind, Vec<u8>> {
|
||||
let imp = self.imp();
|
||||
let core_states = imp.core_states_list.get_enabled_power_states();
|
||||
let vram_states = imp.vram_states_list.get_enabled_power_states();
|
||||
let core_states;
|
||||
let vram_states;
|
||||
|
||||
if self.configurable() {
|
||||
let imp = self.imp();
|
||||
core_states = imp.core_states_list.get_enabled_power_states();
|
||||
vram_states = imp.vram_states_list.get_enabled_power_states();
|
||||
} else {
|
||||
core_states = vec![];
|
||||
vram_states = vec![];
|
||||
}
|
||||
|
||||
[
|
||||
(PowerLevelKind::CoreClock, core_states),
|
||||
@@ -94,6 +111,8 @@ mod imp {
|
||||
#[property(get, set)]
|
||||
configurable: AtomicBool,
|
||||
#[property(get, set)]
|
||||
toggleable: AtomicBool,
|
||||
#[property(get, set)]
|
||||
vram_clock_ratio: Cell<f64>,
|
||||
}
|
||||
|
||||
|
||||
@@ -5,21 +5,39 @@ template $PowerStatesFrame: Box {
|
||||
label: "Power states";
|
||||
|
||||
Box {
|
||||
orientation: vertical;
|
||||
margin-start: 10;
|
||||
margin-end: 10;
|
||||
margin-top: 10;
|
||||
margin-bottom: 10;
|
||||
spacing: 10;
|
||||
orientation: horizontal;
|
||||
spacing: 5;
|
||||
|
||||
$PowerStatesList core_states_list {
|
||||
title: "GPU power states";
|
||||
sensitive: bind template.configurable;
|
||||
Label {
|
||||
label: "Note: performance level must be set to 'manual' to toggle power states";
|
||||
margin-start: 10;
|
||||
margin-end: 10;
|
||||
halign: start;
|
||||
}
|
||||
|
||||
$PowerStatesList vram_states_list {
|
||||
title: "VRAM power states";
|
||||
sensitive: bind template.configurable;
|
||||
CheckButton {
|
||||
label: "Enable power state configuration";
|
||||
sensitive: bind template.toggleable bidirectional;
|
||||
active: bind template.configurable bidirectional;
|
||||
}
|
||||
|
||||
Box {
|
||||
spacing: 10;
|
||||
orientation: horizontal;
|
||||
|
||||
$PowerStatesList core_states_list {
|
||||
title: "GPU power states";
|
||||
sensitive: bind template.configurable;
|
||||
}
|
||||
|
||||
$PowerStatesList vram_states_list {
|
||||
title: "VRAM power states";
|
||||
sensitive: bind template.configurable;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user