This commit is contained in:
Kamil Trzciński 2023-02-09 00:24:32 +01:00
parent bbd912eeeb
commit 4899325fa4
5 changed files with 51 additions and 13 deletions

View file

@ -90,6 +90,15 @@ namespace PowerControl.Helpers.AMD
[MarshalAs(UnmanagedType.ByValArray, SizeConst = (int)ADL.ADL_MAX_ADAPTERS)]
internal ADLAdapterInfo[] ADLAdapterInfo;
}
/// <summary> ADLAdapterInfo Array</summary>
[StructLayout(LayoutKind.Sequential)]
internal struct ADLDisplayModeInfoArray
{
/// <summary> ADLAdapterInfo Array </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = (int)ADL.ADL_MAX_OVERRIDES)]
internal ADLDisplayModeInfo[] ADLDisplayModeInfo;
}
#endregion ADLAdapterInfo
#region ADLDisplayInfo
@ -164,8 +173,8 @@ namespace PowerControl.Helpers.AMD
[StructLayout(LayoutKind.Sequential)]
internal struct ADLDisplayModeX2
{
internal int PelsHeight;
internal int PelsWidth;
internal int PelsHeight;
internal int ScanType;
internal int RefreshRate;
internal int TimingStandard;
@ -240,6 +249,7 @@ namespace PowerControl.Helpers.AMD
internal const int ADL_MAX_DISPLAYS = 40 /* 150 */;
/// <summary> Define the maximum device name length</summary>
internal const int ADL_MAX_DEVICENAME = 32;
internal const int ADL_MAX_OVERRIDES = 120;
/// <summary> Define the successful</summary>
internal const int ADL_SUCCESS = 0;
/// <summary> Define the failure</summary>
@ -347,6 +357,9 @@ namespace PowerControl.Helpers.AMD
[DllImport(Atiadlxx_FileName)]
internal static extern int ADL2_Display_ModeTimingOverride_Set(IntPtr context, int adapterIndex, int displayIndex, ref ADLDisplayModeInfo lpMode, int iForceUpdate);
[DllImport(Atiadlxx_FileName)]
internal static extern int ADL2_Display_ModeTimingOverrideList_Get(IntPtr context, int adapterIndex, int displayIndex, int maxOverrides, out ADLDisplayModeInfoArray modes, out int modesCount);
#endregion DLLImport
#region ADL_Main_Memory_Alloc

View file

@ -6,7 +6,34 @@ namespace PowerControl.Helpers.AMD
{
internal static bool AddAndSetTiming(ADLDisplayModeX2 displayMode)
{
return AddTiming(displayMode) && SetTiming(displayMode);
RemoveTiming(displayMode);
return AddTiming(displayMode);
}
internal static IEnumerable<ADLDisplayModeInfo>? GetAllModes()
{
return Helpers.AMD.ADLContext.WithSafe((context) =>
{
int res = ADL.ADL2_Display_ModeTimingOverrideList_Get(context.Context,
Helpers.AMD.ADL.ADL_DEFAULT_ADAPTER, 0,
ADL.ADL_MAX_OVERRIDES, out var modes, out var modesCount);
if (res != 0)
return null;
return modes.ADLDisplayModeInfo.Take(modesCount);
});
}
internal static bool ReplaceTiming(ADLDisplayModeX2 displayMode)
{
RemoveTiming(displayMode);
return AddTiming(displayMode);
}
internal static bool RemoveTiming(ADLDisplayModeX2 displayMode)
{
displayMode.TimingStandard = Helpers.AMD.ADL.ADL_DL_MODETIMING_STANDARD_DRIVER_DEFAULT;
return AddTiming(displayMode);
}
internal static bool AddTiming(ADLDisplayModeX2 displayMode)

View file

@ -158,7 +158,7 @@ namespace PowerControl.Helpers
DEVMODE? best = FindAllDisplaySettings()
.Where((dm) => dm.dmPelsWidth == current.Value.dmPelsWidth && dm.dmPelsHeight == current.Value.dmPelsHeight)
.Where((dm) => dm.dmDisplayFrequency == hz)
.First();
.FirstOrDefault();
if (best is null)
return false;

View file

@ -34,7 +34,9 @@ namespace PowerControl.Options
if (currentResolution == null)
return null;
ModeTiming.AddAndSetTiming(new Helpers.AMD.ADLDisplayModeX2()
var modes = ModeTiming.GetAllModes();
ModeTiming.ReplaceTiming(new Helpers.AMD.ADLDisplayModeX2()
{
PelsWidth = currentResolution.Value.Width,
PelsHeight = currentResolution.Value.Height,
@ -42,10 +44,8 @@ namespace PowerControl.Options
TimingStandard = Helpers.AMD.ADL.ADL_DL_MODETIMING_STANDARD_CVT,
});
}
else
{
DisplayResolutionController.SetRefreshRate(selectedRefreshRate);
}
DisplayResolutionController.SetRefreshRate(selectedRefreshRate);
return DisplayResolutionController.GetRefreshRate().ToString();
},

View file

@ -35,7 +35,7 @@ namespace PowerControl.Options
if (ExternalHelpers.DisplayConfig.IsInternalConnected == true)
{
ModeTiming.AddTiming(new Helpers.AMD.ADLDisplayModeX2()
ModeTiming.ReplaceTiming(new Helpers.AMD.ADLDisplayModeX2()
{
PelsWidth = selectedResolution.Width,
PelsHeight = selectedResolution.Height,
@ -43,10 +43,8 @@ namespace PowerControl.Options
TimingStandard = Helpers.AMD.ADL.ADL_DL_MODETIMING_STANDARD_CVT,
});
}
else
{
DisplayResolutionController.SetResolution(selectedResolution);
}
DisplayResolutionController.SetResolution(selectedResolution);
return DisplayResolutionController.GetResolution().ToString();
},