From 21e38d853113e185c76f08df781402c6ab2f5766 Mon Sep 17 00:00:00 2001 From: Pescador Barquero Date: Tue, 21 Oct 2025 09:41:56 -0500 Subject: [PATCH] Initial FreeBSD support (#1214) --- WickedEngine/CMakeLists.txt | 2 +- WickedEngine/wiHelper.cpp | 48 ++++++++++++++++++++- WickedEngine/wiJobSystem.cpp | 7 ++- WickedEngine/wiRenderPath3D_PathTracing.cpp | 2 + WickedEngine/wiScene_Components.cpp | 2 + 5 files changed, 57 insertions(+), 4 deletions(-) diff --git a/WickedEngine/CMakeLists.txt b/WickedEngine/CMakeLists.txt index 58ff69b1e..7ab800eac 100644 --- a/WickedEngine/CMakeLists.txt +++ b/WickedEngine/CMakeLists.txt @@ -139,7 +139,7 @@ if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") target_compile_options(${TARGET_NAME} PUBLIC /arch:AVX) endif() endif() -elseif ("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "x86_64" OR "${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "AMD64" OR "${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "x86" OR "${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "i386") +elseif ("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "x86_64" OR "${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "AMD64" OR "${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "amd64" OR "${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "x86" OR "${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "i386") if (USE_AVX512) target_compile_options(${TARGET_NAME} PUBLIC -mavx512f -mavx512vl -mavx512dq -mavx2 -mbmi -mpopcnt -mlzcnt -mf16c) elseif (USE_AVX2) diff --git a/WickedEngine/wiHelper.cpp b/WickedEngine/wiHelper.cpp index 9a5971d95..aac2a8029 100644 --- a/WickedEngine/wiHelper.cpp +++ b/WickedEngine/wiHelper.cpp @@ -34,7 +34,13 @@ #include #endif // _WIN32 -#ifdef PLATFORM_LINUX +#if defined(__FREEBSD__) +#include +#include +#include +#include +#pragma comment(lib,"kvm") +#elif defined(PLATFORM_LINUX) #include #endif // PLATFORM_LINUX @@ -1348,12 +1354,22 @@ namespace wi::helper std::string GetExecutablePath() { -#ifdef _WIN32 +#if defined(_WIN32) wchar_t wstr[1024] = {}; GetModuleFileName(NULL, wstr, arraysize(wstr)); char str[1024] = {}; StringConvert(wstr, str, arraysize(str)); return str; +#elif defined(__FREEBSD__) + int name[] = { CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1 }; + char str[MAXPATHLEN] = {}; + size_t length; + int error = sysctl(name, 4, str, &length, NULL, 0); + if (error < 0 || length <= 1) { + // sysctl failed + return std::string(); + } + return std::string(str, length); #else return std::filesystem::canonical("/proc/self/exe").string(); #endif // _WIN32 @@ -1958,6 +1974,34 @@ namespace wi::helper GetProcessMemoryInfo(GetCurrentProcess(), (PROCESS_MEMORY_COUNTERS*)&pmc, sizeof(pmc)); mem.process_physical = pmc.WorkingSetSize; mem.process_virtual = pmc.PrivateUsage; +#elif defined(__FREEBSD__) + static uint64_t phys_mem = 0; + static uint64_t swap_mem = 0; + size_t sysctl_buf_s; + int page_size = getpagesize(); + if (phys_mem == 0) + { + int phys_mem_name[] = { CTL_HW, HW_PHYSMEM }; + sysctl_buf_s = sizeof(phys_mem); + sysctl(phys_mem_name, 2, &phys_mem, &sysctl_buf_s, NULL, 0); + kvm_t *kvm; + if ((kvm = kvm_open(NULL, "/dev/null", "/dev/null", O_RDONLY, "GetMemoryUsage")) != NULL) + { + struct kvm_swap swap; + if (kvm_getswapinfo(kvm, &swap, 1, 0) == 0) + swap_mem = swap.ksw_total * page_size; + kvm_close(kvm); + } + } + mem.total_physical = phys_mem; + mem.total_virtual = swap_mem; + struct kinfo_proc kinfo; + int proc_name[] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, getpid() }; + sysctl_buf_s = sizeof(struct kinfo_proc); + if (sysctl(proc_name, 4, &kinfo, &sysctl_buf_s, NULL, 0) == 0) + { + mem.process_physical = kinfo.ki_rssize * page_size; + } #elif defined(PLATFORM_LINUX) struct sysinfo info; constexpr int PAGE_SIZE = 4096; diff --git a/WickedEngine/wiJobSystem.cpp b/WickedEngine/wiJobSystem.cpp index 0d3d982e8..c1dce1606 100644 --- a/WickedEngine/wiJobSystem.cpp +++ b/WickedEngine/wiJobSystem.cpp @@ -14,6 +14,9 @@ #ifdef PLATFORM_LINUX #include +#ifdef __FREEBSD__ +#include +#endif #include #endif // PLATFORM_LINUX @@ -198,7 +201,9 @@ namespace wi::jobsystem { std::thread& worker = res.threads.emplace_back([threadID, priority, &res] { -#ifdef PLATFORM_LINUX +#if defined(__FREEBSD__) +// TODO: FreeBSD's setpriority is incompatible with the expected Linux non-standard behavior +#elif defined(PLATFORM_LINUX) // from the sched(2) manpage: // In the current [Linux 2.6.23+] implementation, each unit of diff --git a/WickedEngine/wiRenderPath3D_PathTracing.cpp b/WickedEngine/wiRenderPath3D_PathTracing.cpp index 72430445f..829af166a 100644 --- a/WickedEngine/wiRenderPath3D_PathTracing.cpp +++ b/WickedEngine/wiRenderPath3D_PathTracing.cpp @@ -12,7 +12,9 @@ #include "OpenImageDenoise/oidn.hpp" #if OIDN_VERSION_MAJOR >= 2 #define OPEN_IMAGE_DENOISE +#ifdef _WIN32 #pragma comment(lib,"OpenImageDenoise.lib") +#endif // Also provide the required DLL files from OpenImageDenoise release near the exe! #endif // OIDN_VERSION_MAJOR >= 2 #endif // __has_include("OpenImageDenoise/oidn.hpp") diff --git a/WickedEngine/wiScene_Components.cpp b/WickedEngine/wiScene_Components.cpp index c491f0e99..e63e405c6 100644 --- a/WickedEngine/wiScene_Components.cpp +++ b/WickedEngine/wiScene_Components.cpp @@ -18,7 +18,9 @@ #include "OpenImageDenoise/oidn.hpp" #if OIDN_VERSION_MAJOR >= 2 #define OPEN_IMAGE_DENOISE +#ifdef _WIN32 #pragma comment(lib,"OpenImageDenoise.lib") +#endif // Also provide the required DLL files from OpenImageDenoise release near the exe! #endif // OIDN_VERSION_MAJOR >= 2 #endif // __has_include("OpenImageDenoise/oidn.hpp")