diff --git a/benchmarks/mangohud/Makefile b/benchmarks/mangohud/Makefile index 2be3c8377b8f..3ba206c81ed3 100644 --- a/benchmarks/mangohud/Makefile +++ b/benchmarks/mangohud/Makefile @@ -1,53 +1,54 @@ # Created by: Alexey Dokuchaev PORTNAME= mangohud PORTVERSION= 0.6.5 +PORTREVISION= 1 DISTVERSIONPREFIX= v CATEGORIES= benchmarks graphics MASTER_SITES= https://wrapdb.mesonbuild.com/v1/projects/imgui/1.81/1/get_zip?dummy=/:igw DISTFILES= imgui-1.81-1-wrap.zip:igw MAINTAINER= danfe@FreeBSD.org COMMENT= Vulkan/OpenGL overlay for CPU/GPU monitoring LICENSE= MIT LICENSE_FILE= ${WRKSRC}/LICENSE BUILD_DEPENDS= glslangValidator:graphics/glslang \ ${LOCALBASE}/share/vulkan/registry/vk.xml:graphics/vulkan-headers \ ${PYTHON_PKGNAMEPREFIX}mako>=0:textproc/py-mako@${PY_FLAVOR} LIB_DEPENDS= libinotify.so:devel/libinotify USES= compiler:c++14-lang meson pkgconfig python:build xorg USE_GITHUB= yes GH_ACCOUNT= flightlessmango ocornut:ig GH_PROJECT= MangoHud imgui:ig GH_TAGNAME= v1.81:ig GH_SUBDIR= subprojects/imgui-1.81:ig USE_XORG= x11 MESON_ARGS= -Duse_system_vulkan=enabled -Dwith_xnvctrl=disabled CPPFLAGS+= -DPROCDIR=\\\"${LINUXBASE}/proc\\\" PLIST_FILES= bin/mangohud lib/mangohud/libMangoHud.so \ lib/mangohud/libMangoHud_dlsym.so man/man1/mangohud.1.gz \ share/vulkan/implicit_layer.d/MangoHud.json PORTEXAMPLES= MangoHud.conf.example OPTIONS_DEFINE= DBUS EXAMPLES OPTIONS_DEFAULT= DBUS DBUS_LIB_DEPENDS= libdbus-1.so:devel/dbus DBUS_MESON_OFF= -Dwith_dbus=disabled post-patch: @${REINPLACE_CMD} -e 's,cygwin,${OPSYS:tl}, ; \ /^prog_python = /s,3,${PYTHON_VER},' ${WRKSRC}/meson.build @${REINPLACE_CMD} -e 's,/usr/share/doc,${PREFIX}/share/examples,' \ ${WRKSRC}/data/mangohud.1 @${REINPLACE_CMD} -e 's,libdl\.so,ld-elf.so,' \ ${WRKSRC}/src/real_dlsym.cpp @${REINPLACE_CMD} -e 's,def __gnu_linux__,ndef _WIN32,' \ ${WRKSRC}/src/logging.cpp .include diff --git a/benchmarks/mangohud/files/patch-src_cpu.cpp b/benchmarks/mangohud/files/patch-src_cpu.cpp new file mode 100644 index 000000000000..8f40b66beeeb --- /dev/null +++ b/benchmarks/mangohud/files/patch-src_cpu.cpp @@ -0,0 +1,72 @@ +--- src/cpu.cpp.orig 2021-07-08 06:23:59 UTC ++++ src/cpu.cpp +@@ -227,6 +227,7 @@ bool CPUStats::UpdateCPUData() + + bool CPUStats::UpdateCoreMhz() { + m_coreMhz.clear(); ++#if defined(__linux__) + std::ifstream cpuInfo(PROCCPUINFOFILE); + std::string row; + size_t i = 0; +@@ -238,6 +239,13 @@ bool CPUStats::UpdateCoreMhz() { + i++; + } + } ++#elif defined(__FreeBSD__) ++ char sysctl_name[32]; ++ for (int i = 0; i < m_cpuData.size(); i++) { ++ snprintf(sysctl_name, sizeof(sysctl_name), "dev.cpu.%d.freq", i); ++ m_cpuData[i].mhz = read_sysctl(sysctl_name); ++ } ++#endif + m_cpuDataTotal.cpu_mhz = 0; + for (auto data : m_cpuData) + m_cpuDataTotal.cpu_mhz += data.mhz; +@@ -246,6 +254,7 @@ bool CPUStats::UpdateCoreMhz() { + } + + bool CPUStats::UpdateCpuTemp() { ++#if defined(__linux__) + if (!m_cpuTempFile) + return false; + +@@ -256,6 +265,23 @@ bool CPUStats::UpdateCpuTemp() { + m_cpuDataTotal.temp = temp / 1000; + + return ret; ++#elif defined(__FreeBSD__) ++ char sysctl_name[32]; ++ int dK, i, temp; ++ for (temp = i = 0; i < m_cpuData.size(); i++) { ++ snprintf(sysctl_name, sizeof(sysctl_name), "dev.cpu.%d.temperature", i); ++ dK = read_sysctl(sysctl_name); ++ if (dK < 0) { ++ // If we could not read some core's temperature, store ++ // the last read (bogus) value and return false early. ++ m_cpuDataTotal.temp = dK; ++ return false; ++ } ++ temp += dK - 2731; ++ } ++ m_cpuDataTotal.temp = temp / (10 * m_cpuData.size()); ++ return m_cpuDataTotal.temp > 0; ++#endif + } + + static bool get_cpu_power_k10temp(CPUPowerData* cpuPowerData, int& power) { +@@ -407,6 +433,7 @@ static bool find_fallback_temp_input(const std::string + return false; + } + ++#ifdef __linux__ + bool CPUStats::GetCpuFile() { + if (m_cpuTempFile) + return true; +@@ -447,6 +474,7 @@ bool CPUStats::GetCpuFile() { + } + return true; + } ++#endif + + static bool find_input(const std::string& path, const char* input_prefix, std::string& input, const std::string& name) + { diff --git a/benchmarks/mangohud/files/patch-src_file__utils.cpp b/benchmarks/mangohud/files/patch-src_file__utils.cpp index 4ae32c1fc2b2..6aeba2b796d7 100644 --- a/benchmarks/mangohud/files/patch-src_file__utils.cpp +++ b/benchmarks/mangohud/files/patch-src_file__utils.cpp @@ -1,28 +1,65 @@ --- src/file_utils.cpp.orig 2021-07-08 06:23:59 UTC +++ src/file_utils.cpp -@@ -109,7 +109,7 @@ std::string read_symlink(const char * link) +@@ -2,6 +2,7 @@ + #include "string_utils.h" + #include + #include ++#include + #include + #include + #include +@@ -107,9 +108,36 @@ std::string read_symlink(const char * link) + return std::string(result, (count > 0) ? count : 0); + } ++template <> ++int read_sysctl(const char* name) ++{ ++ int value; ++ size_t len = sizeof(value); ++ ++ if (sysctlbyname(name, &value, &len, NULL, 0) == 0) ++ return value; ++ else return -1; ++} ++ ++template <> ++std::string read_sysctl(const char* name) ++{ ++ size_t len; ++ ++ // How large buffer do we need? ++ if (sysctlbyname(name, NULL, &len, NULL, 0) != 0) ++ return ""; ++ ++ char value[len]; ++ // Now read the actual value into it. ++ if (sysctlbyname(name, value, &len, NULL, 0) == 0) ++ return value; ++ else return ""; ++} ++ std::string get_exe_path() { - return read_symlink("/proc/self/exe"); + return read_symlink(PROCDIR "/self/exe"); } std::string get_wine_exe_name(bool keep_ext) -@@ -119,14 +119,14 @@ std::string get_wine_exe_name(bool keep_ext) +@@ -119,14 +147,14 @@ std::string get_wine_exe_name(bool keep_ext) return std::string(); } - std::string line = read_line("/proc/self/comm"); // max 16 characters though + std::string line = read_line(PROCDIR "/self/comm"); // max 16 characters though if (ends_with(line, ".exe", true)) { auto dot = keep_ext ? std::string::npos : line.find_last_of('.'); return line.substr(0, dot); } - std::ifstream cmdline("/proc/self/cmdline"); + std::ifstream cmdline(PROCDIR "/self/cmdline"); // Iterate over arguments (separated by NUL byte). while (std::getline(cmdline, line, '\0')) { auto n = std::string::npos; diff --git a/benchmarks/mangohud/files/patch-src_file__utils.h b/benchmarks/mangohud/files/patch-src_file__utils.h new file mode 100644 index 000000000000..b06efb584aa7 --- /dev/null +++ b/benchmarks/mangohud/files/patch-src_file__utils.h @@ -0,0 +1,10 @@ +--- src/file_utils.h.orig 2021-07-08 06:23:59 UTC ++++ src/file_utils.h +@@ -19,6 +19,7 @@ std::vector ls(const char* root, const ch + bool file_exists(const std::string& path); + bool dir_exists(const std::string& path); + std::string read_symlink(const char * link); ++template T read_sysctl(const char*); + std::string get_exe_path(); + std::string get_wine_exe_name(bool keep_ext = false); + std::string get_home_dir(); diff --git a/benchmarks/mangohud/files/patch-src_overlay.cpp b/benchmarks/mangohud/files/patch-src_overlay.cpp new file mode 100644 index 000000000000..2b7a5c69cd11 --- /dev/null +++ b/benchmarks/mangohud/files/patch-src_overlay.cpp @@ -0,0 +1,16 @@ +--- src/overlay.cpp.orig 2021-07-08 06:23:59 UTC ++++ src/overlay.cpp +@@ -28,12 +28,11 @@ void update_hw_info(struct swapchain_stats& sw_stats, + } + if (params.enabled[OVERLAY_PARAM_ENABLED_cpu_stats] || logger->is_active()) { + cpuStats.UpdateCPUData(); +-#ifdef __gnu_linux__ +- + if (params.enabled[OVERLAY_PARAM_ENABLED_core_load] || params.enabled[OVERLAY_PARAM_ENABLED_cpu_mhz]) + cpuStats.UpdateCoreMhz(); + if (params.enabled[OVERLAY_PARAM_ENABLED_cpu_temp] || logger->is_active() || params.enabled[OVERLAY_PARAM_ENABLED_graphs]) + cpuStats.UpdateCpuTemp(); ++#ifdef __gnu_linux__ + if (params.enabled[OVERLAY_PARAM_ENABLED_cpu_power]) + cpuStats.UpdateCpuPower(); + #endif diff --git a/benchmarks/mangohud/files/patch-src_vulkan.cpp b/benchmarks/mangohud/files/patch-src_vulkan.cpp index 7c8876346f01..fcd45bb6b633 100644 --- a/benchmarks/mangohud/files/patch-src_vulkan.cpp +++ b/benchmarks/mangohud/files/patch-src_vulkan.cpp @@ -1,77 +1,81 @@ --- src/vulkan.cpp.orig 2021-07-08 06:23:59 UTC +++ src/vulkan.cpp @@ -33,7 +33,7 @@ #include #include #include -#ifdef __gnu_linux__ +#ifndef _WIN32 #include #include #endif @@ -464,10 +464,10 @@ struct overlay_draw *get_overlay_draw(struct swapchain void init_cpu_stats(overlay_params& params) { -#ifdef __gnu_linux__ auto& enabled = params.enabled; enabled[OVERLAY_PARAM_ENABLED_cpu_stats] = cpuStats.Init() && enabled[OVERLAY_PARAM_ENABLED_cpu_stats]; +#ifdef __gnu_linux__ enabled[OVERLAY_PARAM_ENABLED_cpu_temp] = cpuStats.GetCpuFile() && enabled[OVERLAY_PARAM_ENABLED_cpu_temp]; enabled[OVERLAY_PARAM_ENABLED_cpu_power] = cpuStats.InitCpuPowerData() -@@ -600,21 +600,24 @@ void init_gpu_stats(uint32_t& vendorID, overlay_params +@@ -600,21 +600,21 @@ void init_gpu_stats(uint32_t& vendorID, overlay_params } void init_system_info(){ - #ifdef __gnu_linux__ const char* ld_preload = getenv("LD_PRELOAD"); if (ld_preload) unsetenv("LD_PRELOAD"); - ram = exec("cat /proc/meminfo | grep 'MemTotal' | awk '{print $2}'"); -+ ram = exec("grep MemTotal " PROCDIR "/meminfo | awk '{print $2}'"); - trim(ram); +- trim(ram); - cpu = exec("cat /proc/cpuinfo | grep 'model name' | tail -n1 | sed 's/^.*: //' | sed 's/([^)]*)/()/g' | tr -d '(/)'"); -+ cpu = exec("grep 'model name' " PROCDIR "/cpuinfo | tail -n1 | sed 's/^.*: //' | sed 's/([^)]*)/()/g' | tr -d '(/)'"); - trim(cpu); - kernel = exec("uname -r"); - trim(kernel); - os = exec("cat /etc/*-release | grep 'PRETTY_NAME' | cut -d '=' -f 2-"); - os.erase(remove(os.begin(), os.end(), '\"' ), os.end()); - trim(os); +- trim(cpu); +- kernel = exec("uname -r"); +- trim(kernel); +- os = exec("cat /etc/*-release | grep 'PRETTY_NAME' | cut -d '=' -f 2-"); +- os.erase(remove(os.begin(), os.end(), '\"' ), os.end()); +- trim(os); - cpusched = read_line("/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor"); ++ ram = to_string(sysconf(_SC_PHYS_PAGES) * sysconf(_SC_PAGESIZE) ++ / 1024 / 1024) + " MB"; ++ cpu = read_sysctl("hw.model"); ++ kernel = to_string(read_sysctl("kern.osreldate")); ++ os = read_sysctl("kern.ostype") + " " + ++ read_sysctl("kern.osrelease"); + gpu = exec("pciconf -lv | grep -A2 ^vgapci0 | tail -1 | cut -d\\' -f2"); + trim(gpu); + driver = exec("glxinfo -B | grep 'OpenGL version' | sed 's/^.*: //'"); + trim(driver); -+ cpusched = exec("sysctl -b kern.sched.name"); ++ cpusched = read_sysctl("kern.sched.name"); const char* mangohud_recursion = getenv("MANGOHUD_RECURSION"); if (!mangohud_recursion) { -@@ -669,6 +672,8 @@ void init_system_info(){ +@@ -669,6 +669,8 @@ void init_system_info(){ else { wineVersion = ""; } + +#ifdef __gnu_linux__ // check for gamemode and vkbasalt stringstream ss; string line; -@@ -686,6 +691,7 @@ void init_system_info(){ +@@ -686,6 +688,7 @@ void init_system_info(){ if (HUDElements.gamemode_bol && HUDElements.vkbasalt_bol) break; } +#endif if (ld_preload) setenv("LD_PRELOAD", ld_preload, 1); -@@ -697,7 +703,6 @@ void init_system_info(){ +@@ -697,7 +700,6 @@ void init_system_info(){ << "Gpu:" << gpu << "\n" << "Driver:" << driver << "\n" << "CPU Scheduler:" << cpusched << std::endl; -#endif #endif }