Merge branch 'xnvctrl' into develop
commit
c9558eec50
@ -0,0 +1,95 @@
|
|||||||
|
// This is generated file. Do not modify directly.
|
||||||
|
// Path to the code generator: /home/crz/git/MangoHud/generate_library_loader.py .
|
||||||
|
|
||||||
|
#include "loader_nvctrl.h"
|
||||||
|
|
||||||
|
// Put these sanity checks here so that they fire at most once
|
||||||
|
// (to avoid cluttering the build output).
|
||||||
|
#if !defined(LIBRARY_LOADER_NVCTRL_H_DLOPEN) && !defined(LIBRARY_LOADER_NVCTRL_H_DT_NEEDED)
|
||||||
|
#error neither LIBRARY_LOADER_NVCTRL_H_DLOPEN nor LIBRARY_LOADER_NVCTRL_H_DT_NEEDED defined
|
||||||
|
#endif
|
||||||
|
#if defined(LIBRARY_LOADER_NVCTRL_H_DLOPEN) && defined(LIBRARY_LOADER_NVCTRL_H_DT_NEEDED)
|
||||||
|
#error both LIBRARY_LOADER_NVCTRL_H_DLOPEN and LIBRARY_LOADER_NVCTRL_H_DT_NEEDED defined
|
||||||
|
#endif
|
||||||
|
|
||||||
|
libnvctrl_loader::libnvctrl_loader() : loaded_(false) {
|
||||||
|
}
|
||||||
|
|
||||||
|
libnvctrl_loader::~libnvctrl_loader() {
|
||||||
|
CleanUp(loaded_);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool libnvctrl_loader::Load(const std::string& library_name) {
|
||||||
|
if (loaded_) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(LIBRARY_LOADER_NVCTRL_H_DLOPEN)
|
||||||
|
library_ = dlopen(library_name.c_str(), RTLD_LAZY);
|
||||||
|
if (!library_)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
XNVCTRLIsNvScreen =
|
||||||
|
reinterpret_cast<decltype(this->XNVCTRLIsNvScreen)>(
|
||||||
|
dlsym(library_, "XNVCTRLIsNvScreen"));
|
||||||
|
if (!XNVCTRLIsNvScreen) {
|
||||||
|
CleanUp(true);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
XNVCTRLQueryVersion =
|
||||||
|
reinterpret_cast<decltype(this->XNVCTRLQueryVersion)>(
|
||||||
|
dlsym(library_, "XNVCTRLQueryVersion"));
|
||||||
|
if (!XNVCTRLQueryVersion) {
|
||||||
|
CleanUp(true);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
XNVCTRLQueryAttribute =
|
||||||
|
reinterpret_cast<decltype(this->XNVCTRLQueryAttribute)>(
|
||||||
|
dlsym(library_, "XNVCTRLQueryAttribute"));
|
||||||
|
if (!XNVCTRLQueryAttribute) {
|
||||||
|
CleanUp(true);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
XNVCTRLQueryTargetStringAttribute =
|
||||||
|
reinterpret_cast<decltype(this->XNVCTRLQueryTargetStringAttribute)>(
|
||||||
|
dlsym(library_, "XNVCTRLQueryTargetStringAttribute"));
|
||||||
|
if (!XNVCTRLQueryTargetStringAttribute) {
|
||||||
|
CleanUp(true);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
XNVCTRLQueryTargetAttribute64 =
|
||||||
|
reinterpret_cast<decltype(this->XNVCTRLQueryTargetAttribute64)>(
|
||||||
|
dlsym(library_, "XNVCTRLQueryTargetAttribute64"));
|
||||||
|
if (!XNVCTRLQueryTargetAttribute64) {
|
||||||
|
CleanUp(true);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(LIBRARY_LOADER_NVCTRL_H_DT_NEEDED)
|
||||||
|
XNVCTRLQueryVersion = &::XNVCTRLQueryVersion;
|
||||||
|
XNVCTRLQueryAttribute = &::XNVCTRLQueryAttribute;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
loaded_ = true;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void libnvctrl_loader::CleanUp(bool unload) {
|
||||||
|
#if defined(LIBRARY_LOADER_NVCTRL_H_DLOPEN)
|
||||||
|
if (unload) {
|
||||||
|
dlclose(library_);
|
||||||
|
library_ = NULL;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
loaded_ = false;
|
||||||
|
XNVCTRLQueryVersion = NULL;
|
||||||
|
XNVCTRLQueryAttribute = NULL;
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,44 @@
|
|||||||
|
// This is generated file. Do not modify directly.
|
||||||
|
// Path to the code generator: /home/crz/git/MangoHud/generate_library_loader.py .
|
||||||
|
|
||||||
|
#ifndef LIBRARY_LOADER_NVCTRL_H
|
||||||
|
#define LIBRARY_LOADER_NVCTRL_H
|
||||||
|
#define Bool bool
|
||||||
|
#include <X11/Xlib.h>
|
||||||
|
#include "NVCtrl/NVCtrlLib.h"
|
||||||
|
#define LIBRARY_LOADER_NVCTRL_H_DLOPEN
|
||||||
|
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <dlfcn.h>
|
||||||
|
|
||||||
|
class libnvctrl_loader {
|
||||||
|
public:
|
||||||
|
libnvctrl_loader();
|
||||||
|
libnvctrl_loader(const std::string& library_name) { Load(library_name); }
|
||||||
|
~libnvctrl_loader();
|
||||||
|
|
||||||
|
bool Load(const std::string& library_name);
|
||||||
|
bool IsLoaded() { return loaded_; }
|
||||||
|
|
||||||
|
decltype(&::XNVCTRLIsNvScreen) XNVCTRLIsNvScreen;
|
||||||
|
decltype(&::XNVCTRLQueryVersion) XNVCTRLQueryVersion;
|
||||||
|
decltype(&::XNVCTRLQueryAttribute) XNVCTRLQueryAttribute;
|
||||||
|
decltype(&::XNVCTRLQueryTargetStringAttribute) XNVCTRLQueryTargetStringAttribute;
|
||||||
|
decltype(&::XNVCTRLQueryTargetAttribute64) XNVCTRLQueryTargetAttribute64;
|
||||||
|
|
||||||
|
private:
|
||||||
|
void CleanUp(bool unload);
|
||||||
|
|
||||||
|
#if defined(LIBRARY_LOADER_NVCTRL_H_DLOPEN)
|
||||||
|
void* library_;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
bool loaded_;
|
||||||
|
|
||||||
|
// Disallow copy constructor and assignment operator.
|
||||||
|
libnvctrl_loader(const libnvctrl_loader&);
|
||||||
|
void operator=(const libnvctrl_loader&);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // LIBRARY_LOADER_NVCTRL_H
|
@ -0,0 +1,108 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <cstring>
|
||||||
|
#include <sstream>
|
||||||
|
#include <unordered_map>
|
||||||
|
#include "nvctrl.h"
|
||||||
|
#include "loaders/loader_nvctrl.h"
|
||||||
|
#include "string_utils.h"
|
||||||
|
|
||||||
|
typedef std::unordered_map<std::string, std::string> string_map;
|
||||||
|
|
||||||
|
Display *display = XOpenDisplay(NULL);
|
||||||
|
libnvctrl_loader nvctrl("libXNVCtrl.so");
|
||||||
|
|
||||||
|
struct nvctrlInfo nvctrl_info;
|
||||||
|
bool nvctrlSuccess = false;
|
||||||
|
|
||||||
|
bool checkXNVCtrl()
|
||||||
|
{
|
||||||
|
if (nvctrl.IsLoaded()) {
|
||||||
|
nvctrlSuccess = nvctrl.XNVCTRLIsNvScreen(display, 0);
|
||||||
|
return nvctrlSuccess;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void parse_token(std::string token, string_map& options) {
|
||||||
|
std::string param, value;
|
||||||
|
|
||||||
|
size_t equal = token.find("=");
|
||||||
|
if (equal == std::string::npos)
|
||||||
|
return;
|
||||||
|
|
||||||
|
value = token.substr(equal+1);
|
||||||
|
|
||||||
|
param = token.substr(0, equal);
|
||||||
|
trim(param);
|
||||||
|
trim(value);
|
||||||
|
//std::cerr << __func__ << ": " << param << "=" << value << std::endl;
|
||||||
|
if (!param.empty())
|
||||||
|
options[param] = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
char* get_attr_target_string(int attr, int target_type, int target_id) {
|
||||||
|
char* c = nullptr;
|
||||||
|
|
||||||
|
if (!nvctrl.XNVCTRLQueryTargetStringAttribute(display, target_type, target_id, 0, attr, &c)) {
|
||||||
|
fprintf(stderr, "Failed to query attribute '%d'.\n", attr);
|
||||||
|
|
||||||
|
}
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
void getNvctrlInfo(){
|
||||||
|
string_map params;
|
||||||
|
std::string token;
|
||||||
|
|
||||||
|
int enums[] = {
|
||||||
|
NV_CTRL_STRING_GPU_UTILIZATION,
|
||||||
|
NV_CTRL_STRING_GPU_CURRENT_CLOCK_FREQS,
|
||||||
|
0 // keep null
|
||||||
|
};
|
||||||
|
|
||||||
|
for (size_t i=0; enums[i]; i++) {
|
||||||
|
char* str = get_attr_target_string(enums[i], NV_CTRL_TARGET_TYPE_GPU, 0);
|
||||||
|
if (!str)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
std::stringstream ss (str);
|
||||||
|
while (std::getline(ss, token, ',')) {
|
||||||
|
parse_token(token, params);
|
||||||
|
}
|
||||||
|
free(str);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!try_stoi(nvctrl_info.load, params["graphics"]))
|
||||||
|
nvctrl_info.load = 0;
|
||||||
|
if (!try_stoi(nvctrl_info.CoreClock, params["nvclock"]))
|
||||||
|
nvctrl_info.CoreClock = 0;
|
||||||
|
if (!try_stoi(nvctrl_info.MemClock, params["memclock"]))
|
||||||
|
nvctrl_info.MemClock = 0;
|
||||||
|
|
||||||
|
int64_t temp = 0;
|
||||||
|
nvctrl.XNVCTRLQueryTargetAttribute64(display,
|
||||||
|
NV_CTRL_TARGET_TYPE_GPU,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
NV_CTRL_GPU_CORE_TEMPERATURE,
|
||||||
|
&temp);
|
||||||
|
nvctrl_info.temp = temp;
|
||||||
|
|
||||||
|
int64_t memtotal = 0;
|
||||||
|
nvctrl.XNVCTRLQueryTargetAttribute64(display,
|
||||||
|
NV_CTRL_TARGET_TYPE_GPU,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
NV_CTRL_TOTAL_DEDICATED_GPU_MEMORY,
|
||||||
|
&memtotal);
|
||||||
|
nvctrl_info.memoryTotal = memtotal;
|
||||||
|
|
||||||
|
int64_t memused = 0;
|
||||||
|
nvctrl.XNVCTRLQueryTargetAttribute64(display,
|
||||||
|
NV_CTRL_TARGET_TYPE_GPU,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
NV_CTRL_USED_DEDICATED_GPU_MEMORY,
|
||||||
|
&memused);
|
||||||
|
nvctrl_info.memoryUsed = memused;
|
||||||
|
}
|
@ -0,0 +1,14 @@
|
|||||||
|
struct nvctrlInfo{
|
||||||
|
int load;
|
||||||
|
int temp;
|
||||||
|
float memoryUsed;
|
||||||
|
float memoryTotal;
|
||||||
|
int MemClock;
|
||||||
|
int CoreClock;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern struct nvctrlInfo nvctrl_info;
|
||||||
|
extern bool nvctrlSuccess;
|
||||||
|
bool checkXNVCtrl(void);
|
||||||
|
void getNvctrlInfo(void);
|
||||||
|
char *get_attr_target_string(int attr, int target_type, int target_id);
|
Loading…
Reference in New Issue