From 411203902beea55e743250eae609fc2c1da9cd77 Mon Sep 17 00:00:00 2001 From: Rem0o Date: Thu, 11 Feb 2021 05:17:36 -0500 Subject: [PATCH] ADL Overdrive 6 support and integration (#386) --- .../Hardware/Gpu/AmdGpu.cs | 50 +++++++++++++++---- LibreHardwareMonitorLib/Interop/AtiAdlxx.cs | 24 ++++++++- 2 files changed, 64 insertions(+), 10 deletions(-) diff --git a/LibreHardwareMonitorLib/Hardware/Gpu/AmdGpu.cs b/LibreHardwareMonitorLib/Hardware/Gpu/AmdGpu.cs index f81e5ae..1a11a23 100644 --- a/LibreHardwareMonitorLib/Hardware/Gpu/AmdGpu.cs +++ b/LibreHardwareMonitorLib/Hardware/Gpu/AmdGpu.cs @@ -121,14 +121,27 @@ namespace LibreHardwareMonitor.Hardware.Gpu { if (control.ControlMode == ControlMode.Software) { - AtiAdlxx.ADLFanSpeedValue fanSpeedValue = new AtiAdlxx.ADLFanSpeedValue + if (_currentOverdriveApiLevel >= 6) { - SpeedType = AtiAdlxx.ADL_DL_FANCTRL_SPEED_TYPE_PERCENT, - Flags = AtiAdlxx.ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED, - FanSpeed = (int)control.SoftwareValue - }; + AtiAdlxx.ADLOD6FanSpeedValue fanSpeedValue = new AtiAdlxx.ADLOD6FanSpeedValue + { + SpeedType = AtiAdlxx.ADL_DL_FANCTRL_SPEED_TYPE_PERCENT, + FanSpeed = (int)control.SoftwareValue + }; - AtiAdlxx.ADL_Overdrive5_FanSpeed_Set(_adapterIndex, 0, ref fanSpeedValue); + AtiAdlxx.ADL_Overdrive6_FanSpeed_Set(_adapterIndex, ref fanSpeedValue); + } + else + { + AtiAdlxx.ADLFanSpeedValue fanSpeedValue = new AtiAdlxx.ADLFanSpeedValue + { + SpeedType = AtiAdlxx.ADL_DL_FANCTRL_SPEED_TYPE_PERCENT, + Flags = AtiAdlxx.ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED, + FanSpeed = (int)control.SoftwareValue + }; + + AtiAdlxx.ADL_Overdrive5_FanSpeed_Set(_adapterIndex, 0, ref fanSpeedValue); + } } } @@ -154,7 +167,14 @@ namespace LibreHardwareMonitor.Hardware.Gpu /// private void SetDefaultFanSpeed() { - AtiAdlxx.ADL_Overdrive5_FanSpeedToDefault_Set(_adapterIndex, 0); + if (_currentOverdriveApiLevel >= 6) + { + AtiAdlxx.ADL_Overdrive6_FanSpeed_Reset(_adapterIndex); + } + else + { + AtiAdlxx.ADL_Overdrive5_FanSpeedToDefault_Set(_adapterIndex, 0); + } } public override void Update() @@ -194,22 +214,34 @@ namespace LibreHardwareMonitor.Hardware.Gpu } AtiAdlxx.ADLFanSpeedValue fanSpeedValue = new AtiAdlxx.ADLFanSpeedValue { SpeedType = AtiAdlxx.ADL_DL_FANCTRL_SPEED_TYPE_RPM }; - if (AtiAdlxx.ADL_Overdrive5_FanSpeed_Get(_adapterIndex, 0, ref fanSpeedValue) == AtiAdlxx.ADLStatus.ADL_OK) + AtiAdlxx.ADLOD6FanSpeedValue fanSpeed6Value = new AtiAdlxx.ADLOD6FanSpeedValue { SpeedType = AtiAdlxx.ADL_DL_FANCTRL_SPEED_TYPE_RPM }; + if (_currentOverdriveApiLevel <= 5 && AtiAdlxx.ADL_Overdrive5_FanSpeed_Get(_adapterIndex, 0, ref fanSpeedValue) == AtiAdlxx.ADLStatus.ADL_OK) { _fan.Value = fanSpeedValue.FanSpeed; ActivateSensor(_fan); } + else if (_currentOverdriveApiLevel >= 6 && AtiAdlxx.ADL_Overdrive6_FanSpeed_Get(_adapterIndex, ref fanSpeed6Value) == AtiAdlxx.ADLStatus.ADL_OK) + { + _fan.Value = fanSpeed6Value.FanSpeed; + ActivateSensor(_fan); + } else { _fan.Value = null; } fanSpeedValue = new AtiAdlxx.ADLFanSpeedValue { SpeedType = AtiAdlxx.ADL_DL_FANCTRL_SPEED_TYPE_PERCENT }; - if (AtiAdlxx.ADL_Overdrive5_FanSpeed_Get(_adapterIndex, 0, ref fanSpeedValue) == AtiAdlxx.ADLStatus.ADL_OK) + fanSpeed6Value = new AtiAdlxx.ADLOD6FanSpeedValue { SpeedType = AtiAdlxx.ADL_DL_FANCTRL_SPEED_TYPE_PERCENT }; + if (_currentOverdriveApiLevel <= 5 && AtiAdlxx.ADL_Overdrive5_FanSpeed_Get(_adapterIndex, 0, ref fanSpeedValue) == AtiAdlxx.ADLStatus.ADL_OK) { _controlSensor.Value = fanSpeedValue.FanSpeed; ActivateSensor(_controlSensor); } + else if (_currentOverdriveApiLevel >= 6 && AtiAdlxx.ADL_Overdrive6_FanSpeed_Get(_adapterIndex, ref fanSpeed6Value) == AtiAdlxx.ADLStatus.ADL_OK) + { + _controlSensor.Value = fanSpeed6Value.FanSpeed; + ActivateSensor(_controlSensor); + } else { _controlSensor.Value = null; diff --git a/LibreHardwareMonitorLib/Interop/AtiAdlxx.cs b/LibreHardwareMonitorLib/Interop/AtiAdlxx.cs index ebef520..90437a9 100644 --- a/LibreHardwareMonitorLib/Interop/AtiAdlxx.cs +++ b/LibreHardwareMonitorLib/Interop/AtiAdlxx.cs @@ -96,6 +96,15 @@ namespace LibreHardwareMonitor.Interop [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)] public static extern ADLStatus ADL_Overdrive5_FanSpeed_Set(int adapterIndex, int thermalControllerIndex, ref ADLFanSpeedValue fanSpeedValue); + [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)] + public static extern ADLStatus ADL_Overdrive6_FanSpeed_Get(int adapterIndex, ref ADLOD6FanSpeedValue FanSpeedValue); + + [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)] + public static extern ADLStatus ADL_Overdrive6_FanSpeed_Set(int adapterIndex, ref ADLOD6FanSpeedValue FanSpeedValue); + + [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)] + public static extern ADLStatus ADL_Overdrive6_FanSpeed_Reset(int adapterIndex); + [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)] public static extern ADLStatus ADL2_OverdriveN_PerformanceStatus_Get(IntPtr context, int adapterIndex, out ADLODNPerformanceStatus performanceStatus); @@ -355,7 +364,20 @@ namespace LibreHardwareMonitor.Interop public int FanSpeed; public int Flags; } - + + [StructLayout(LayoutKind.Sequential)] + internal struct ADLOD6FanSpeedValue + { + /// Indicates the units of the fan speed. Possible values: \ref ADL_OD6_FANSPEED_TYPE_PERCENT, \ref ADL_OD6_FANSPEED_TYPE_RPM + public int SpeedType; + /// Fan speed value (units as indicated above) + public int FanSpeed; + /// Value for future extension + public int ExtValue; + /// Mask for future extension + public int ExtMask; + } + [StructLayout(LayoutKind.Sequential)] internal struct ADLFanSpeedInfo {