mirror of
https://github.com/openhardwaremonitor/openhardwaremonitor
synced 2025-08-22 01:47:36 +00:00
Added support for ADL (AMD Display Library) Overdrive8 GPU sensors.
This commit is contained in:
parent
e3919ece28
commit
9b55e1f66d
@ -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() {
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -10,5 +10,5 @@
|
||||
|
||||
using System.Reflection;
|
||||
|
||||
[assembly: AssemblyVersion("0.9.1.0")]
|
||||
[assembly: AssemblyInformationalVersion("0.9.1.0")]
|
||||
[assembly: AssemblyVersion("0.9.1.1")]
|
||||
[assembly: AssemblyInformationalVersion("0.9.1.1 Alpha")]
|
Loading…
x
Reference in New Issue
Block a user