2010-01-26 22:37:48 +00:00
|
|
|
|
/*
|
|
|
|
|
|
|
|
|
|
Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
|
|
|
|
|
|
|
|
|
The contents of this file are subject to the Mozilla Public License Version
|
|
|
|
|
1.1 (the "License"); you may not use this file except in compliance with
|
|
|
|
|
the License. You may obtain a copy of the License at
|
|
|
|
|
|
|
|
|
|
http://www.mozilla.org/MPL/
|
|
|
|
|
|
|
|
|
|
Software distributed under the License is distributed on an "AS IS" basis,
|
|
|
|
|
WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
|
|
|
|
for the specific language governing rights and limitations under the License.
|
|
|
|
|
|
|
|
|
|
The Original Code is the Open Hardware Monitor code.
|
|
|
|
|
|
|
|
|
|
The Initial Developer of the Original Code is
|
|
|
|
|
Michael Möller <m.moeller@gmx.ch>.
|
|
|
|
|
Portions created by the Initial Developer are Copyright (C) 2009-2010
|
|
|
|
|
the Initial Developer. All Rights Reserved.
|
|
|
|
|
|
|
|
|
|
Contributor(s):
|
|
|
|
|
|
|
|
|
|
Alternatively, the contents of this file may be used under the terms of
|
|
|
|
|
either the GNU General Public License Version 2 or later (the "GPL"), or
|
|
|
|
|
the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
|
|
|
|
in which case the provisions of the GPL or the LGPL are applicable instead
|
|
|
|
|
of those above. If you wish to allow use of your version of this file only
|
|
|
|
|
under the terms of either the GPL or the LGPL, and not to allow others to
|
|
|
|
|
use your version of this file under the terms of the MPL, indicate your
|
|
|
|
|
decision by deleting the provisions above and replace them with the notice
|
|
|
|
|
and other provisions required by the GPL or the LGPL. If you do not delete
|
|
|
|
|
the provisions above, a recipient may use your version of this file under
|
|
|
|
|
the terms of any one of the MPL, the GPL or the LGPL.
|
|
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Runtime.InteropServices;
|
|
|
|
|
using System.Text;
|
|
|
|
|
|
|
|
|
|
namespace OpenHardwareMonitor.Hardware.Nvidia {
|
|
|
|
|
|
|
|
|
|
public enum NvStatus {
|
|
|
|
|
OK = 0,
|
|
|
|
|
ERROR = -1,
|
|
|
|
|
LIBRARY_NOT_FOUND = -2,
|
|
|
|
|
NO_IMPLEMENTATION = -3,
|
|
|
|
|
API_NOT_INTIALIZED = -4,
|
|
|
|
|
INVALID_ARGUMENT = -5,
|
|
|
|
|
NVIDIA_DEVICE_NOT_FOUND = -6,
|
|
|
|
|
END_ENUMERATION = -7,
|
|
|
|
|
INVALID_HANDLE = -8,
|
|
|
|
|
INCOMPATIBLE_STRUCT_VERSION = -9,
|
|
|
|
|
HANDLE_INVALIDATED = -10,
|
|
|
|
|
OPENGL_CONTEXT_NOT_CURRENT = -11,
|
|
|
|
|
NO_GL_EXPERT = -12,
|
|
|
|
|
INSTRUMENTATION_DISABLED = -13,
|
|
|
|
|
EXPECTED_LOGICAL_GPU_HANDLE = -100,
|
|
|
|
|
EXPECTED_PHYSICAL_GPU_HANDLE = -101,
|
|
|
|
|
EXPECTED_DISPLAY_HANDLE = -102,
|
|
|
|
|
INVALID_COMBINATION = -103,
|
|
|
|
|
NOT_SUPPORTED = -104,
|
|
|
|
|
PORTID_NOT_FOUND = -105,
|
|
|
|
|
EXPECTED_UNATTACHED_DISPLAY_HANDLE = -106,
|
|
|
|
|
INVALID_PERF_LEVEL = -107,
|
|
|
|
|
DEVICE_BUSY = -108,
|
|
|
|
|
NV_PERSIST_FILE_NOT_FOUND = -109,
|
|
|
|
|
PERSIST_DATA_NOT_FOUND = -110,
|
|
|
|
|
EXPECTED_TV_DISPLAY = -111,
|
|
|
|
|
EXPECTED_TV_DISPLAY_ON_DCONNECTOR = -112,
|
|
|
|
|
NO_ACTIVE_SLI_TOPOLOGY = -113,
|
|
|
|
|
SLI_RENDERING_MODE_NOTALLOWED = -114,
|
|
|
|
|
EXPECTED_DIGITAL_FLAT_PANEL = -115,
|
|
|
|
|
ARGUMENT_EXCEED_MAX_SIZE = -116,
|
|
|
|
|
DEVICE_SWITCHING_NOT_ALLOWED = -117,
|
|
|
|
|
TESTING_CLOCKS_NOT_SUPPORTED = -118,
|
|
|
|
|
UNKNOWN_UNDERSCAN_CONFIG = -119,
|
|
|
|
|
TIMEOUT_RECONFIGURING_GPU_TOPO = -120,
|
|
|
|
|
DATA_NOT_FOUND = -121,
|
|
|
|
|
EXPECTED_ANALOG_DISPLAY = -122,
|
|
|
|
|
NO_VIDLINK = -123,
|
|
|
|
|
REQUIRES_REBOOT = -124,
|
|
|
|
|
INVALID_HYBRID_MODE = -125,
|
|
|
|
|
MIXED_TARGET_TYPES = -126,
|
|
|
|
|
SYSWOW64_NOT_SUPPORTED = -127,
|
|
|
|
|
IMPLICIT_SET_GPU_TOPOLOGY_CHANGE_NOT_ALLOWED = -128,
|
|
|
|
|
REQUEST_USER_TO_CLOSE_NON_MIGRATABLE_APPS = -129,
|
|
|
|
|
OUT_OF_MEMORY = -130,
|
|
|
|
|
WAS_STILL_DRAWING = -131,
|
|
|
|
|
FILE_NOT_FOUND = -132,
|
|
|
|
|
TOO_MANY_UNIQUE_STATE_OBJECTS = -133,
|
|
|
|
|
INVALID_CALL = -134,
|
|
|
|
|
D3D10_1_LIBRARY_NOT_FOUND = -135,
|
|
|
|
|
FUNCTION_NOT_FOUND = -136
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public enum NvThermalController {
|
|
|
|
|
NONE = 0,
|
|
|
|
|
GPU_INTERNAL,
|
|
|
|
|
ADM1032,
|
|
|
|
|
MAX6649,
|
|
|
|
|
MAX1617,
|
|
|
|
|
LM99,
|
|
|
|
|
LM89,
|
|
|
|
|
LM64,
|
|
|
|
|
ADT7473,
|
|
|
|
|
SBMAX6649,
|
|
|
|
|
VBIOSEVT,
|
|
|
|
|
OS,
|
|
|
|
|
UNKNOWN = -1,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public enum NvThermalTarget {
|
|
|
|
|
NONE = 0,
|
|
|
|
|
GPU = 1,
|
|
|
|
|
MEMORY = 2,
|
|
|
|
|
POWER_SUPPLY = 4,
|
|
|
|
|
BOARD = 8,
|
|
|
|
|
ALL = 15,
|
|
|
|
|
UNKNOWN = -1
|
|
|
|
|
};
|
|
|
|
|
|
2010-02-22 20:54:49 +00:00
|
|
|
|
[StructLayout(LayoutKind.Sequential, Pack = 8)]
|
2010-01-26 22:37:48 +00:00
|
|
|
|
public struct NvSensor {
|
|
|
|
|
public NvThermalController Controller;
|
2010-06-27 10:24:27 +00:00
|
|
|
|
public uint DefaultMinTemp;
|
|
|
|
|
public uint DefaultMaxTemp;
|
|
|
|
|
public uint CurrentTemp;
|
2010-01-26 22:37:48 +00:00
|
|
|
|
public NvThermalTarget Target;
|
|
|
|
|
}
|
|
|
|
|
|
2010-02-22 20:54:49 +00:00
|
|
|
|
[StructLayout(LayoutKind.Sequential, Pack = 8)]
|
2010-01-26 22:37:48 +00:00
|
|
|
|
public struct NvGPUThermalSettings {
|
2010-06-27 10:24:27 +00:00
|
|
|
|
public uint Version;
|
|
|
|
|
public uint Count;
|
2010-01-26 22:37:48 +00:00
|
|
|
|
[MarshalAs(UnmanagedType.ByValArray,
|
|
|
|
|
SizeConst = NVAPI.MAX_THERMAL_SENSORS_PER_GPU)]
|
|
|
|
|
public NvSensor[] Sensor;
|
|
|
|
|
}
|
|
|
|
|
|
2010-02-22 20:54:49 +00:00
|
|
|
|
[StructLayout(LayoutKind.Sequential)]
|
2010-01-26 22:37:48 +00:00
|
|
|
|
public struct NvDisplayHandle {
|
2010-02-22 20:54:49 +00:00
|
|
|
|
private IntPtr ptr;
|
2010-01-26 22:37:48 +00:00
|
|
|
|
}
|
|
|
|
|
|
2010-02-22 20:54:49 +00:00
|
|
|
|
[StructLayout(LayoutKind.Sequential)]
|
2010-01-26 22:37:48 +00:00
|
|
|
|
public struct NvPhysicalGpuHandle {
|
2010-02-22 20:54:49 +00:00
|
|
|
|
private IntPtr ptr;
|
2010-01-26 22:37:48 +00:00
|
|
|
|
}
|
|
|
|
|
|
2010-06-27 10:24:27 +00:00
|
|
|
|
[StructLayout(LayoutKind.Sequential, Pack = 8)]
|
|
|
|
|
public struct NvClocks {
|
|
|
|
|
public uint Version;
|
|
|
|
|
[MarshalAs(UnmanagedType.ByValArray, SizeConst = NVAPI.MAX_CLOCKS_PER_GPU)]
|
|
|
|
|
public uint[] Clock;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[StructLayout(LayoutKind.Sequential, Pack = 8)]
|
|
|
|
|
public struct NvPState {
|
|
|
|
|
public bool Present;
|
|
|
|
|
public int Percentage;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[StructLayout(LayoutKind.Sequential, Pack = 8)]
|
|
|
|
|
public struct NvPStates {
|
|
|
|
|
public uint Version;
|
|
|
|
|
public uint Flags;
|
|
|
|
|
[MarshalAs(UnmanagedType.ByValArray, SizeConst = NVAPI.MAX_PSTATES_PER_GPU)]
|
|
|
|
|
public NvPState[] PStates;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[StructLayout(LayoutKind.Sequential, Pack = 8)]
|
|
|
|
|
public struct NvUsages {
|
|
|
|
|
public uint Version;
|
|
|
|
|
[MarshalAs(UnmanagedType.ByValArray, SizeConst = NVAPI.MAX_USAGES_PER_GPU)]
|
|
|
|
|
public uint[] Usage;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[StructLayout(LayoutKind.Sequential, Pack = 8)]
|
|
|
|
|
public struct NvCooler {
|
|
|
|
|
public int Type;
|
|
|
|
|
public int Controller;
|
|
|
|
|
public int DefaultMin;
|
|
|
|
|
public int DefaultMax;
|
|
|
|
|
public int CurrentMin;
|
|
|
|
|
public int CurrentMax;
|
|
|
|
|
public int CurrentLevel;
|
|
|
|
|
public int DefaultPolicy;
|
|
|
|
|
public int CurrentPolicy;
|
|
|
|
|
public int Target;
|
|
|
|
|
public int ControlType;
|
|
|
|
|
public int Active;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[StructLayout(LayoutKind.Sequential, Pack = 8)]
|
|
|
|
|
public struct NvGPUCoolerSettings {
|
|
|
|
|
public uint Version;
|
|
|
|
|
public uint Count;
|
|
|
|
|
[MarshalAs(UnmanagedType.ByValArray, SizeConst = NVAPI.MAX_COOLER_PER_GPU)]
|
|
|
|
|
public NvCooler[] Cooler;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[StructLayout(LayoutKind.Sequential, Pack = 8)]
|
|
|
|
|
public struct NvMemoryInfo {
|
|
|
|
|
public uint Version;
|
|
|
|
|
[MarshalAs(UnmanagedType.ByValArray, SizeConst =
|
|
|
|
|
NVAPI.MAX_MEMORY_VALUES_PER_GPU)]
|
|
|
|
|
public uint[] Values;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[StructLayout(LayoutKind.Sequential, Pack = 8)]
|
|
|
|
|
public struct NvDisplayDriverVersion {
|
|
|
|
|
public uint Version;
|
|
|
|
|
public uint DriverVersion;
|
|
|
|
|
public uint BldChangeListNum;
|
|
|
|
|
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = NVAPI.SHORT_STRING_MAX)]
|
|
|
|
|
public string BuildBranch;
|
|
|
|
|
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = NVAPI.SHORT_STRING_MAX)]
|
|
|
|
|
public string Adapter;
|
|
|
|
|
}
|
|
|
|
|
|
2010-01-26 22:37:48 +00:00
|
|
|
|
public class NVAPI {
|
|
|
|
|
|
|
|
|
|
public const int MAX_PHYSICAL_GPUS = 64;
|
2010-06-27 10:24:27 +00:00
|
|
|
|
public const int SHORT_STRING_MAX = 64;
|
|
|
|
|
|
|
|
|
|
public const int MAX_THERMAL_SENSORS_PER_GPU = 3;
|
|
|
|
|
public const int MAX_CLOCKS_PER_GPU = 0x120;
|
|
|
|
|
public const int MAX_PSTATES_PER_GPU = 8;
|
|
|
|
|
public const int MAX_USAGES_PER_GPU = 33;
|
|
|
|
|
public const int MAX_COOLER_PER_GPU = 20;
|
|
|
|
|
public const int MAX_MEMORY_VALUES_PER_GPU = 5;
|
|
|
|
|
|
|
|
|
|
public static readonly uint GPU_THERMAL_SETTINGS_VER = (uint)
|
2010-01-26 22:37:48 +00:00
|
|
|
|
Marshal.SizeOf(typeof(NvGPUThermalSettings)) | 0x10000;
|
2010-06-27 10:24:27 +00:00
|
|
|
|
public static readonly uint GPU_CLOCKS_VER = (uint)
|
|
|
|
|
Marshal.SizeOf(typeof(NvClocks)) | 0x20000;
|
|
|
|
|
public static readonly uint GPU_PSTATES_VER = (uint)
|
|
|
|
|
Marshal.SizeOf(typeof(NvPStates)) | 0x10000;
|
|
|
|
|
public static readonly uint GPU_USAGES_VER = (uint)
|
|
|
|
|
Marshal.SizeOf(typeof(NvUsages)) | 0x10000;
|
|
|
|
|
public static readonly uint GPU_COOLER_SETTINGS_VER = (uint)
|
|
|
|
|
Marshal.SizeOf(typeof(NvGPUCoolerSettings)) | 0x20000;
|
|
|
|
|
public static readonly uint GPU_MEMORY_INFO_VER = (uint)
|
|
|
|
|
Marshal.SizeOf(typeof(NvMemoryInfo)) | 0x20000;
|
|
|
|
|
public static readonly uint DISPLAY_DRIVER_VERSION_VER = (uint)
|
|
|
|
|
Marshal.SizeOf(typeof(NvDisplayDriverVersion)) | 0x10000;
|
|
|
|
|
|
2010-01-26 22:37:48 +00:00
|
|
|
|
private delegate IntPtr nvapi_QueryInterfaceDelegate(uint id);
|
|
|
|
|
private delegate NvStatus NvAPI_InitializeDelegate();
|
|
|
|
|
private delegate NvStatus NvAPI_GPU_GetFullNameDelegate(
|
|
|
|
|
NvPhysicalGpuHandle gpuHandle, StringBuilder name);
|
|
|
|
|
|
|
|
|
|
public delegate NvStatus NvAPI_GPU_GetThermalSettingsDelegate(
|
|
|
|
|
NvPhysicalGpuHandle gpuHandle, int sensorIndex,
|
|
|
|
|
ref NvGPUThermalSettings nvGPUThermalSettings);
|
|
|
|
|
public delegate NvStatus NvAPI_EnumNvidiaDisplayHandleDelegate(int thisEnum,
|
|
|
|
|
ref NvDisplayHandle displayHandle);
|
|
|
|
|
public delegate NvStatus NvAPI_GetPhysicalGPUsFromDisplayDelegate(
|
|
|
|
|
NvDisplayHandle displayHandle, [Out] NvPhysicalGpuHandle[] gpuHandles,
|
2010-06-27 10:24:27 +00:00
|
|
|
|
out uint gpuCount);
|
2010-01-26 22:37:48 +00:00
|
|
|
|
public delegate NvStatus NvAPI_EnumPhysicalGPUsDelegate(
|
|
|
|
|
[Out] NvPhysicalGpuHandle[] gpuHandles, out int gpuCount);
|
2010-02-09 19:42:33 +00:00
|
|
|
|
public delegate NvStatus NvAPI_GPU_GetTachReadingDelegate(
|
|
|
|
|
NvPhysicalGpuHandle gpuHandle, out int value);
|
2010-06-27 10:24:27 +00:00
|
|
|
|
public delegate NvStatus NvAPI_GPU_GetAllClocksDelegate(
|
|
|
|
|
NvPhysicalGpuHandle gpuHandle, ref NvClocks nvClocks);
|
|
|
|
|
public delegate NvStatus NvAPI_GPU_GetPStatesDelegate(
|
|
|
|
|
NvPhysicalGpuHandle gpuHandle, ref NvPStates nvPStates);
|
|
|
|
|
public delegate NvStatus NvAPI_GPU_GetUsagesDelegate(
|
|
|
|
|
NvPhysicalGpuHandle gpuHandle, ref NvUsages nvUsages);
|
|
|
|
|
public delegate NvStatus NvAPI_GPU_GetCoolerSettingsDelegate(
|
|
|
|
|
NvPhysicalGpuHandle gpuHandle, int coolerIndex,
|
|
|
|
|
ref NvGPUCoolerSettings nvGPUCoolerSettings);
|
|
|
|
|
public delegate NvStatus NvAPI_GPU_GetMemoryInfoDelegate(
|
|
|
|
|
NvDisplayHandle displayHandle, ref NvMemoryInfo nvMemoryInfo);
|
|
|
|
|
public delegate NvStatus NvAPI_GetDisplayDriverVersionDelegate(
|
|
|
|
|
NvDisplayHandle displayHandle, [In, Out] ref NvDisplayDriverVersion
|
|
|
|
|
nvDisplayDriverVersion);
|
|
|
|
|
public delegate NvStatus NvAPI_GetInterfaceVersionStringDelegate(
|
|
|
|
|
StringBuilder version);
|
2010-01-26 22:37:48 +00:00
|
|
|
|
|
|
|
|
|
private static bool available = false;
|
|
|
|
|
private static nvapi_QueryInterfaceDelegate nvapi_QueryInterface;
|
|
|
|
|
private static NvAPI_InitializeDelegate NvAPI_Initialize;
|
|
|
|
|
private static NvAPI_GPU_GetFullNameDelegate _NvAPI_GPU_GetFullName;
|
2010-06-27 10:24:27 +00:00
|
|
|
|
private static NvAPI_GetInterfaceVersionStringDelegate
|
|
|
|
|
_NvAPI_GetInterfaceVersionString;
|
2010-01-26 22:37:48 +00:00
|
|
|
|
|
2010-06-27 10:24:27 +00:00
|
|
|
|
public static readonly NvAPI_GPU_GetThermalSettingsDelegate
|
2010-01-26 22:37:48 +00:00
|
|
|
|
NvAPI_GPU_GetThermalSettings;
|
2010-06-27 10:24:27 +00:00
|
|
|
|
public static readonly NvAPI_EnumNvidiaDisplayHandleDelegate
|
2010-01-26 22:37:48 +00:00
|
|
|
|
NvAPI_EnumNvidiaDisplayHandle;
|
2010-06-27 10:24:27 +00:00
|
|
|
|
public static readonly NvAPI_GetPhysicalGPUsFromDisplayDelegate
|
2010-01-26 22:37:48 +00:00
|
|
|
|
NvAPI_GetPhysicalGPUsFromDisplay;
|
2010-06-27 10:24:27 +00:00
|
|
|
|
public static readonly NvAPI_EnumPhysicalGPUsDelegate
|
2010-01-26 22:37:48 +00:00
|
|
|
|
NvAPI_EnumPhysicalGPUs;
|
2010-06-27 10:24:27 +00:00
|
|
|
|
public static readonly NvAPI_GPU_GetTachReadingDelegate
|
2010-02-09 19:42:33 +00:00
|
|
|
|
NvAPI_GPU_GetTachReading;
|
2010-06-27 10:24:27 +00:00
|
|
|
|
public static readonly NvAPI_GPU_GetAllClocksDelegate
|
|
|
|
|
NvAPI_GPU_GetAllClocks;
|
|
|
|
|
public static readonly NvAPI_GPU_GetPStatesDelegate
|
|
|
|
|
NvAPI_GPU_GetPStates;
|
|
|
|
|
public static readonly NvAPI_GPU_GetUsagesDelegate
|
|
|
|
|
NvAPI_GPU_GetUsages;
|
|
|
|
|
public static readonly NvAPI_GPU_GetCoolerSettingsDelegate
|
|
|
|
|
NvAPI_GPU_GetCoolerSettings;
|
|
|
|
|
public static readonly NvAPI_GPU_GetMemoryInfoDelegate
|
|
|
|
|
NvAPI_GPU_GetMemoryInfo;
|
|
|
|
|
public static readonly NvAPI_GetDisplayDriverVersionDelegate
|
|
|
|
|
NvAPI_GetDisplayDriverVersion;
|
2010-01-26 22:37:48 +00:00
|
|
|
|
|
|
|
|
|
public static NvStatus NvAPI_GPU_GetFullName(NvPhysicalGpuHandle gpuHandle,
|
|
|
|
|
out string name) {
|
|
|
|
|
StringBuilder builder = new StringBuilder(SHORT_STRING_MAX);
|
2010-04-26 19:22:42 +00:00
|
|
|
|
NvStatus status;
|
|
|
|
|
if (_NvAPI_GPU_GetFullName != null)
|
|
|
|
|
status = _NvAPI_GPU_GetFullName(gpuHandle, builder);
|
|
|
|
|
else
|
|
|
|
|
status = NvStatus.FUNCTION_NOT_FOUND;
|
2010-01-26 22:37:48 +00:00
|
|
|
|
name = builder.ToString();
|
|
|
|
|
return status;
|
|
|
|
|
}
|
|
|
|
|
|
2010-06-27 10:24:27 +00:00
|
|
|
|
public static NvStatus NvAPI_GetInterfaceVersionString(out string version) {
|
|
|
|
|
StringBuilder builder = new StringBuilder(SHORT_STRING_MAX);
|
|
|
|
|
NvStatus status;
|
|
|
|
|
if (_NvAPI_GetInterfaceVersionString != null)
|
|
|
|
|
status = _NvAPI_GetInterfaceVersionString(builder);
|
|
|
|
|
else
|
|
|
|
|
status = NvStatus.FUNCTION_NOT_FOUND;
|
|
|
|
|
version = builder.ToString();
|
|
|
|
|
return status;
|
|
|
|
|
}
|
|
|
|
|
|
2010-01-26 22:37:48 +00:00
|
|
|
|
private static string GetDllName() {
|
|
|
|
|
if (IntPtr.Size == 4) {
|
|
|
|
|
return "nvapi.dll";
|
|
|
|
|
} else {
|
|
|
|
|
return "nvapi64.dll";
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static void GetDelegate<T>(uint id, out T newDelegate)
|
|
|
|
|
where T : class
|
|
|
|
|
{
|
|
|
|
|
IntPtr ptr = nvapi_QueryInterface(id);
|
2010-02-09 19:42:33 +00:00
|
|
|
|
if (ptr != IntPtr.Zero) {
|
|
|
|
|
newDelegate =
|
|
|
|
|
Marshal.GetDelegateForFunctionPointer(ptr, typeof(T)) as T;
|
|
|
|
|
} else {
|
|
|
|
|
newDelegate = null;
|
|
|
|
|
}
|
2010-01-26 22:37:48 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static NVAPI() {
|
|
|
|
|
DllImportAttribute attribute = new DllImportAttribute(GetDllName());
|
|
|
|
|
attribute.CallingConvention = CallingConvention.Cdecl;
|
|
|
|
|
attribute.PreserveSig = true;
|
|
|
|
|
attribute.EntryPoint = "nvapi_QueryInterface";
|
|
|
|
|
PInvokeDelegateFactory.CreateDelegate(attribute,
|
|
|
|
|
out nvapi_QueryInterface);
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
GetDelegate(0x0150E828, out NvAPI_Initialize);
|
|
|
|
|
} catch (DllNotFoundException) { return; }
|
2010-05-18 19:16:55 +00:00
|
|
|
|
catch (EntryPointNotFoundException) { return; }
|
2010-01-26 22:37:48 +00:00
|
|
|
|
catch (ArgumentNullException) { return; }
|
|
|
|
|
|
|
|
|
|
if (NvAPI_Initialize() == NvStatus.OK) {
|
|
|
|
|
GetDelegate(0xE3640A56, out NvAPI_GPU_GetThermalSettings);
|
|
|
|
|
GetDelegate(0xCEEE8E9F, out _NvAPI_GPU_GetFullName);
|
|
|
|
|
GetDelegate(0x9ABDD40D, out NvAPI_EnumNvidiaDisplayHandle);
|
|
|
|
|
GetDelegate(0x34EF9506, out NvAPI_GetPhysicalGPUsFromDisplay);
|
|
|
|
|
GetDelegate(0xE5AC921F, out NvAPI_EnumPhysicalGPUs);
|
2010-06-27 10:24:27 +00:00
|
|
|
|
GetDelegate(0x5F608315, out NvAPI_GPU_GetTachReading);
|
|
|
|
|
GetDelegate(0x1BD69F49, out NvAPI_GPU_GetAllClocks);
|
|
|
|
|
GetDelegate(0x60DED2ED, out NvAPI_GPU_GetPStates);
|
|
|
|
|
GetDelegate(0x189A1FDF, out NvAPI_GPU_GetUsages);
|
|
|
|
|
GetDelegate(0xDA141340, out NvAPI_GPU_GetCoolerSettings);
|
|
|
|
|
GetDelegate(0x774AA982, out NvAPI_GPU_GetMemoryInfo);
|
|
|
|
|
GetDelegate(0xF951A4D1, out NvAPI_GetDisplayDriverVersion);
|
|
|
|
|
GetDelegate(0x01053FA5, out _NvAPI_GetInterfaceVersionString);
|
|
|
|
|
|
2010-01-26 22:37:48 +00:00
|
|
|
|
available = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static bool IsAvailable {
|
|
|
|
|
get { return available; }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|