mirror of
https://github.com/openhardwaremonitor/openhardwaremonitor
synced 2025-08-22 18:07:09 +00:00
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:
parent
43e4e79ab4
commit
2019791af9
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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,
|
||||||
|
@ -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")]
|
Loading…
x
Reference in New Issue
Block a user