diff --git a/lact-client/src/lib.rs b/lact-client/src/lib.rs
index 8ebd514..9ca52b2 100644
--- a/lact-client/src/lib.rs
+++ b/lact-client/src/lib.rs
@@ -89,6 +89,7 @@ impl DaemonClient {
}
request_plain!(get_system_info, SystemInfo, SystemInfo);
+ request_plain!(enable_overdrive, EnableOverdrive, ());
request_with_id!(get_device_info, DeviceInfo, DeviceInfo);
request_with_id!(get_device_stats, DeviceStats, DeviceStats);
request_with_id!(get_device_clocks_info, DeviceClocksInfo, ClocksInfo);
diff --git a/lact-daemon/src/server/mod.rs b/lact-daemon/src/server/mod.rs
index a642654..5bda86e 100644
--- a/lact-daemon/src/server/mod.rs
+++ b/lact-daemon/src/server/mod.rs
@@ -14,6 +14,8 @@ use tokio::{
};
use tracing::{debug, error, instrument};
+pub use system::MODULE_CONF_PATH;
+
pub struct Server {
pub handler: Handler,
listener: UnixListener,
diff --git a/lact-gui/src/app/mod.rs b/lact-gui/src/app/mod.rs
index b53e972..1b8e999 100644
--- a/lact-gui/src/app/mod.rs
+++ b/lact-gui/src/app/mod.rs
@@ -11,6 +11,7 @@ use header::Header;
use lact_client::schema::request::SetClocksCommand;
use lact_client::schema::DeviceStats;
use lact_client::DaemonClient;
+use lact_daemon::MODULE_CONF_PATH;
use root_stack::RootStack;
use std::sync::{Arc, RwLock};
use std::thread;
@@ -127,6 +128,12 @@ impl App {
app.set_initial(&gpu_id)
}));
+ if let Some(ref button) = app.root_stack.oc_page.enable_overclocking_button {
+ button.connect_clicked(clone!(@strong app => move |_| {
+ app.enable_overclocking();
+ }));
+ }
+
app.start_stats_update_loop(current_gpu_id);
app.window.show();
@@ -339,6 +346,40 @@ impl App {
Ok(())
}
+
+ fn enable_overclocking(&self) {
+ let text = format!("This will enable the overdrive feature of the amdgpu driver by creating a file at {MODULE_CONF_PATH}. Are you sure you want to do this?");
+ let dialog = MessageDialog::builder()
+ .title("Enable Overclocking")
+ .use_markup(true)
+ .text(text)
+ .message_type(MessageType::Question)
+ .buttons(ButtonsType::OkCancel)
+ .transient_for(&self.window)
+ .build();
+
+ dialog.run_async(clone!(@strong self as app => move |diag, response| {
+ if response == ResponseType::Ok {
+ match app.daemon_client.enable_overdrive().and_then(|buffer| buffer.inner()) {
+ Ok(_) => {
+ let success_dialog = MessageDialog::builder()
+ .title("Success")
+ .text("Overclocking successfully enabled. A system reboot is required to apply the changes")
+ .message_type(MessageType::Info)
+ .buttons(ButtonsType::Ok)
+ .build();
+ success_dialog.run_async(move |diag, _| {
+ diag.hide();
+ });
+ }
+ Err(err) => {
+ show_error(&app.window, err);
+ }
+ }
+ }
+ diag.hide();
+ }));
+ }
}
enum GuiUpdateMsg {
diff --git a/lact-gui/src/app/root_stack/oc_page/mod.rs b/lact-gui/src/app/root_stack/oc_page/mod.rs
index ec7856a..9642bdd 100644
--- a/lact-gui/src/app/root_stack/oc_page/mod.rs
+++ b/lact-gui/src/app/root_stack/oc_page/mod.rs
@@ -15,6 +15,9 @@ use power_cap_frame::PowerCapFrame;
use stats_frame::StatsFrame;
use tracing::warn;
+const OVERCLOCKING_DISABLED_TEXT: &str = "Overclocking support is not enabled! \
+You can still change basic settings, but the more advanced clocks and voltage control will not be available.";
+
#[derive(Clone)]
pub struct OcPage {
pub container: Box,
@@ -22,6 +25,7 @@ pub struct OcPage {
pub performance_frame: PerformanceFrame,
power_cap_frame: PowerCapFrame,
pub clocks_frame: ClocksFrame,
+ pub enable_overclocking_button: Option