Files
archived-g-helper/app/Gpu/GPUModeControl.cs
2024-06-04 12:13:22 +02:00

364 lines
11 KiB
C#

using GHelper.Display;
using GHelper.Gpu.NVidia;
using GHelper.Helpers;
using GHelper.USB;
using System.Diagnostics;
namespace GHelper.Gpu
{
public class GPUModeControl
{
SettingsForm settings;
ScreenControl screenControl = new ScreenControl();
public static int gpuMode;
public static bool? gpuExists = null;
public GPUModeControl(SettingsForm settingsForm)
{
settings = settingsForm;
}
public void InitGPUMode()
{
int eco = Program.acpi.DeviceGet(AsusACPI.GPUEco);
int mux = Program.acpi.DeviceGet(AsusACPI.GPUMux);
if (mux < 0) mux = Program.acpi.DeviceGet(AsusACPI.GPUMuxVivo);
Logger.WriteLine("Eco flag : " + eco);
Logger.WriteLine("Mux flag : " + mux);
settings.VisualiseGPUButtons(eco >= 0, mux >= 0);
if (mux == 0)
{
gpuMode = AsusACPI.GPUModeUltimate;
}
else
{
if (eco == 1)
gpuMode = AsusACPI.GPUModeEco;
else
gpuMode = AsusACPI.GPUModeStandard;
// GPU mode not supported
if (eco < 0 && mux < 0)
{
if (gpuExists is null) gpuExists = Program.acpi.GetFan(AsusFan.GPU) >= 0;
settings.HideGPUModes((bool)gpuExists);
}
}
AppConfig.Set("gpu_mode", gpuMode);
settings.VisualiseGPUMode(gpuMode);
Aura.CustomRGB.ApplyGPUColor();
}
public void SetGPUMode(int GPUMode, int auto = 0)
{
int CurrentGPU = AppConfig.Get("gpu_mode");
AppConfig.Set("gpu_auto", auto);
if (CurrentGPU == GPUMode)
{
settings.VisualiseGPUMode();
return;
}
var restart = false;
var changed = false;
int status;
if (CurrentGPU == AsusACPI.GPUModeUltimate)
{
DialogResult dialogResult = MessageBox.Show(Properties.Strings.AlertUltimateOff, Properties.Strings.AlertUltimateTitle, MessageBoxButtons.YesNo);
if (dialogResult == DialogResult.Yes)
{
status = Program.acpi.DeviceSet(AsusACPI.GPUMux, 1, "GPUMux");
if (status != 1) Program.acpi.DeviceSet(AsusACPI.GPUMuxVivo, 1, "GPUMuxVivo");
restart = true;
changed = true;
}
}
else if (GPUMode == AsusACPI.GPUModeUltimate)
{
DialogResult dialogResult = MessageBox.Show(Properties.Strings.AlertUltimateOn, Properties.Strings.AlertUltimateTitle, MessageBoxButtons.YesNo);
if (dialogResult == DialogResult.Yes)
{
if (AppConfig.NoAutoUltimate())
{
Program.acpi.SetGPUEco(0);
Thread.Sleep(100);
}
status = Program.acpi.DeviceSet(AsusACPI.GPUMux, 0, "GPUMux");
if (status != 1) Program.acpi.DeviceSet(AsusACPI.GPUMuxVivo, 0, "GPUMuxVivo");
restart = true;
changed = true;
}
}
else if (GPUMode == AsusACPI.GPUModeEco)
{
settings.VisualiseGPUMode(GPUMode);
SetGPUEco(1, true);
changed = true;
}
else if (GPUMode == AsusACPI.GPUModeStandard)
{
settings.VisualiseGPUMode(GPUMode);
SetGPUEco(0);
changed = true;
}
if (changed)
{
AppConfig.Set("gpu_mode", GPUMode);
}
if (restart)
{
settings.VisualiseGPUMode();
Process.Start("shutdown", "/r /t 1");
}
}
public void SetGPUEco(int eco, bool hardWay = false)
{
settings.LockGPUModes();
Task.Run(async () =>
{
int status = 1;
if (eco == 1)
{
HardwareControl.KillGPUApps();
}
Logger.WriteLine($"Running eco command {eco}");
status = Program.acpi.SetGPUEco(eco);
if (status == 0 && eco == 1 && hardWay) RestartGPU();
await Task.Delay(TimeSpan.FromMilliseconds(AppConfig.Get("refresh_delay", 500)));
settings.Invoke(delegate
{
InitGPUMode();
screenControl.AutoScreen();
});
if (eco == 0)
{
await Task.Delay(TimeSpan.FromMilliseconds(3000));
HardwareControl.RecreateGpuControl();
Program.modeControl.SetGPUClocks(false);
}
if (AppConfig.Is("mode_reapply"))
{
await Task.Delay(TimeSpan.FromMilliseconds(3000));
Program.modeControl.AutoPerformance();
}
});
}
public static bool IsPlugged()
{
if (SystemInformation.PowerStatus.PowerLineStatus != PowerLineStatus.Online) return false;
if (!AppConfig.Is("optimized_usbc")) return true;
if (AppConfig.ContainsModel("FA507")) Thread.Sleep(1000);
int chargerMode = Program.acpi.DeviceGet(AsusACPI.ChargerMode);
Logger.WriteLine("ChargerStatus: " + chargerMode);
if (chargerMode <= 0) return true;
return (chargerMode & AsusACPI.ChargerBarrel) > 0;
}
public bool AutoGPUMode(bool optimized = false)
{
bool GpuAuto = AppConfig.Is("gpu_auto");
bool ForceGPU = AppConfig.IsForceSetGPUMode();
int GpuMode = AppConfig.Get("gpu_mode");
if (!GpuAuto && !ForceGPU) return false;
int eco = Program.acpi.DeviceGet(AsusACPI.GPUEco);
int mux = Program.acpi.DeviceGet(AsusACPI.GPUMux);
if (mux == 0)
{
if (optimized) SetGPUMode(AsusACPI.GPUModeStandard, 1);
return false;
}
else
{
if (eco == 1)
if ((GpuAuto && IsPlugged()) || (ForceGPU && GpuMode == AsusACPI.GPUModeStandard))
{
SetGPUEco(0);
return true;
}
if (eco == 0)
if ((GpuAuto && !IsPlugged()) || (ForceGPU && GpuMode == AsusACPI.GPUModeEco))
{
if (HardwareControl.IsUsedGPU())
{
DialogResult dialogResult = MessageBox.Show(Properties.Strings.AlertDGPU, Properties.Strings.AlertDGPUTitle, MessageBoxButtons.YesNo);
if (dialogResult == DialogResult.No) return false;
}
SetGPUEco(1);
return true;
}
}
return false;
}
public void RestartGPU(bool confirm = true)
{
if (HardwareControl.GpuControl is null) return;
if (!HardwareControl.GpuControl!.IsNvidia) return;
if (confirm)
{
DialogResult dialogResult = MessageBox.Show(Properties.Strings.RestartGPU, Properties.Strings.EcoMode, MessageBoxButtons.YesNo);
if (dialogResult == DialogResult.No) return;
}
ProcessHelper.RunAsAdmin("gpurestart");
if (!ProcessHelper.IsUserAdministrator()) return;
Logger.WriteLine("Trying to restart dGPU");
Task.Run(async () =>
{
settings.LockGPUModes("Restarting GPU ...");
var nvControl = (NvidiaGpuControl)HardwareControl.GpuControl;
bool status = nvControl.RestartGPU();
settings.Invoke(delegate
{
//labelTipGPU.Text = status ? "GPU Restarted, you can try Eco mode again" : "Failed to restart GPU"; TODO
InitGPUMode();
});
});
}
public void InitXGM()
{
if (Program.acpi.IsXGConnected())
{
//Program.acpi.DeviceSet(AsusACPI.GPUXGInit, 1, "XG Init");
XGM.Init();
}
}
public void ToggleXGM(bool silent = false)
{
Task.Run(async () =>
{
settings.LockGPUModes();
if (Program.acpi.DeviceGet(AsusACPI.GPUXG) == 1)
{
XGM.Reset();
HardwareControl.KillGPUApps();
if (silent)
{
Program.acpi.DeviceSet(AsusACPI.GPUXG, 0, "GPU XGM");
await Task.Delay(TimeSpan.FromSeconds(15));
}
else
{
DialogResult dialogResult = MessageBox.Show("Did you close all applications running on XG Mobile?", "Disabling XG Mobile", MessageBoxButtons.YesNo);
if (dialogResult == DialogResult.Yes)
{
Program.acpi.DeviceSet(AsusACPI.GPUXG, 0, "GPU XGM");
await Task.Delay(TimeSpan.FromSeconds(15));
}
}
}
else
{
if (AppConfig.Is("xgm_special"))
Program.acpi.DeviceSet(AsusACPI.GPUXG, 0x101, "GPU XGM");
else
Program.acpi.DeviceSet(AsusACPI.GPUXG, 1, "GPU XGM");
InitXGM();
XGM.Light(AppConfig.Is("xmg_light"));
await Task.Delay(TimeSpan.FromSeconds(15));
if (AppConfig.IsMode("auto_apply"))
XGM.SetFan(AppConfig.GetFanConfig(AsusFan.XGM));
HardwareControl.RecreateGpuControl();
}
settings.Invoke(delegate
{
InitGPUMode();
});
});
}
public void KillGPUApps()
{
if (HardwareControl.GpuControl is not null)
{
HardwareControl.GpuControl.KillGPUApps();
}
}
// Manually forcing standard mode on shutdown/hibernate for some exotic cases
// https://github.com/seerge/g-helper/pull/855
public void StandardModeFix()
{
if (!AppConfig.IsGPUFix()) return; // No config entry
if (Program.acpi.DeviceGet(AsusACPI.GPUMux) == 0) return; // Ultimate mode
Logger.WriteLine("Forcing Standard Mode on shutdown / hibernation");
Program.acpi.SetGPUEco(0);
}
}
}