From 1093de8c4406a96642e139243911a571874c3d11 Mon Sep 17 00:00:00 2001 From: FlightlessMango Date: Sun, 23 Apr 2023 07:27:22 +0200 Subject: [PATCH] nvml: fan: get rpm instead of percentage --- src/gpu.cpp | 2 +- src/loaders/loader_nvml.cpp | 26 ++++++++++++++++++++------ src/loaders/loader_nvml.h | 5 +++-- src/nvidia_info.h | 2 +- src/nvml.cpp | 8 ++++++-- 5 files changed, 31 insertions(+), 12 deletions(-) diff --git a/src/gpu.cpp b/src/gpu.cpp index 3a503a77..93876e3c 100644 --- a/src/gpu.cpp +++ b/src/gpu.cpp @@ -45,7 +45,7 @@ void getNvidiaGpuInfo(const struct overlay_params& params){ gpu_info.MemClock = nvidiaMemClock; gpu_info.powerUsage = nvidiaPowerUsage / 1000; gpu_info.memoryTotal = nvidiaMemory.total / (1024.f * 1024.f * 1024.f); - gpu_info.fan_speed = NvidiaFanSpeed; + gpu_info.fan_speed = nvidiaFanSpeed; if (params.enabled[OVERLAY_PARAM_ENABLED_throttling_status]){ gpu_info.is_temp_throttled = (nvml_throttle_reasons & 0x0000000000000060LL) != 0; gpu_info.is_power_throttled = (nvml_throttle_reasons & 0x000000000000008CLL) != 0; diff --git a/src/loaders/loader_nvml.cpp b/src/loaders/loader_nvml.cpp index 2a2ace03..fdf3e406 100644 --- a/src/loaders/loader_nvml.cpp +++ b/src/loaders/loader_nvml.cpp @@ -215,14 +215,27 @@ bool libnvml_loader::Load(const std::string& library_name) { } #if defined(LIBRARY_LOADER_NVML_H_DLOPEN) - nvmlDeviceGetFanSpeed = - reinterpret_castnvmlDeviceGetFanSpeed)>( - dlsym(library_, "nvmlDeviceGetPowerUsage")); + nvmlUnitGetFanSpeedInfo = + reinterpret_castnvmlUnitGetFanSpeedInfo)>( + dlsym(library_, "nvmlUnitGetFanSpeedInfo")); +#endif +#if defined(LIBRARY_LOADER_NVML_H_DT_NEEDED) + nvmlUnitGetFanSpeedInfo = &::nvmlUnitGetFanSpeedInfo; +#endif + if (!nvmlUnitGetFanSpeedInfo) { + CleanUp(true); + return false; + } + +#if defined(LIBRARY_LOADER_NVML_H_DLOPEN) + nvmlUnitGetHandleByIndex = + reinterpret_castnvmlUnitGetHandleByIndex)>( + dlsym(library_, "nvmlUnitGetHandleByIndex")); #endif #if defined(LIBRARY_LOADER_NVML_H_DT_NEEDED) - nvmlDeviceGetFanSpeed = &::nvmlDeviceGetFanSpeed; + nvmlUnitGetHandleByIndex = &::nvmlUnitGetHandleByIndex; #endif - if (!nvmlDeviceGetFanSpeed) { + if (!nvmlUnitGetHandleByIndex) { CleanUp(true); return false; } @@ -249,5 +262,6 @@ void libnvml_loader::CleanUp(bool unload) { nvmlDeviceGetHandleByIndex_v2 = NULL; nvmlDeviceGetHandleByPciBusId_v2 = NULL; nvmlDeviceGetCurrentClocksThrottleReasons = NULL; - nvmlDeviceGetFanSpeed = NULL; + nvmlUnitGetFanSpeedInfo = NULL; + nvmlUnitGetHandleByIndex = NULL; } diff --git a/src/loaders/loader_nvml.h b/src/loaders/loader_nvml.h index 07bad8b3..e5b99a91 100644 --- a/src/loaders/loader_nvml.h +++ b/src/loaders/loader_nvml.h @@ -38,8 +38,9 @@ class libnvml_loader { decltype(&::nvmlErrorString) nvmlErrorString; decltype(&::nvmlDeviceGetPowerUsage) nvmlDeviceGetPowerUsage; decltype(&::nvmlDeviceGetCurrentClocksThrottleReasons) nvmlDeviceGetCurrentClocksThrottleReasons; - decltype(&::nvmlDeviceGetFanSpeed) nvmlDeviceGetFanSpeed; - + decltype(&::nvmlUnitGetFanSpeedInfo) nvmlUnitGetFanSpeedInfo; + decltype(&::nvmlUnitGetHandleByIndex) nvmlUnitGetHandleByIndex; + private: void CleanUp(bool unload); diff --git a/src/nvidia_info.h b/src/nvidia_info.h index 0f8f25a2..e74943c9 100644 --- a/src/nvidia_info.h +++ b/src/nvidia_info.h @@ -6,7 +6,7 @@ #include "overlay_params.h" extern nvmlReturn_t result; -extern unsigned int nvidiaTemp, processSamplesCount, *vgpuInstanceSamplesCount, nvidiaCoreClock, nvidiaMemClock, nvidiaPowerUsage, NvidiaFanSpeed; +extern unsigned int nvidiaTemp, processSamplesCount, *vgpuInstanceSamplesCount, nvidiaCoreClock, nvidiaMemClock, nvidiaPowerUsage, nvidiaFanSpeed; extern nvmlDevice_t nvidiaDevice; extern struct nvmlUtilization_st nvidiaUtilization; extern struct nvmlMemory_st nvidiaMemory; diff --git a/src/nvml.cpp b/src/nvml.cpp index 6906f726..3e76e6fc 100644 --- a/src/nvml.cpp +++ b/src/nvml.cpp @@ -9,10 +9,12 @@ nvmlReturn_t result; nvmlDevice_t nvidiaDevice; nvmlPciInfo_t nvidiaPciInfo; bool nvmlSuccess = false; -unsigned int nvidiaTemp = 0, nvidiaCoreClock = 0, nvidiaMemClock = 0, nvidiaPowerUsage = 0, NvidiaFanSpeed = 0; +unsigned int nvidiaTemp = 0, nvidiaCoreClock = 0, nvidiaMemClock = 0, nvidiaPowerUsage = 0, nvidiaFanSpeed = 0; unsigned long long nvml_throttle_reasons; struct nvmlUtilization_st nvidiaUtilization; struct nvmlMemory_st nvidiaMemory {}; +struct nvmlUnitFanSpeeds_st nvidiaFanSpeeds {}; +struct nvmlUnit_st* nvidiaUnit {}; bool checkNVML(const char* pciBusId){ auto& nvml = get_libnvml_loader(); @@ -55,7 +57,9 @@ bool getNVMLInfo(const struct overlay_params& params){ nvml.nvmlDeviceGetClockInfo(nvidiaDevice, NVML_CLOCK_GRAPHICS, &nvidiaCoreClock); nvml.nvmlDeviceGetClockInfo(nvidiaDevice, NVML_CLOCK_MEM, &nvidiaMemClock); nvml.nvmlDeviceGetPowerUsage(nvidiaDevice, &nvidiaPowerUsage); - nvml.nvmlDeviceGetFanSpeed(nvidiaDevice, &NvidiaFanSpeed); + nvml.nvmlUnitGetHandleByIndex(0, &nvidiaUnit); + nvml.nvmlUnitGetFanSpeedInfo(nvidiaUnit, &nvidiaFanSpeeds); + nvidiaFanSpeed = nvidiaFanSpeeds.fans[0].speed; deviceID = nvidiaPciInfo.pciDeviceId >> 16; if (params.enabled[OVERLAY_PARAM_ENABLED_throttling_status]) nvml.nvmlDeviceGetCurrentClocksThrottleReasons(nvidiaDevice, &nvml_throttle_reasons);