steam-deck-tools/PowerControl/Options/RefreshRate.cs

78 lines
3 KiB
C#
Raw Permalink Normal View History

using PowerControl.Helpers;
using PowerControl.Helpers.AMD;
namespace PowerControl.Options
{
public static class RefreshRate
{
public static Menu.MenuItemWithOptions Instance = new Menu.MenuItemWithOptions()
{
Name = "Refresh Rate",
PersistentKey = "RefreshRate",
ApplyDelay = 1000,
ResetValue = () => { return DisplayResolutionController.GetRefreshRates().Max().ToString(); },
OptionsValues = delegate ()
{
2023-02-09 11:03:41 +01:00
var refreshRates = DisplayResolutionController.GetRefreshRates().ToList();
var currentRefreshRate = DisplayResolutionController.GetRefreshRate();
2023-02-09 11:42:50 +01:00
if (currentRefreshRate > 0)
2023-02-09 11:03:41 +01:00
refreshRates.Add(currentRefreshRate);
2023-02-09 11:42:50 +01:00
var normalizedResolution = DisplayResolutionController.GetResolution()?.Normalize();
if (normalizedResolution is not null && ExternalHelpers.DisplayConfig.IsInternalConnected == true)
{
foreach (var displayModeInfo in ModeTiming.AllDetailedTimings())
{
if (displayModeInfo.iPelsWidth == normalizedResolution.Value.Width &&
displayModeInfo.iPelsHeight == normalizedResolution.Value.Height)
{
refreshRates.Add(displayModeInfo.iRefreshRate);
}
}
2023-02-09 11:03:41 +01:00
}
2023-02-08 23:41:08 +01:00
2023-02-09 11:42:50 +01:00
refreshRates = refreshRates.Distinct().ToList();
refreshRates.Sort();
if (refreshRates.Count() > 1)
return refreshRates.Select(item => item.ToString()).ToArray();
return null;
},
CurrentValue = delegate ()
{
return DisplayResolutionController.GetRefreshRate().ToString();
},
ApplyValue = (selected) =>
{
2023-02-08 23:41:08 +01:00
var selectedRefreshRate = int.Parse(selected);
if (ExternalHelpers.DisplayConfig.IsInternalConnected == true)
{
2023-02-09 11:42:50 +01:00
var currentResolution = DisplayResolutionController.GetResolution()?.Normalize();
2023-02-08 23:41:08 +01:00
if (currentResolution == null)
return null;
2023-02-09 11:42:50 +01:00
bool result = ModeTiming.AddTiming(new Helpers.AMD.ADLDisplayModeX2()
2023-02-08 23:41:08 +01:00
{
PelsWidth = currentResolution.Value.Width,
PelsHeight = currentResolution.Value.Height,
RefreshRate = selectedRefreshRate,
2023-02-09 11:42:50 +01:00
TimingStandard = Helpers.AMD.ADL.ADL_DL_MODETIMING_STANDARD_CUSTOM,
2023-02-08 23:41:08 +01:00
});
2023-02-09 11:42:50 +01:00
if (result)
Thread.Sleep(500);
2023-02-09 09:29:06 +01:00
}
2023-02-09 11:42:50 +01:00
DisplayResolutionController.SetRefreshRate(selectedRefreshRate);
return DisplayResolutionController.GetRefreshRate().ToString();
},
Impacts =
{
FPSLimit.Instance
}
};
}
}