Added more ADL (AMD Display Library) functions and extended the AMD GPU report. Added an enum type for ADL function result status values.

This commit is contained in:
Michael Möller 2020-03-09 23:45:35 +01:00
parent 43e4e79ab4
commit 2019791af9
4 changed files with 298 additions and 66 deletions

View File

@ -90,6 +90,47 @@ namespace OpenHardwareMonitor.Hardware.ATI {
public ADLSingleSensorData[] Sensors; public ADLSingleSensorData[] Sensors;
} }
[StructLayout(LayoutKind.Sequential)]
internal struct ADLODParameterRange {
public int Min;
public int Max;
public int Step;
}
[StructLayout(LayoutKind.Sequential)]
internal struct ADLODParameters {
public int Size;
public int NumberOfPerformanceLevels;
public int ActivityReportingSupported;
public int DiscretePerformanceLevels;
public int Reserved;
public ADLODParameterRange EngineClock;
public ADLODParameterRange MemoryClock;
public ADLODParameterRange Vddc;
}
[StructLayout(LayoutKind.Sequential)]
internal struct ADLODNPerformanceStatus {
public int CoreClock;
public int MemoryClock;
public int DCEFClock;
public int GFXClock;
public int UVDClock;
public int VCEClock;
public int GPUActivityPercent;
public int CurrentCorePerformanceLevel;
public int CurrentMemoryPerformanceLevel;
public int CurrentDCEFPerformanceLevel;
public int CurrentGFXPerformanceLevel;
public int UVDPerformanceLevel;
public int VCEPerformanceLevel;
public int CurrentBusSpeed;
public int CurrentBusLanes;
public int MaximumBusLanes;
public int VDDC;
public int VDDCI;
}
internal enum ADLODNCurrentPowerType { internal enum ADLODNCurrentPowerType {
TOTAL_POWER = 0, TOTAL_POWER = 0,
PPT_POWER, PPT_POWER,
@ -149,13 +190,110 @@ namespace OpenHardwareMonitor.Hardware.ATI {
SMART_POWERSHIFT_DGPU = 39 SMART_POWERSHIFT_DGPU = 39
} }
internal enum ADLStatus : int {
/// <summary>
/// All OK, but need to wait.
/// </summary>
OK_WAIT = 4,
/// <summary>
/// All OK, but need restart.
/// </summary>
OK_RESTART = 3,
/// <summary>
/// All OK but need mode change.
/// </summary>
OK_MODE_CHANGE = 2,
/// <summary>
/// All OK, but with warning.
/// </summary>
OK_WARNING = 1,
/// <summary>
/// ADL function completed successfully.
/// </summary>
OK = 0,
/// <summary>
/// Generic Error. Most likely one or more of the Escape calls to the driver
/// failed!
/// </summary>
ERR = -1,
/// <summary>
/// ADL not initialized.
/// </summary>
ERR_NOT_INIT = -2,
/// <summary>
/// One of the parameter passed is invalid.
/// </summary>
ERR_INVALID_PARAM = -3,
/// <summary>
/// One of the parameter size is invalid.
/// </summary>
ERR_INVALID_PARAM_SIZE = -4,
/// <summary>
/// Invalid ADL index passed.
/// </summary>
ERR_INVALID_ADL_IDX = -5,
/// <summary>
/// Invalid controller index passed.
/// </summary>
ERR_INVALID_CONTROLLER_IDX = -6,
/// <summary>
/// Invalid display index passed.
/// </summary>
ERR_INVALID_DIPLAY_IDX = -7,
/// <summary>
/// Function not supported by the driver.
/// </summary>
ERR_NOT_SUPPORTED = -8,
/// <summary>
/// Null Pointer error.
/// </summary>
ERR_NULL_POINTER = -9,
/// <summary>
/// Call can't be made due to disabled adapter.
/// </summary>
ERR_DISABLED_ADAPTER = -10,
/// <summary>
/// Invalid Callback.
/// </summary>
ERR_INVALID_CALLBACK = -11,
/// <summary>
/// Display Resource conflict.
/// </summary>
ERR_RESOURCE_CONFLICT = -12,
/// <summary>
/// Failed to update some of the values. Can be returned by set request that
/// include multiple values if not all values were successfully committed.
/// </summary>
ERR_SET_INCOMPLETE = -20,
/// <summary>
/// There's no Linux XDisplay in Linux Console environment.
/// </summary>
ERR_NO_XDISPLAY = -21
}
internal class ADL { internal class ADL {
public const int ADL_MAX_PATH = 256; public const int ADL_MAX_PATH = 256;
public const int ADL_MAX_ADAPTERS = 40; public const int ADL_MAX_ADAPTERS = 40;
public const int ADL_MAX_DISPLAYS = 40; public const int ADL_MAX_DISPLAYS = 40;
public const int ADL_MAX_DEVICENAME = 32; public const int ADL_MAX_DEVICENAME = 32;
public const int ADL_OK = 0;
public const int ADL_ERR = -1;
public const int ADL_DRIVER_OK = 0; public const int ADL_DRIVER_OK = 0;
public const int ADL_MAX_GLSYNC_PORTS = 8; public const int ADL_MAX_GLSYNC_PORTS = 8;
public const int ADL_MAX_GLSYNC_PORT_LEDS = 8; public const int ADL_MAX_GLSYNC_PORT_LEDS = 8;
@ -173,47 +311,52 @@ namespace OpenHardwareMonitor.Hardware.ATI {
public const int ATI_VENDOR_ID = 0x1002; public const int ATI_VENDOR_ID = 0x1002;
private delegate int ADL_Main_Control_CreateDelegate( private delegate ADLStatus ADL_Main_Control_CreateDelegate(
ADL_Main_Memory_AllocDelegate callback, int enumConnectedAdapters); ADL_Main_Memory_AllocDelegate callback, int enumConnectedAdapters);
private delegate int ADL_Adapter_AdapterInfo_GetDelegate(IntPtr info, private delegate ADLStatus ADL_Adapter_AdapterInfo_GetDelegate(IntPtr info,
int size); int size);
public delegate int ADL_Main_Control_DestroyDelegate(); public delegate ADLStatus ADL_Main_Control_DestroyDelegate();
public delegate int ADL_Adapter_NumberOfAdapters_GetDelegate( public delegate ADLStatus ADL_Adapter_NumberOfAdapters_GetDelegate(
ref int numAdapters); ref int numAdapters);
public delegate int ADL_Adapter_ID_GetDelegate(int adapterIndex, public delegate ADLStatus ADL_Adapter_ID_GetDelegate(int adapterIndex,
out int adapterID); out int adapterID);
public delegate int ADL_Display_AdapterID_GetDelegate(int adapterIndex, public delegate ADLStatus ADL_Display_AdapterID_GetDelegate(int adapterIndex,
out int adapterID); out int adapterID);
public delegate int ADL_Adapter_Active_GetDelegate(int adapterIndex, public delegate int ADL_Adapter_Active_GetDelegate(int adapterIndex,
out int status); out int status);
public delegate int ADL_Overdrive5_CurrentActivity_GetDelegate( public delegate ADLStatus ADL_Overdrive5_CurrentActivity_GetDelegate(
int iAdapterIndex, ref ADLPMActivity activity); int iAdapterIndex, ref ADLPMActivity activity);
public delegate int ADL_Overdrive5_Temperature_GetDelegate(int adapterIndex, public delegate ADLStatus ADL_Overdrive5_Temperature_GetDelegate(int adapterIndex,
int thermalControllerIndex, ref ADLTemperature temperature); int thermalControllerIndex, ref ADLTemperature temperature);
public delegate int ADL_Overdrive5_FanSpeed_GetDelegate(int adapterIndex, public delegate ADLStatus ADL_Overdrive5_FanSpeed_GetDelegate(int adapterIndex,
int thermalControllerIndex, ref ADLFanSpeedValue fanSpeedValue); int thermalControllerIndex, ref ADLFanSpeedValue fanSpeedValue);
public delegate int ADL_Overdrive5_FanSpeedInfo_GetDelegate( public delegate ADLStatus ADL_Overdrive5_FanSpeedInfo_GetDelegate(
int adapterIndex, int thermalControllerIndex, int adapterIndex, int thermalControllerIndex,
ref ADLFanSpeedInfo fanSpeedInfo); ref ADLFanSpeedInfo fanSpeedInfo);
public delegate int ADL_Overdrive5_FanSpeedToDefault_SetDelegate( public delegate ADLStatus ADL_Overdrive5_FanSpeedToDefault_SetDelegate(
int adapterIndex, int thermalControllerIndex); int adapterIndex, int thermalControllerIndex);
public delegate int ADL_Overdrive5_FanSpeed_SetDelegate(int adapterIndex, public delegate ADLStatus ADL_Overdrive5_FanSpeed_SetDelegate(int adapterIndex,
int thermalControllerIndex, ref ADLFanSpeedValue fanSpeedValue); int thermalControllerIndex, ref ADLFanSpeedValue fanSpeedValue);
public delegate int ADL_Overdrive_CapsDelegate(int adapterIndex, public delegate ADLStatus ADL_Overdrive_CapsDelegate(int adapterIndex,
out int supported, out int enabled, out int version); out int supported, out int enabled, out int version);
private delegate int ADL2_Main_Control_CreateDelegate( private delegate ADLStatus ADL2_Main_Control_CreateDelegate(
ADL_Main_Memory_AllocDelegate callback, int enumConnectedAdapters, ADL_Main_Memory_AllocDelegate callback, int enumConnectedAdapters,
out IntPtr context); out IntPtr context);
public delegate int ADL2_Main_Control_DestroyDelegate(IntPtr context); public delegate ADLStatus ADL2_Main_Control_DestroyDelegate(IntPtr context);
public delegate int ADL2_OverdriveN_Temperature_GetDelegate(IntPtr context, public delegate ADLStatus ADL2_OverdriveN_Temperature_GetDelegate(IntPtr context,
int adapterIndex, ADLODNTemperatureType temperatureType, int adapterIndex, ADLODNTemperatureType temperatureType,
out int temperature); out int temperature);
public delegate int ADL2_Overdrive6_CurrentPower_GetDelegate(IntPtr context, public delegate ADLStatus ADL2_Overdrive6_CurrentPower_GetDelegate(IntPtr context,
int adapterIndex, ADLODNCurrentPowerType powerType, int adapterIndex, ADLODNCurrentPowerType powerType,
out int currentValue); out int currentValue);
public delegate int ADL2_New_QueryPMLogData_GetDelegate(IntPtr context, public delegate ADLStatus ADL2_New_QueryPMLogData_GetDelegate(IntPtr context,
int adapterIndex, out ADLPMLogDataOutput dataOutput); int adapterIndex, out ADLPMLogDataOutput dataOutput);
public delegate ADLStatus ADL_Overdrive5_ODParameters_GetDelegate(
int adapterIndex, out ADLODParameters parameters);
public delegate ADLStatus ADL2_OverdriveN_PerformanceStatus_GetDelegate(
IntPtr context, int adapterIndex,
out ADLODNPerformanceStatus performanceStatus);
private static ADL_Main_Control_CreateDelegate private static ADL_Main_Control_CreateDelegate
_ADL_Main_Control_Create; _ADL_Main_Control_Create;
@ -254,6 +397,10 @@ namespace OpenHardwareMonitor.Hardware.ATI {
ADL2_Overdrive6_CurrentPower_Get; ADL2_Overdrive6_CurrentPower_Get;
public static ADL2_New_QueryPMLogData_GetDelegate public static ADL2_New_QueryPMLogData_GetDelegate
ADL2_New_QueryPMLogData_Get; ADL2_New_QueryPMLogData_Get;
public static ADL_Overdrive5_ODParameters_GetDelegate
ADL_Overdrive5_ODParameters_Get;
public static ADL2_OverdriveN_PerformanceStatus_GetDelegate
ADL2_OverdriveN_PerformanceStatus_Get;
private static string dllName; private static string dllName;
@ -312,6 +459,10 @@ namespace OpenHardwareMonitor.Hardware.ATI {
out ADL2_Overdrive6_CurrentPower_Get); out ADL2_Overdrive6_CurrentPower_Get);
GetDelegate("ADL2_New_QueryPMLogData_Get", GetDelegate("ADL2_New_QueryPMLogData_Get",
out ADL2_New_QueryPMLogData_Get); out ADL2_New_QueryPMLogData_Get);
GetDelegate("ADL_Overdrive5_ODParameters_Get",
out ADL_Overdrive5_ODParameters_Get);
GetDelegate("ADL2_OverdriveN_PerformanceStatus_Get",
out ADL2_OverdriveN_PerformanceStatus_Get);
} }
static ADL() { static ADL() {
@ -320,7 +471,7 @@ namespace OpenHardwareMonitor.Hardware.ATI {
private ADL() { } private ADL() { }
public static int ADL_Main_Control_Create(int enumConnectedAdapters) { public static ADLStatus ADL_Main_Control_Create(int enumConnectedAdapters) {
try { try {
try { try {
return _ADL_Main_Control_Create(Main_Memory_Alloc, return _ADL_Main_Control_Create(Main_Memory_Alloc,
@ -331,30 +482,30 @@ namespace OpenHardwareMonitor.Hardware.ATI {
enumConnectedAdapters); enumConnectedAdapters);
} }
} catch { } catch {
return ADL_ERR; return ADLStatus.ERR;
} }
} }
public static int ADL2_Main_Control_Create(int enumConnectedAdapters, public static ADLStatus ADL2_Main_Control_Create(int enumConnectedAdapters,
out IntPtr context) out IntPtr context)
{ {
try { try {
var result = _ADL2_Main_Control_Create(Main_Memory_Alloc, var result = _ADL2_Main_Control_Create(Main_Memory_Alloc,
enumConnectedAdapters, out context); enumConnectedAdapters, out context);
if (result != ADL.ADL_OK) if (result != ADLStatus.OK)
context = IntPtr.Zero; context = IntPtr.Zero;
return result; return result;
} catch { } catch {
context = IntPtr.Zero; context = IntPtr.Zero;
return ADL_ERR; return ADLStatus.ERR;
} }
} }
public static int ADL_Adapter_AdapterInfo_Get(ADLAdapterInfo[] info) { public static ADLStatus ADL_Adapter_AdapterInfo_Get(ADLAdapterInfo[] info) {
int elementSize = Marshal.SizeOf(typeof(ADLAdapterInfo)); int elementSize = Marshal.SizeOf(typeof(ADLAdapterInfo));
int size = info.Length * elementSize; int size = info.Length * elementSize;
IntPtr ptr = Marshal.AllocHGlobal(size); IntPtr ptr = Marshal.AllocHGlobal(size);
int result = _ADL_Adapter_AdapterInfo_Get(ptr, size); var status = _ADL_Adapter_AdapterInfo_Get(ptr, size);
for (int i = 0; i < info.Length; i++) for (int i = 0; i < info.Length; i++)
info[i] = (ADLAdapterInfo) info[i] = (ADLAdapterInfo)
Marshal.PtrToStructure((IntPtr)((long)ptr + i * elementSize), Marshal.PtrToStructure((IntPtr)((long)ptr + i * elementSize),
@ -377,10 +528,10 @@ namespace OpenHardwareMonitor.Hardware.ATI {
} }
} }
return result; return status;
} }
public static int ADL_Adapter_ID_Get(int adapterIndex, public static ADLStatus ADL_Adapter_ID_Get(int adapterIndex,
out int adapterID) { out int adapterID) {
try { try {
return _ADL_Adapter_ID_Get(adapterIndex, out adapterID); return _ADL_Adapter_ID_Get(adapterIndex, out adapterID);
@ -389,7 +540,7 @@ namespace OpenHardwareMonitor.Hardware.ATI {
return _ADL_Display_AdapterID_Get(adapterIndex, out adapterID); return _ADL_Display_AdapterID_Get(adapterIndex, out adapterID);
} catch (EntryPointNotFoundException) { } catch (EntryPointNotFoundException) {
adapterID = 1; adapterID = 1;
return ADL_OK; return ADLStatus.OK;
} }
} }
} }

View File

@ -60,7 +60,7 @@ namespace OpenHardwareMonitor.Hardware.ATI {
this.context = context; this.context = context;
if (ADL.ADL_Overdrive_Caps(adapterIndex, out _, out _, if (ADL.ADL_Overdrive_Caps(adapterIndex, out _, out _,
out overdriveVersion) != ADL.ADL_OK) out overdriveVersion) != ADLStatus.OK)
{ {
overdriveVersion = -1; overdriveVersion = -1;
} }
@ -109,7 +109,7 @@ namespace OpenHardwareMonitor.Hardware.ATI {
ADLFanSpeedInfo afsi = new ADLFanSpeedInfo(); ADLFanSpeedInfo afsi = new ADLFanSpeedInfo();
if (ADL.ADL_Overdrive5_FanSpeedInfo_Get(adapterIndex, 0, ref afsi) if (ADL.ADL_Overdrive5_FanSpeedInfo_Get(adapterIndex, 0, ref afsi)
!= ADL.ADL_OK) != ADLStatus.OK)
{ {
afsi.MaxPercent = 100; afsi.MaxPercent = 100;
afsi.MinPercent = 0; afsi.MinPercent = 0;
@ -167,7 +167,7 @@ namespace OpenHardwareMonitor.Hardware.ATI {
Sensor sensor) Sensor sensor)
{ {
if (ADL.ADL2_OverdriveN_Temperature_Get(context, adapterIndex, if (ADL.ADL2_OverdriveN_Temperature_Get(context, adapterIndex,
type, out int temperature) == ADL.ADL_OK) type, out int temperature) == ADLStatus.OK)
{ {
sensor.Value = 0.001f * temperature; sensor.Value = 0.001f * temperature;
ActivateSensor(sensor); ActivateSensor(sensor);
@ -179,7 +179,7 @@ namespace OpenHardwareMonitor.Hardware.ATI {
private void GetOD6Power(ADLODNCurrentPowerType type, Sensor sensor) private void GetOD6Power(ADLODNCurrentPowerType type, Sensor sensor)
{ {
if (ADL.ADL2_Overdrive6_CurrentPower_Get(context, adapterIndex, type, if (ADL.ADL2_Overdrive6_CurrentPower_Get(context, adapterIndex, type,
out int power) == ADL.ADL_OK) out int power) == ADLStatus.OK)
{ {
sensor.Value = power * (1.0f / 0xFF); sensor.Value = power * (1.0f / 0xFF);
ActivateSensor(sensor); ActivateSensor(sensor);
@ -202,11 +202,10 @@ namespace OpenHardwareMonitor.Hardware.ATI {
r.AppendLine("Overdrive Caps"); r.AppendLine("Overdrive Caps");
r.AppendLine(); r.AppendLine();
try { try {
int status = ADL.ADL_Overdrive_Caps(adapterIndex, var status = ADL.ADL_Overdrive_Caps(adapterIndex,
out int supported, out int enabled, out int version); out int supported, out int enabled, out int version);
r.Append(" Status: "); r.Append(" Status: ");
r.AppendLine(status == ADL.ADL_OK ? "OK" : r.AppendLine(status.ToString());
status.ToString(CultureInfo.InvariantCulture));
r.Append(" Supported: "); r.Append(" Supported: ");
r.AppendLine(supported.ToString(CultureInfo.InvariantCulture)); r.AppendLine(supported.ToString(CultureInfo.InvariantCulture));
r.Append(" Enabled: "); r.Append(" Enabled: ");
@ -218,6 +217,42 @@ namespace OpenHardwareMonitor.Hardware.ATI {
} }
r.AppendLine(); r.AppendLine();
r.AppendLine("Overdrive5 Parameters");
r.AppendLine();
try {
var status = ADL.ADL_Overdrive5_ODParameters_Get(
adapterIndex, out var p);
r.Append(" Status: ");
r.AppendLine(status.ToString());
r.AppendFormat(" NumberOfPerformanceLevels: {0}{1}",
p.NumberOfPerformanceLevels, Environment.NewLine);
r.AppendFormat(" ActivityReportingSupported: {0}{1}",
p.ActivityReportingSupported, Environment.NewLine);
r.AppendFormat(" DiscretePerformanceLevels: {0}{1}",
p.DiscretePerformanceLevels, Environment.NewLine);
r.AppendFormat(" EngineClock.Min: {0}{1}",
p.EngineClock.Min, Environment.NewLine);
r.AppendFormat(" EngineClock.Max: {0}{1}",
p.EngineClock.Max, Environment.NewLine);
r.AppendFormat(" EngineClock.Step: {0}{1}",
p.EngineClock.Step, Environment.NewLine);
r.AppendFormat(" MemoryClock.Min: {0}{1}",
p.MemoryClock.Min, Environment.NewLine);
r.AppendFormat(" MemoryClock.Max: {0}{1}",
p.MemoryClock.Max, Environment.NewLine);
r.AppendFormat(" MemoryClock.Step: {0}{1}",
p.MemoryClock.Step, Environment.NewLine);
r.AppendFormat(" Vddc.Min: {0}{1}",
p.Vddc.Min, Environment.NewLine);
r.AppendFormat(" Vddc.Max: {0}{1}",
p.Vddc.Max, Environment.NewLine);
r.AppendFormat(" Vddc.Step: {0}{1}",
p.Vddc.Step, Environment.NewLine);
} catch (Exception e) {
r.AppendLine(" Status: " + e.Message);
}
r.AppendLine();
r.AppendLine("Overdrive5 Temperature"); r.AppendLine("Overdrive5 Temperature");
r.AppendLine(); r.AppendLine();
try { try {
@ -225,8 +260,7 @@ namespace OpenHardwareMonitor.Hardware.ATI {
var status = ADL.ADL_Overdrive5_Temperature_Get(adapterIndex, 0, var status = ADL.ADL_Overdrive5_Temperature_Get(adapterIndex, 0,
ref adlt); ref adlt);
r.Append(" Status: "); r.Append(" Status: ");
r.AppendLine(status == ADL.ADL_OK ? "OK" : r.AppendLine(status.ToString());
status.ToString(CultureInfo.InvariantCulture));
r.AppendFormat(" Value: {0}{1}", r.AppendFormat(" Value: {0}{1}",
0.001f * adlt.Temperature, Environment.NewLine); 0.001f * adlt.Temperature, Environment.NewLine);
} catch (Exception e) { } catch (Exception e) {
@ -241,15 +275,13 @@ namespace OpenHardwareMonitor.Hardware.ATI {
adlf.SpeedType = ADL.ADL_DL_FANCTRL_SPEED_TYPE_RPM; adlf.SpeedType = ADL.ADL_DL_FANCTRL_SPEED_TYPE_RPM;
var status = ADL.ADL_Overdrive5_FanSpeed_Get(adapterIndex, 0, ref adlf); var status = ADL.ADL_Overdrive5_FanSpeed_Get(adapterIndex, 0, ref adlf);
r.Append(" Status RPM: "); r.Append(" Status RPM: ");
r.AppendLine(status == ADL.ADL_OK ? "OK" : r.AppendLine(status.ToString());
status.ToString(CultureInfo.InvariantCulture));
r.AppendFormat(" Value RPM: {0}{1}", r.AppendFormat(" Value RPM: {0}{1}",
adlf.FanSpeed, Environment.NewLine); adlf.FanSpeed, Environment.NewLine);
adlf.SpeedType = ADL.ADL_DL_FANCTRL_SPEED_TYPE_PERCENT; adlf.SpeedType = ADL.ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
status = ADL.ADL_Overdrive5_FanSpeed_Get(adapterIndex, 0, ref adlf); status = ADL.ADL_Overdrive5_FanSpeed_Get(adapterIndex, 0, ref adlf);
r.Append(" Status Percent: "); r.Append(" Status Percent: ");
r.AppendLine(status == ADL.ADL_OK ? "OK" : r.AppendLine(status.ToString());
status.ToString(CultureInfo.InvariantCulture));
r.AppendFormat(" Value Percent: {0}{1}", r.AppendFormat(" Value Percent: {0}{1}",
adlf.FanSpeed, Environment.NewLine); adlf.FanSpeed, Environment.NewLine);
} catch (Exception e) { } catch (Exception e) {
@ -264,8 +296,7 @@ namespace OpenHardwareMonitor.Hardware.ATI {
var status = ADL.ADL_Overdrive5_CurrentActivity_Get(adapterIndex, var status = ADL.ADL_Overdrive5_CurrentActivity_Get(adapterIndex,
ref adlp); ref adlp);
r.Append(" Status: "); r.Append(" Status: ");
r.AppendLine(status == ADL.ADL_OK ? "OK" : r.AppendLine(status.ToString());
status.ToString(CultureInfo.InvariantCulture));
r.AppendFormat(" EngineClock: {0}{1}", r.AppendFormat(" EngineClock: {0}{1}",
0.01f * adlp.EngineClock, Environment.NewLine); 0.01f * adlp.EngineClock, Environment.NewLine);
r.AppendFormat(" MemoryClock: {0}{1}", r.AppendFormat(" MemoryClock: {0}{1}",
@ -296,12 +327,12 @@ namespace OpenHardwareMonitor.Hardware.ATI {
var status = ADL.ADL2_Overdrive6_CurrentPower_Get( var status = ADL.ADL2_Overdrive6_CurrentPower_Get(
context, adapterIndex, (ADLODNCurrentPowerType)i, context, adapterIndex, (ADLODNCurrentPowerType)i,
out int power); out int power);
if (status == ADL.ADL_OK) { if (status == ADLStatus.OK) {
r.AppendFormat(" Power[{0}].Value: {1}{2}", pt, r.AppendFormat(" Power[{0}].Value: {1}{2}", pt,
power * (1.0f / 0xFF), Environment.NewLine); power * (1.0f / 0xFF), Environment.NewLine);
} else { } else {
r.AppendFormat(" Power[{0}].Status: {1}{2}", pt, r.AppendFormat(" Power[{0}].Status: {1}{2}", pt,
status, Environment.NewLine); status.ToString(), Environment.NewLine);
} }
} }
} catch (EntryPointNotFoundException) { } catch (EntryPointNotFoundException) {
@ -321,12 +352,12 @@ namespace OpenHardwareMonitor.Hardware.ATI {
var status = ADL.ADL2_OverdriveN_Temperature_Get( var status = ADL.ADL2_OverdriveN_Temperature_Get(
context, adapterIndex, (ADLODNTemperatureType)i, context, adapterIndex, (ADLODNTemperatureType)i,
out int temperature); out int temperature);
if (status == ADL.ADL_OK) { if (status == ADLStatus.OK) {
r.AppendFormat(" Temperature[{0}].Value: {1}{2}", tt, r.AppendFormat(" Temperature[{0}].Value: {1}{2}", tt,
0.001f * temperature, Environment.NewLine); 0.001f * temperature, Environment.NewLine);
} else { } else {
r.AppendFormat(" Temperature[{0}].Status: {1}{2}", tt, r.AppendFormat(" Temperature[{0}].Status: {1}{2}", tt,
status, Environment.NewLine); status.ToString(), Environment.NewLine);
} }
} }
} catch (EntryPointNotFoundException) { } catch (EntryPointNotFoundException) {
@ -337,13 +368,65 @@ namespace OpenHardwareMonitor.Hardware.ATI {
r.AppendLine(); r.AppendLine();
} }
if (context != IntPtr.Zero) {
r.AppendLine("OverdriveN Performance Status");
r.AppendLine();
try {
var status = ADL.ADL2_OverdriveN_PerformanceStatus_Get(context,
adapterIndex, out var ps);
r.Append(" Status: ");
r.AppendLine(status.ToString());
r.AppendFormat(" CoreClock: {0}{1}",
ps.CoreClock, Environment.NewLine);
r.AppendFormat(" MemoryClock: {0}{1}",
ps.MemoryClock, Environment.NewLine);
r.AppendFormat(" DCEFClock: {0}{1}",
ps.DCEFClock, Environment.NewLine);
r.AppendFormat(" GFXClock: {0}{1}",
ps.GFXClock, Environment.NewLine);
r.AppendFormat(" UVDClock: {0}{1}",
ps.UVDClock, Environment.NewLine);
r.AppendFormat(" VCEClock: {0}{1}",
ps.VCEClock, Environment.NewLine);
r.AppendFormat(" GPUActivityPercent: {0}{1}",
ps.GPUActivityPercent, Environment.NewLine);
r.AppendFormat(" CurrentCorePerformanceLevel: {0}{1}",
ps.CurrentCorePerformanceLevel, Environment.NewLine);
r.AppendFormat(" CurrentMemoryPerformanceLevel: {0}{1}",
ps.CurrentMemoryPerformanceLevel, Environment.NewLine);
r.AppendFormat(" CurrentDCEFPerformanceLevel: {0}{1}",
ps.CurrentDCEFPerformanceLevel, Environment.NewLine);
r.AppendFormat(" CurrentGFXPerformanceLevel: {0}{1}",
ps.CurrentGFXPerformanceLevel, Environment.NewLine);
r.AppendFormat(" UVDPerformanceLevel: {0}{1}",
ps.UVDPerformanceLevel, Environment.NewLine);
r.AppendFormat(" VCEPerformanceLevel: {0}{1}",
ps.VCEPerformanceLevel, Environment.NewLine);
r.AppendFormat(" CurrentBusSpeed: {0}{1}",
ps.CurrentBusSpeed, Environment.NewLine);
r.AppendFormat(" CurrentBusLanes: {0}{1}",
ps.CurrentBusLanes, Environment.NewLine);
r.AppendFormat(" MaximumBusLanes: {0}{1}",
ps.MaximumBusLanes, Environment.NewLine);
r.AppendFormat(" VDDC: {0}{1}",
ps.VDDC, Environment.NewLine);
r.AppendFormat(" VDDCI: {0}{1}",
ps.VDDCI, Environment.NewLine);
} catch (EntryPointNotFoundException) {
r.AppendLine(" Status: Entry point not found");
} catch (Exception e) {
r.AppendLine(" Status: " + e.Message);
}
r.AppendLine();
}
if (context != IntPtr.Zero) { if (context != IntPtr.Zero) {
r.AppendLine("Performance Metrics"); r.AppendLine("Performance Metrics");
r.AppendLine(); r.AppendLine();
try { try {
var status = ADL.ADL2_New_QueryPMLogData_Get(context, adapterIndex, var status = ADL.ADL2_New_QueryPMLogData_Get(context, adapterIndex,
out var data); out var data);
if (status == ADL.ADL_OK) { if (status == ADLStatus.OK) {
for (int i = 0; i < data.Sensors.Length; i++) { for (int i = 0; i < data.Sensors.Length; i++) {
if (data.Sensors[i].Supported) { if (data.Sensors[i].Supported) {
var st = ((ADLSensorType)i).ToString(); var st = ((ADLSensorType)i).ToString();
@ -353,7 +436,7 @@ namespace OpenHardwareMonitor.Hardware.ATI {
} }
} else { } else {
r.Append(" Status: "); r.Append(" Status: ");
r.AppendLine(status.ToString(CultureInfo.InvariantCulture)); r.AppendLine(status.ToString());
} }
} catch (EntryPointNotFoundException) { } catch (EntryPointNotFoundException) {
r.AppendLine(" Status: Entry point not found"); r.AppendLine(" Status: Entry point not found");
@ -380,7 +463,7 @@ namespace OpenHardwareMonitor.Hardware.ATI {
public override void Update() { public override void Update() {
if (context != IntPtr.Zero && overdriveVersion >= 8 && if (context != IntPtr.Zero && overdriveVersion >= 8 &&
ADL.ADL2_New_QueryPMLogData_Get(context, adapterIndex, ADL.ADL2_New_QueryPMLogData_Get(context, adapterIndex,
out var data) == ADL.ADL_OK) out var data) == ADLStatus.OK)
{ {
GetPMLog(data, ADLSensorType.TEMPERATURE_EDGE, temperatureCore); GetPMLog(data, ADLSensorType.TEMPERATURE_EDGE, temperatureCore);
GetPMLog(data, ADLSensorType.TEMPERATURE_MEM, temperatureMemory); GetPMLog(data, ADLSensorType.TEMPERATURE_MEM, temperatureMemory);
@ -417,7 +500,7 @@ namespace OpenHardwareMonitor.Hardware.ATI {
} else { } else {
ADLTemperature adlt = new ADLTemperature(); ADLTemperature adlt = new ADLTemperature();
if (ADL.ADL_Overdrive5_Temperature_Get(adapterIndex, 0, ref adlt) if (ADL.ADL_Overdrive5_Temperature_Get(adapterIndex, 0, ref adlt)
== ADL.ADL_OK) == ADLStatus.OK)
{ {
temperatureCore.Value = 0.001f * adlt.Temperature; temperatureCore.Value = 0.001f * adlt.Temperature;
ActivateSensor(temperatureCore); ActivateSensor(temperatureCore);
@ -436,7 +519,7 @@ namespace OpenHardwareMonitor.Hardware.ATI {
ADLFanSpeedValue adlf = new ADLFanSpeedValue(); ADLFanSpeedValue adlf = new ADLFanSpeedValue();
adlf.SpeedType = ADL.ADL_DL_FANCTRL_SPEED_TYPE_RPM; adlf.SpeedType = ADL.ADL_DL_FANCTRL_SPEED_TYPE_RPM;
if (ADL.ADL_Overdrive5_FanSpeed_Get(adapterIndex, 0, ref adlf) if (ADL.ADL_Overdrive5_FanSpeed_Get(adapterIndex, 0, ref adlf)
== ADL.ADL_OK) == ADLStatus.OK)
{ {
fan.Value = adlf.FanSpeed; fan.Value = adlf.FanSpeed;
ActivateSensor(fan); ActivateSensor(fan);
@ -447,7 +530,7 @@ namespace OpenHardwareMonitor.Hardware.ATI {
adlf = new ADLFanSpeedValue(); adlf = new ADLFanSpeedValue();
adlf.SpeedType = ADL.ADL_DL_FANCTRL_SPEED_TYPE_PERCENT; adlf.SpeedType = ADL.ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
if (ADL.ADL_Overdrive5_FanSpeed_Get(adapterIndex, 0, ref adlf) if (ADL.ADL_Overdrive5_FanSpeed_Get(adapterIndex, 0, ref adlf)
== ADL.ADL_OK) == ADLStatus.OK)
{ {
controlSensor.Value = adlf.FanSpeed; controlSensor.Value = adlf.FanSpeed;
ActivateSensor(controlSensor); ActivateSensor(controlSensor);
@ -457,7 +540,7 @@ namespace OpenHardwareMonitor.Hardware.ATI {
ADLPMActivity adlp = new ADLPMActivity(); ADLPMActivity adlp = new ADLPMActivity();
if (ADL.ADL_Overdrive5_CurrentActivity_Get(adapterIndex, ref adlp) if (ADL.ADL_Overdrive5_CurrentActivity_Get(adapterIndex, ref adlp)
== ADL.ADL_OK) == ADLStatus.OK)
{ {
if (adlp.EngineClock > 0) { if (adlp.EngineClock > 0) {
coreClock.Value = 0.01f * adlp.EngineClock; coreClock.Value = 0.01f * adlp.EngineClock;

View File

@ -23,20 +23,18 @@ namespace OpenHardwareMonitor.Hardware.ATI {
public ATIGroup(ISettings settings) { public ATIGroup(ISettings settings) {
try { try {
int adlStatus = ADL.ADL_Main_Control_Create(1); var adlStatus = ADL.ADL_Main_Control_Create(1);
int adl2Status = ADL.ADL2_Main_Control_Create(1, out context); var adl2Status = ADL.ADL2_Main_Control_Create(1, out context);
report.AppendLine("AMD Display Library"); report.AppendLine("AMD Display Library");
report.AppendLine(); report.AppendLine();
report.Append("ADL Status: "); report.Append("ADL Status: ");
report.AppendLine(adlStatus == ADL.ADL_OK ? "OK" : report.AppendLine(adlStatus.ToString());
adlStatus.ToString(CultureInfo.InvariantCulture));
report.Append("ADL2 Status: "); report.Append("ADL2 Status: ");
report.AppendLine(adl2Status == ADL.ADL_OK ? "OK" : report.AppendLine(adl2Status.ToString());
adl2Status.ToString(CultureInfo.InvariantCulture));
report.AppendLine(); report.AppendLine();
if (adlStatus == ADL.ADL_OK) { if (adlStatus == ADLStatus.OK) {
int numberOfAdapters = 0; int numberOfAdapters = 0;
ADL.ADL_Adapter_NumberOfAdapters_Get(ref numberOfAdapters); ADL.ADL_Adapter_NumberOfAdapters_Get(ref numberOfAdapters);
@ -46,7 +44,7 @@ namespace OpenHardwareMonitor.Hardware.ATI {
if (numberOfAdapters > 0) { if (numberOfAdapters > 0) {
ADLAdapterInfo[] adapterInfo = new ADLAdapterInfo[numberOfAdapters]; ADLAdapterInfo[] adapterInfo = new ADLAdapterInfo[numberOfAdapters];
if (ADL.ADL_Adapter_AdapterInfo_Get(adapterInfo) == ADL.ADL_OK) if (ADL.ADL_Adapter_AdapterInfo_Get(adapterInfo) == ADLStatus.OK)
for (int i = 0; i < numberOfAdapters; i++) { for (int i = 0; i < numberOfAdapters; i++) {
int isActive; int isActive;
ADL.ADL_Adapter_Active_Get(adapterInfo[i].AdapterIndex, ADL.ADL_Adapter_Active_Get(adapterInfo[i].AdapterIndex,

View File

@ -10,5 +10,5 @@
using System.Reflection; using System.Reflection;
[assembly: AssemblyVersion("0.9.2.1")] [assembly: AssemblyVersion("0.9.2.2")]
[assembly: AssemblyInformationalVersion("0.9.2.1 Alpha")] [assembly: AssemblyInformationalVersion("0.9.2.2 Alpha")]