mirror of
https://github.com/openhardwaremonitor/openhardwaremonitor
synced 2025-08-22 09:57:20 +00:00
119 lines
3.5 KiB
C#
119 lines
3.5 KiB
C#
/*
|
|
|
|
This Source Code Form is subject to the terms of the Mozilla Public
|
|
License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
|
|
Copyright (C) 2009-2020 Michael Möller <mmoeller@openhardwaremonitor.org>
|
|
|
|
*/
|
|
|
|
using System.Collections.Generic;
|
|
using System.Globalization;
|
|
using System.Text;
|
|
|
|
namespace OpenHardwareMonitor.Hardware.Nvidia {
|
|
|
|
internal class NvidiaGroup : IGroup {
|
|
|
|
private readonly List<Hardware> hardware = new List<Hardware>();
|
|
private readonly StringBuilder report = new StringBuilder();
|
|
|
|
public NvidiaGroup(ISettings settings) {
|
|
if (!NVAPI.IsAvailable)
|
|
return;
|
|
|
|
report.AppendLine("NVAPI");
|
|
report.AppendLine();
|
|
|
|
string version;
|
|
if (NVAPI.NvAPI_GetInterfaceVersionString(out version) == NvStatus.OK) {
|
|
report.Append(" Version: ");
|
|
report.AppendLine(version);
|
|
}
|
|
|
|
NvPhysicalGpuHandle[] handles =
|
|
new NvPhysicalGpuHandle[NVAPI.MAX_PHYSICAL_GPUS];
|
|
int count;
|
|
if (NVAPI.NvAPI_EnumPhysicalGPUs == null) {
|
|
report.AppendLine(" Error: NvAPI_EnumPhysicalGPUs not available");
|
|
report.AppendLine();
|
|
return;
|
|
} else {
|
|
NvStatus status = NVAPI.NvAPI_EnumPhysicalGPUs(handles, out count);
|
|
if (status != NvStatus.OK) {
|
|
report.AppendLine(" Status: " + status);
|
|
report.AppendLine();
|
|
return;
|
|
}
|
|
}
|
|
|
|
var result = NVML.NvmlInit();
|
|
|
|
report.AppendLine();
|
|
report.AppendLine("NVML");
|
|
report.AppendLine();
|
|
report.AppendLine(" Status: " + result);
|
|
report.AppendLine();
|
|
|
|
IDictionary<NvPhysicalGpuHandle, NvDisplayHandle> displayHandles =
|
|
new Dictionary<NvPhysicalGpuHandle, NvDisplayHandle>();
|
|
|
|
if (NVAPI.NvAPI_EnumNvidiaDisplayHandle != null &&
|
|
NVAPI.NvAPI_GetPhysicalGPUsFromDisplay != null)
|
|
{
|
|
NvStatus status = NvStatus.OK;
|
|
int i = 0;
|
|
while (status == NvStatus.OK) {
|
|
NvDisplayHandle displayHandle = new NvDisplayHandle();
|
|
status = NVAPI.NvAPI_EnumNvidiaDisplayHandle(i, ref displayHandle);
|
|
i++;
|
|
|
|
if (status == NvStatus.OK) {
|
|
NvPhysicalGpuHandle[] handlesFromDisplay =
|
|
new NvPhysicalGpuHandle[NVAPI.MAX_PHYSICAL_GPUS];
|
|
uint countFromDisplay;
|
|
if (NVAPI.NvAPI_GetPhysicalGPUsFromDisplay(displayHandle,
|
|
handlesFromDisplay, out countFromDisplay) == NvStatus.OK) {
|
|
for (int j = 0; j < countFromDisplay; j++) {
|
|
if (!displayHandles.ContainsKey(handlesFromDisplay[j]))
|
|
displayHandles.Add(handlesFromDisplay[j], displayHandle);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
report.Append("Number of GPUs: ");
|
|
report.AppendLine(count.ToString(CultureInfo.InvariantCulture));
|
|
|
|
for (int i = 0; i < count; i++) {
|
|
NvDisplayHandle displayHandle;
|
|
displayHandles.TryGetValue(handles[i], out displayHandle);
|
|
hardware.Add(new NvidiaGPU(i, handles[i], displayHandle, settings));
|
|
}
|
|
|
|
report.AppendLine();
|
|
}
|
|
|
|
public IHardware[] Hardware {
|
|
get {
|
|
return hardware.ToArray();
|
|
}
|
|
}
|
|
|
|
public string GetReport() {
|
|
return report.ToString();
|
|
}
|
|
|
|
public void Close() {
|
|
foreach (Hardware gpu in hardware)
|
|
gpu.Close();
|
|
|
|
if (NVML.IsInitialized) {
|
|
NVML.NvmlShutdown();
|
|
}
|
|
}
|
|
}
|
|
}
|