diff --git a/src/intel.cpp b/src/intel.cpp index f9401a09..1c9b428e 100644 --- a/src/intel.cpp +++ b/src/intel.cpp @@ -4,10 +4,15 @@ #include "spdlog/spdlog.h" #include #include +#include +#include + using json = nlohmann::json; +namespace fs = ghc::filesystem; static bool init_intel = false; struct gpuInfo gpu_info_intel {}; +FILE* fdinfo; static void intelGpuThread(bool runtime){ init_intel = true; @@ -73,8 +78,55 @@ static void intelGpuThread(bool runtime){ } } +static uint64_t get_gpu_time() { + rewind(fdinfo); + fflush(fdinfo); + char line[256]; + uint64_t val; + while (fgets(line, sizeof(line), fdinfo)){ + if(strstr(line, "drm-engine-render")) + sscanf(line, "drm-engine-render: %" SCNu64 " ns", &val); + } + + return val; +} + +static FILE* find_fd() { + DIR* dir = opendir("/proc/self/fdinfo"); + if (!dir) { + perror("Failed to open directory"); + return NULL; + } + + static uint64_t val; + static bool found_driver; + + for (const auto& entry : fs::directory_iterator("/proc/self/fdinfo")){ + FILE* file = fopen(entry.path().string().c_str(), "r"); + if (file) { + char line[256]; + while (fgets(line, sizeof(line), file)) { + if (strstr(line, "i915") != NULL) + found_driver = true; + + if (found_driver){ + if(strstr(line, "drm-engine-render")){ + sscanf(line, "drm-engine-render: %" SCNu64 " ns", &val); + if (val > 0) + return file; + } + } + } + } + fclose(file); + } + + return NULL; // Return NULL if no matching file is found +} + void getIntelGpuInfo(){ if (!init_intel){ + fdinfo = find_fd(); static bool runtime = false; static struct stat buffer; if (stat("/run/pressure-vessel", &buffer) == 0) @@ -83,5 +135,26 @@ void getIntelGpuInfo(){ std::thread(intelGpuThread, runtime).detach(); } + if (fdinfo){ + static uint64_t previous_gpu_time, previous_time, now, gpu_time_now; + gpu_time_now = get_gpu_time(); + now = os_time_get_nano(); + + if (previous_time && previous_gpu_time && gpu_time_now > previous_gpu_time){ + float time_since_last = now - previous_time; + float gpu_since_last = gpu_time_now - previous_gpu_time; + auto result = int((gpu_since_last / time_since_last) * 100); + if (result > 100) + result = 100; + + gpu_info_intel.load = result; + previous_gpu_time = gpu_time_now; + previous_time = now; + } else { + previous_gpu_time = gpu_time_now; + previous_time = now; + } + } + gpu_info = gpu_info_intel; }