diff --git a/PowerControl/Helpers/AMD/ADL.cs b/PowerControl/Helpers/AMD/ADL.cs index e4b0167..8f2b8a0 100644 --- a/PowerControl/Helpers/AMD/ADL.cs +++ b/PowerControl/Helpers/AMD/ADL.cs @@ -92,7 +92,6 @@ namespace PowerControl.Helpers.AMD } #endregion ADLAdapterInfo - #region ADLDisplayInfo /// ADLDisplayID Structure [StructLayout(LayoutKind.Sequential)] @@ -144,6 +143,25 @@ namespace PowerControl.Helpers.AMD } #endregion ADLDisplayInfo + #region Radeon Image Sharpening + [StructLayout(LayoutKind.Sequential)] + internal struct ADL_RIS_SETTINGS + { + internal int GlobalEnable; //Global enable value + internal int GlobalSharpeningDegree; //Global sharpening value + internal int GlobalSharpeningDegree_MinLimit; //Gloabl sharpening slider min limit value + internal int GlobalSharpeningDegree_MaxLimit; //Gloabl sharpening slider max limit value + internal int GlobalSharpeningDegree_Step; //Gloabl sharpening step value + }; + + [StructLayout(LayoutKind.Sequential)] + internal struct ADL_RIS_NOTFICATION_REASON + { + internal int GlobalEnableChanged; //Set when Global enable value is changed + internal int GlobalSharpeningDegreeChanged; //Set when Global sharpening Degree value is changed + }; + #endregion ADLDisplayInfo + #endregion Export Struct #region ADL Class @@ -195,22 +213,22 @@ namespace PowerControl.Helpers.AMD #region DLLImport [DllImport(Kernel32_FileName)] - internal static extern HMODULE GetModuleHandle (string moduleName); + internal static extern HMODULE GetModuleHandle(string moduleName); [DllImport(Atiadlxx_FileName)] internal static extern int ADL2_Main_Control_Create(ADL_Main_Memory_Alloc callback, int enumConnectedAdapters, out IntPtr context); [DllImport(Atiadlxx_FileName)] - internal static extern int ADL2_Main_Control_Destroy (IntPtr context); + internal static extern int ADL2_Main_Control_Destroy(IntPtr context); [DllImport(Atiadlxx_FileName)] - internal static extern int ADL2_Main_Control_IsFunctionValid (IntPtr context, HMODULE module, string procName); + internal static extern int ADL2_Main_Control_IsFunctionValid(IntPtr context, HMODULE module, string procName); [DllImport(Atiadlxx_FileName)] - internal static extern int ADL2_Adapter_NumberOfAdapters_Get (IntPtr context, out int numAdapters); + internal static extern int ADL2_Adapter_NumberOfAdapters_Get(IntPtr context, out int numAdapters); [DllImport(Atiadlxx_FileName)] - internal static extern int ADL2_Adapter_AdapterInfo_Get (IntPtr context, out ADLAdapterInfoArray info, int inputSize); + internal static extern int ADL2_Adapter_AdapterInfo_Get(IntPtr context, out ADLAdapterInfoArray info, int inputSize); [DllImport(Atiadlxx_FileName)] internal static extern int ADL2_Adapter_Active_Get(IntPtr context, int adapterIndex, out int status); @@ -241,6 +259,12 @@ namespace PowerControl.Helpers.AMD [DllImport(Atiadlxx_FileName)] internal static extern int ADL2_Display_SCE_State_Set(IntPtr context, int adapterIndex, int displayIndex, int current); + + [DllImport(Atiadlxx_FileName)] + internal static extern int ADL2_RIS_Settings_Get(IntPtr context, int adapterIndex, out ADL_RIS_SETTINGS settings); + + [DllImport(Atiadlxx_FileName)] + internal static extern int ADL2_RIS_Settings_Set(IntPtr context, int adapterIndex, ADL_RIS_SETTINGS settings, ADL_RIS_NOTFICATION_REASON reason); #endregion DLLImport #region ADL_Main_Memory_Alloc diff --git a/PowerControl/Helpers/AMD/ImageSharpening.cs b/PowerControl/Helpers/AMD/ImageSharpening.cs new file mode 100644 index 0000000..f6882fb --- /dev/null +++ b/PowerControl/Helpers/AMD/ImageSharpening.cs @@ -0,0 +1,62 @@ +using Microsoft.Win32; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PowerControl.Helpers.AMD +{ + internal class ImageSharpening + { + internal static bool? Enabled + { + get + { + return GetSettings(out var settings) ? settings.GlobalEnable != 0 : null; + } + set + { + if (!GetSettings(out var settings)) + return; + + var enabled = value.GetValueOrDefault(false) ? 1 : 0; + if (settings.GlobalEnable == enabled) + return; + + settings.GlobalEnable = enabled; + SetSettings(settings, new ADL_RIS_NOTFICATION_REASON() { GlobalEnableChanged = 1 }); + } + } + + private static bool GetSettings(out ADL_RIS_SETTINGS settings) + { + ADL_RIS_SETTINGS settings2 = default; + + var result = ADLContext.WithSafe((context) => + { + int res = ADL.ADL2_RIS_Settings_Get( + context.Context, + ADL.ADL_DEFAULT_ADAPTER, + out settings2); + return res == 0; + }); + + settings = settings2; + return result; + } + + private static bool SetSettings(ADL_RIS_SETTINGS settings, ADL_RIS_NOTFICATION_REASON reason) + { + return ADLContext.WithSafe((context) => + { + int res = ADL.ADL2_RIS_Settings_Set( + context.Context, + ADL.ADL_DEFAULT_ADAPTER, + settings, reason); + return res == 0; + }); + } + } +} diff --git a/PowerControl/MenuStack.cs b/PowerControl/MenuStack.cs index 4acd8ba..cfd8781 100644 --- a/PowerControl/MenuStack.cs +++ b/PowerControl/MenuStack.cs @@ -191,6 +191,28 @@ namespace PowerControl } }, new Menu.MenuItemWithOptions() + { + Name = "Sharpening", + ApplyDelay = 500, + Options = { "Off", "On" }, + CurrentValue = delegate() + { + var value = ImageSharpening.Enabled; + if (value is null) + return null; + return value.Value ? "On" : "Off"; + }, + ApplyValue = delegate(object selected) + { + ImageSharpening.Enabled = (string)selected == "On"; + + var value = ImageSharpening.Enabled; + if (value is null) + return null; + return value.Value ? "On" : "Off"; + } + }, + new Menu.MenuItemWithOptions() { Name = "Colors", ApplyDelay = 1000, diff --git a/RELEASE.md b/RELEASE.md index 933bbc9..870607b 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -7,6 +7,7 @@ - Reset `LibreHardware` on system resume to fix battery bug - Reset FPS limit if anything related to resolution changes - Retry Vangogh GPU detection 3 times +- Add `Radeon Image Sharpening` option (Yes, or No) ## 0.3.x