-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathNvThermalSensors.cs
70 lines (56 loc) · 2.56 KB
/
NvThermalSensors.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
using FanControl.Plugins;
using System.Collections.Generic;
namespace FanControl.NvThermalSensors
{
internal class NvThermalSensors
{
internal NvThermalSensors(int gpuIndex, NvApi.NvPhysicalGpuHandle handle)
{
Sensors = new List<NvThermalSensor>();
var mask = FindThermalSensorMask(handle);
if (mask == 0)
return;
var gpuName = GetGpuName(handle, gpuIndex);
if (GetSensorValue(handle, mask, 1) != null)
Sensors.Add(new NvThermalSensor(gpuIndex, $"{gpuName} - Hot Spot", () => GetSensorValue(handle, mask, 1)));
if (GetSensorValue(handle, mask, 9) != null)
Sensors.Add(new NvThermalSensor(gpuIndex, $"{gpuName} - Memory Junction", () => GetSensorValue(handle, mask, 9)));
}
internal List<NvThermalSensor> Sensors { get; }
private uint FindThermalSensorMask(NvApi.NvPhysicalGpuHandle handle)
{
uint mask = 0;
for (var thermalSensorsMaxBit = 0; thermalSensorsMaxBit < 32; thermalSensorsMaxBit++)
{
mask = 1u << thermalSensorsMaxBit;
GetThermalSensors(handle, mask, out NvApi.NvStatus thermalSensorsStatus);
if (thermalSensorsStatus != NvApi.NvStatus.OK)
break;
}
return --mask;
}
private NvApi.NvThermalSensors GetThermalSensors(NvApi.NvPhysicalGpuHandle handle, uint mask, out NvApi.NvStatus status)
{
var thermalSensors = new NvApi.NvThermalSensors()
{
Version = (uint)NvApi.MAKE_NVAPI_VERSION<NvApi.NvThermalSensors>(2),
Mask = mask
};
status = NvApi.NvAPI_GPU_ThermalGetSensors(handle, ref thermalSensors);
return status == NvApi.NvStatus.OK ? thermalSensors : default;
}
private string GetGpuName(NvApi.NvPhysicalGpuHandle handle, int gpuIndex)
{
var gpuName = new NvApi.NvShortString();
var status = NvApi.NvAPI_GPU_GetFullName(handle, ref gpuName);
return status == NvApi.NvStatus.OK ? gpuName.Value.Trim() : $"GPU - {gpuIndex}";
}
private float? GetSensorValue(NvApi.NvPhysicalGpuHandle handle, uint mask, int index)
{
var thermalSensors = GetThermalSensors(handle, mask, out NvApi.NvStatus thermalSensorsStatus);
if (thermalSensorsStatus != NvApi.NvStatus.OK)
return null;
return thermalSensors.Temperatures[index] / 256.0f;
}
}
}