intel: use json for parsing intel_gpu_top output

pull/873/head
FlightlessMango 2 years ago
parent f8ca49f627
commit ddbb4f5be1

@ -277,9 +277,9 @@ endif
if get_option('mangoapp') or get_option('mangoapp_layer') if get_option('mangoapp') or get_option('mangoapp_layer')
glfw3_dep = dependency('glfw3') glfw3_dep = dependency('glfw3')
json_dep = dependency('nlohmann_json')
endif endif
json_dep = dependency('nlohmann_json')
subdir('src') subdir('src')
if get_option('include_doc') if get_option('include_doc')

@ -2,38 +2,51 @@
#include "overlay.h" #include "overlay.h"
#include "gpu.h" #include "gpu.h"
#include "spdlog/spdlog.h" #include "spdlog/spdlog.h"
#include <nlohmann/json.hpp>
using json = nlohmann::json;
static bool init_intel = false; static bool init_intel = false;
struct gpuInfo gpu_info_intel {}; struct gpuInfo gpu_info_intel {};
void intelGpuThread(){ void intelGpuThread(){
init_intel = true; init_intel = true;
static char stdout_buffer[1024]; static char stdout_buffer[1024];
FILE* intel_gpu_top = popen("intel_gpu_top -l -s 500", "r"); FILE* intel_gpu_top = popen("intel_gpu_top -J -s 500", "r");
int num_line = 0;
std::string buf;
int num_iterations = 0;
while (fgets(stdout_buffer, sizeof(stdout_buffer), intel_gpu_top)) { while (fgets(stdout_buffer, sizeof(stdout_buffer), intel_gpu_top)) {
if (strstr(stdout_buffer, "Freq") == NULL && if (num_line > 0)
strstr(stdout_buffer, "req") == NULL) { buf += stdout_buffer;
char * pch;
pch = strtok(stdout_buffer, " "); num_line++;
int i = 0; if (strlen(stdout_buffer) < 4 && !strchr(stdout_buffer, '{') && !strchr(stdout_buffer, ',')) {
while (pch != NULL){ if (buf[0] != '{')
switch (i){ buf = "{\n" + buf;
case 0:
gpu_info_intel.CoreClock = atoi(pch); if (num_iterations > 0){
break; buf += "\n}";
case 4: json j = json::parse(buf);
gpu_info_intel.powerUsage = atof(pch); if (j.contains("engines"))
break; if (j["engines"].contains("Render/3D/0"))
case 5: if (j["engines"]["Render/3D/0"].contains("busy"))
gpu_info_intel.apu_cpu_power = atof(pch); gpu_info_intel.load = j["engines"]["Render/3D/0"]["busy"].get<int>();
break;
case 8: if (j.contains("frequency"))
gpu_info_intel.load = atoi(pch); if (j["frequency"].contains("actual"))
break; gpu_info_intel.CoreClock = j["frequency"]["actual"].get<int>();
if (j.contains("power")){
if (j["power"].contains("GPU"))
gpu_info_intel.powerUsage = j["power"]["GPU"].get<float>();
if (j["power"].contains("Package"))
gpu_info_intel.apu_cpu_power = j["power"]["Package"].get<float>();
}
} }
pch = strtok(NULL, " "); buf = "";
i++; num_line = 0;
}
} }
num_iterations++;
} }
int exitcode = pclose(intel_gpu_top) / 256; int exitcode = pclose(intel_gpu_top) / 256;

@ -186,7 +186,8 @@ vklayer_mesa_overlay = shared_library(
dep_rt, dep_rt,
dep_pthread, dep_pthread,
dep_vulkan, dep_vulkan,
windows_deps], windows_deps,
json_dep],
include_directories : [inc_common], include_directories : [inc_common],
link_args : link_args, link_args : link_args,
install_dir : libdir_mangohud, install_dir : libdir_mangohud,

Loading…
Cancel
Save