diff --git a/Hardware/ATI/ADL.cs b/Hardware/ATI/ADL.cs index e13912d..8c36839 100644 --- a/Hardware/ATI/ADL.cs +++ b/Hardware/ATI/ADL.cs @@ -77,6 +77,19 @@ namespace OpenHardwareMonitor.Hardware.ATI { public int MaxRPM; } + [StructLayout(LayoutKind.Sequential)] + internal struct ADLSingleSensorData { + public bool Supported; + public int Value; + } + + [StructLayout(LayoutKind.Sequential)] + internal struct ADLPMLogDataOutput { + public int Size; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = ADL.ADL_PMLOG_MAX_SENSORS)] + public ADLSingleSensorData[] Sensors; + } + internal enum ADLODNCurrentPowerType { TOTAL_POWER = 0, PPT_POWER, @@ -94,6 +107,48 @@ namespace OpenHardwareMonitor.Hardware.ATI { HOTSPOT = 7, } + internal enum ADLSensorType { + CLK_GFXCLK = 1, + CLK_MEMCLK = 2, + CLK_SOCCLK = 3, + CLK_UVDCLK1 = 4, + CLK_UVDCLK2 = 5, + CLK_VCECLK = 6, + CLK_VCNCLK = 7, + TEMPERATURE_EDGE = 8, + TEMPERATURE_MEM = 9, + TEMPERATURE_VRVDDC = 10, + TEMPERATURE_VRMVDD = 11, + TEMPERATURE_LIQUID = 12, + TEMPERATURE_PLX = 13, + FAN_RPM = 14, + FAN_PERCENTAGE = 15, + SOC_VOLTAGE = 16, + SOC_POWER = 17, + SOC_CURRENT = 18, + INFO_ACTIVITY_GFX = 19, + INFO_ACTIVITY_MEM = 20, + GFX_VOLTAGE = 21, + MEM_VOLTAGE = 22, + ASIC_POWER = 23, + TEMPERATURE_VRSOC = 24, + TEMPERATURE_VRMVDD0 = 25, + TEMPERATURE_VRMVDD1 = 26, + TEMPERATURE_HOTSPOT = 27, + TEMPERATURE_GFX = 28, + TEMPERATURE_SOC = 29, + GFX_POWER = 30, + GFX_CURRENT = 31, + TEMPERATURE_CPU = 32, + CPU_POWER = 33, + CLK_CPUCLK = 34, + THROTTLER_STATUS = 35, + CLK_VCN1CLK1 = 36, + CLK_VCN1CLK2 = 37, + SMART_POWERSHIFT_CPU = 38, + SMART_POWERSHIFT_DGPU = 39 + } + internal class ADL { public const int ADL_MAX_PATH = 256; public const int ADL_MAX_ADAPTERS = 40; @@ -105,6 +160,7 @@ namespace OpenHardwareMonitor.Hardware.ATI { public const int ADL_MAX_GLSYNC_PORTS = 8; public const int ADL_MAX_GLSYNC_PORT_LEDS = 8; public const int ADL_MAX_NUM_DISPLAYMODES = 1024; + public const int ADL_PMLOG_MAX_SENSORS = 256; public const int ADL_DL_FANCTRL_SPEED_TYPE_PERCENT = 1; public const int ADL_DL_FANCTRL_SPEED_TYPE_RPM = 2; @@ -156,6 +212,8 @@ namespace OpenHardwareMonitor.Hardware.ATI { public delegate int ADL2_Overdrive6_CurrentPower_GetDelegate(IntPtr context, int adapterIndex, ADLODNCurrentPowerType powerType, out int currentValue); + public delegate int ADL2_New_QueryPMLogData_GetDelegate(IntPtr context, + int adapterIndex, out ADLPMLogDataOutput dataOutput); private static ADL_Main_Control_CreateDelegate _ADL_Main_Control_Create; @@ -194,6 +252,8 @@ namespace OpenHardwareMonitor.Hardware.ATI { ADL2_OverdriveN_Temperature_Get; public static ADL2_Overdrive6_CurrentPower_GetDelegate ADL2_Overdrive6_CurrentPower_Get; + public static ADL2_New_QueryPMLogData_GetDelegate + ADL2_New_QueryPMLogData_Get; private static string dllName; @@ -250,6 +310,8 @@ namespace OpenHardwareMonitor.Hardware.ATI { out ADL2_OverdriveN_Temperature_Get); GetDelegate("ADL2_Overdrive6_CurrentPower_Get", out ADL2_Overdrive6_CurrentPower_Get); + GetDelegate("ADL2_New_QueryPMLogData_Get", + out ADL2_New_QueryPMLogData_Get); } static ADL() { diff --git a/Hardware/ATI/ATIGPU.cs b/Hardware/ATI/ATIGPU.cs index 5cd6b00..375795e 100644 --- a/Hardware/ATI/ATIGPU.cs +++ b/Hardware/ATI/ATIGPU.cs @@ -33,6 +33,7 @@ namespace OpenHardwareMonitor.Hardware.ATI { private readonly Sensor coreClock; private readonly Sensor memoryClock; private readonly Sensor coreVoltage; + private readonly Sensor memoryVoltage; private readonly Sensor coreLoad; private readonly Sensor controlSensor; private readonly Control fanControl; @@ -76,12 +77,12 @@ namespace OpenHardwareMonitor.Hardware.ATI { this.powerCore = new Sensor("GPU Core", 1, SensorType.Power, this, settings); this.powerPpt = new Sensor("GPU PPT", 2, SensorType.Power, this, settings); this.powerSocket = new Sensor("GPU Socket", 3, SensorType.Power, this, settings); - this.fan = new Sensor("GPU Fan", 0, SensorType.Fan, this, settings); this.coreClock = new Sensor("GPU Core", 0, SensorType.Clock, this, settings); this.memoryClock = new Sensor("GPU Memory", 1, SensorType.Clock, this, settings); this.coreVoltage = new Sensor("GPU Core", 0, SensorType.Voltage, this, settings); + this.memoryVoltage = new Sensor("GPU Memory", 1, SensorType.Voltage, this, settings); this.coreLoad = new Sensor("GPU Core", 0, SensorType.Load, this, settings); this.controlSensor = new Sensor("GPU Fan", 0, SensorType.Control, this, settings); @@ -191,92 +192,182 @@ namespace OpenHardwareMonitor.Hardware.ATI { r.AppendLine(enabled.ToString(CultureInfo.InvariantCulture)); r.Append(" Version: "); r.AppendLine(version.ToString(CultureInfo.InvariantCulture)); - r.AppendLine(); + if (context != IntPtr.Zero && overdriveVersion >= 6) { + r.AppendLine("Overdrive6 CurrentPower:"); + r.AppendLine(); + for (int i = 0; i < 4; i++) { + var pt = ((ADLODNCurrentPowerType)i).ToString(); + var ps = ADL.ADL2_Overdrive6_CurrentPower_Get( + context, adapterIndex, (ADLODNCurrentPowerType)i, + out int power); + if (ps == ADL.ADL_OK) { + r.AppendFormat(" Power[{0}].Value: {1}{2}", pt, + power * (1.0f / 0xFF), Environment.NewLine); + } else { + r.AppendFormat(" Power[{0}].Status: {1}{2}", pt, + ps, Environment.NewLine); + } + } + r.AppendLine(); + } + + if (context != IntPtr.Zero && overdriveVersion >= 7) { + r.AppendLine("OverdriveN Temperature:"); + r.AppendLine(); + for (int i = 1; i < 8; i++) { + var tt = ((ADLODNTemperatureType)i).ToString(); + var ts = ADL.ADL2_OverdriveN_Temperature_Get( + context, adapterIndex, (ADLODNTemperatureType)i, + out int temperature); + if (ts == ADL.ADL_OK) { + r.AppendFormat(" Temperature[{0}].Value: {1}{2}", tt, + 0.001f * temperature, Environment.NewLine); + } else { + r.AppendFormat(" Temperature[{0}].Status: {1}{2}", tt, + ts, Environment.NewLine); + } + } + r.AppendLine(); + } + + if (context != IntPtr.Zero && overdriveVersion >= 8) { + r.AppendLine("Performance Metrics:"); + r.AppendLine(); + var ps = ADL.ADL2_New_QueryPMLogData_Get(context, adapterIndex, + out var data); + + if (ps == ADL.ADL_OK) { + r.Append(" Size: "); + r.AppendLine(data.Size.ToString(CultureInfo.InvariantCulture)); + for (int i = 0; i < data.Size; i++) { + var st = ((ADLSensorType)i).ToString(); + r.AppendFormat(" Sensor[{0}].Supported: {1}{2}", st, + data.Sensors[i].Supported, Environment.NewLine); + r.AppendFormat(" Sensor[{0}].Value: {1}{2}", st, + data.Sensors[i].Value, Environment.NewLine); + } + } else { + r.Append(" Status: "); + r.AppendLine(ps.ToString(CultureInfo.InvariantCulture)); + } + r.AppendLine(); + } + return r.ToString(); } + private void GetPMLog(ADLPMLogDataOutput data, + ADLSensorType sensorType, Sensor sensor, float factor = 1.0f) + { + int i = (int)sensorType; + if (i < data.Size && data.Sensors[i].Supported) { + sensor.Value = data.Sensors[i].Value * factor; + ActivateSensor(sensor); + } + } + public override void Update() { - if (context != IntPtr.Zero && overdriveVersion >= 7) { - GetODNTemperature(ADLODNTemperatureType.CORE, temperatureCore); - GetODNTemperature(ADLODNTemperatureType.MEMORY, temperatureMemory); - GetODNTemperature(ADLODNTemperatureType.VRM_CORE, temperatureVrmCore); - GetODNTemperature(ADLODNTemperatureType.VRM_MEMORY, temperatureVrmMemory); - GetODNTemperature(ADLODNTemperatureType.LIQUID, temperatureLiquid); - GetODNTemperature(ADLODNTemperatureType.PLX, temperaturePlx); - GetODNTemperature(ADLODNTemperatureType.HOTSPOT, temperatureHotSpot); + if (context != IntPtr.Zero && overdriveVersion >= 8 && + ADL.ADL2_New_QueryPMLogData_Get(context, adapterIndex, + out var data) == ADL.ADL_OK) + { + GetPMLog(data, ADLSensorType.TEMPERATURE_EDGE, temperatureCore); + GetPMLog(data, ADLSensorType.TEMPERATURE_MEM, temperatureMemory); + GetPMLog(data, ADLSensorType.TEMPERATURE_VRVDDC, temperatureVrmCore); + GetPMLog(data, ADLSensorType.TEMPERATURE_VRMVDD, temperatureVrmMemory); + GetPMLog(data, ADLSensorType.TEMPERATURE_LIQUID, temperatureLiquid); + GetPMLog(data, ADLSensorType.TEMPERATURE_PLX, temperaturePlx); + GetPMLog(data, ADLSensorType.TEMPERATURE_HOTSPOT, temperatureHotSpot); + GetPMLog(data, ADLSensorType.GFX_POWER, powerCore); + GetPMLog(data, ADLSensorType.ASIC_POWER, powerTotal); + GetPMLog(data, ADLSensorType.FAN_RPM, fan); + GetPMLog(data, ADLSensorType.CLK_GFXCLK, coreClock); + GetPMLog(data, ADLSensorType.CLK_MEMCLK, memoryClock); + GetPMLog(data, ADLSensorType.GFX_VOLTAGE, coreVoltage, 0.001f); + GetPMLog(data, ADLSensorType.MEM_VOLTAGE, memoryVoltage, 0.001f); + GetPMLog(data, ADLSensorType.INFO_ACTIVITY_GFX, coreLoad); + GetPMLog(data, ADLSensorType.FAN_PERCENTAGE, controlSensor); } else { - ADLTemperature adlt = new ADLTemperature(); - if (ADL.ADL_Overdrive5_Temperature_Get(adapterIndex, 0, ref adlt) - == ADL.ADL_OK) { - temperatureCore.Value = 0.001f * adlt.Temperature; - ActivateSensor(temperatureCore); + if (context != IntPtr.Zero && overdriveVersion >= 7) { + GetODNTemperature(ADLODNTemperatureType.CORE, temperatureCore); + GetODNTemperature(ADLODNTemperatureType.MEMORY, temperatureMemory); + GetODNTemperature(ADLODNTemperatureType.VRM_CORE, temperatureVrmCore); + GetODNTemperature(ADLODNTemperatureType.VRM_MEMORY, temperatureVrmMemory); + GetODNTemperature(ADLODNTemperatureType.LIQUID, temperatureLiquid); + GetODNTemperature(ADLODNTemperatureType.PLX, temperaturePlx); + GetODNTemperature(ADLODNTemperatureType.HOTSPOT, temperatureHotSpot); } else { - temperatureCore.Value = null; + ADLTemperature adlt = new ADLTemperature(); + if (ADL.ADL_Overdrive5_Temperature_Get(adapterIndex, 0, ref adlt) + == ADL.ADL_OK) { + temperatureCore.Value = 0.001f * adlt.Temperature; + ActivateSensor(temperatureCore); + } else { + temperatureCore.Value = null; + } } - } - if (context != IntPtr.Zero && overdriveVersion >= 6) { - GetOD6Power(ADLODNCurrentPowerType.TOTAL_POWER, powerTotal); - GetOD6Power(ADLODNCurrentPowerType.CHIP_POWER, powerCore); - GetOD6Power(ADLODNCurrentPowerType.PPT_POWER, powerPpt); - GetOD6Power(ADLODNCurrentPowerType.SOCKET_POWER, powerSocket); - } - - ADLFanSpeedValue adlf = new ADLFanSpeedValue(); - adlf.SpeedType = ADL.ADL_DL_FANCTRL_SPEED_TYPE_RPM; - if (ADL.ADL_Overdrive5_FanSpeed_Get(adapterIndex, 0, ref adlf) - == ADL.ADL_OK) - { - fan.Value = adlf.FanSpeed; - ActivateSensor(fan); - } else { - fan.Value = null; - } + if (context != IntPtr.Zero && overdriveVersion >= 6) { + GetOD6Power(ADLODNCurrentPowerType.TOTAL_POWER, powerTotal); + GetOD6Power(ADLODNCurrentPowerType.CHIP_POWER, powerCore); + GetOD6Power(ADLODNCurrentPowerType.PPT_POWER, powerPpt); + GetOD6Power(ADLODNCurrentPowerType.SOCKET_POWER, powerSocket); + } - adlf = new ADLFanSpeedValue(); - adlf.SpeedType = ADL.ADL_DL_FANCTRL_SPEED_TYPE_PERCENT; - if (ADL.ADL_Overdrive5_FanSpeed_Get(adapterIndex, 0, ref adlf) - == ADL.ADL_OK) { - controlSensor.Value = adlf.FanSpeed; - ActivateSensor(controlSensor); - } else { - controlSensor.Value = null; - } + ADLFanSpeedValue adlf = new ADLFanSpeedValue(); + adlf.SpeedType = ADL.ADL_DL_FANCTRL_SPEED_TYPE_RPM; + if (ADL.ADL_Overdrive5_FanSpeed_Get(adapterIndex, 0, ref adlf) + == ADL.ADL_OK) { + fan.Value = adlf.FanSpeed; + ActivateSensor(fan); + } else { + fan.Value = null; + } - ADLPMActivity adlp = new ADLPMActivity(); - if (ADL.ADL_Overdrive5_CurrentActivity_Get(adapterIndex, ref adlp) - == ADL.ADL_OK) - { - if (adlp.EngineClock > 0) { - coreClock.Value = 0.01f * adlp.EngineClock; - ActivateSensor(coreClock); + adlf = new ADLFanSpeedValue(); + adlf.SpeedType = ADL.ADL_DL_FANCTRL_SPEED_TYPE_PERCENT; + if (ADL.ADL_Overdrive5_FanSpeed_Get(adapterIndex, 0, ref adlf) + == ADL.ADL_OK) { + controlSensor.Value = adlf.FanSpeed; + ActivateSensor(controlSensor); + } else { + controlSensor.Value = null; + } + + ADLPMActivity adlp = new ADLPMActivity(); + if (ADL.ADL_Overdrive5_CurrentActivity_Get(adapterIndex, ref adlp) + == ADL.ADL_OK) { + if (adlp.EngineClock > 0) { + coreClock.Value = 0.01f * adlp.EngineClock; + ActivateSensor(coreClock); + } else { + coreClock.Value = null; + } + + if (adlp.MemoryClock > 0) { + memoryClock.Value = 0.01f * adlp.MemoryClock; + ActivateSensor(memoryClock); + } else { + memoryClock.Value = null; + } + + if (adlp.Vddc > 0) { + coreVoltage.Value = 0.001f * adlp.Vddc; + ActivateSensor(coreVoltage); + } else { + coreVoltage.Value = null; + } + + coreLoad.Value = Math.Min(adlp.ActivityPercent, 100); + ActivateSensor(coreLoad); } else { coreClock.Value = null; - } - - if (adlp.MemoryClock > 0) { - memoryClock.Value = 0.01f * adlp.MemoryClock; - ActivateSensor(memoryClock); - } else { memoryClock.Value = null; - } - - if (adlp.Vddc > 0) { - coreVoltage.Value = 0.001f * adlp.Vddc; - ActivateSensor(coreVoltage); - } else { coreVoltage.Value = null; + coreLoad.Value = null; } - - coreLoad.Value = Math.Min(adlp.ActivityPercent, 100); - ActivateSensor(coreLoad); - } else { - coreClock.Value = null; - memoryClock.Value = null; - coreVoltage.Value = null; - coreLoad.Value = null; } } diff --git a/Properties/AssemblyVersion.cs b/Properties/AssemblyVersion.cs index 5265d1f..209ffc3 100644 --- a/Properties/AssemblyVersion.cs +++ b/Properties/AssemblyVersion.cs @@ -10,5 +10,5 @@ using System.Reflection; -[assembly: AssemblyVersion("0.9.1.0")] -[assembly: AssemblyInformationalVersion("0.9.1.0")] \ No newline at end of file +[assembly: AssemblyVersion("0.9.1.1")] +[assembly: AssemblyInformationalVersion("0.9.1.1 Alpha")] \ No newline at end of file