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