diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt index a4e29bbd83..65bde1f060 100644 --- a/common/CMakeLists.txt +++ b/common/CMakeLists.txt @@ -174,9 +174,6 @@ else() target_compile_definitions(common PRIVATE "HAS_LIBBACKTRACE=1") target_link_libraries(common PRIVATE libbacktrace::libbacktrace) endif() - if(${CMAKE_SYSTEM_NAME} STREQUAL "FreeBSD") - target_link_libraries(common PRIVATE cpuinfo) - endif() endif() set_source_files_properties(PrecompiledHeader.cpp PROPERTIES HEADER_FILE_ONLY TRUE) @@ -206,6 +203,7 @@ target_link_libraries(common PRIVATE JPEG::JPEG PNG::PNG WebP::libwebp + cpuinfo ) target_link_libraries(common PUBLIC diff --git a/common/Darwin/DarwinMisc.cpp b/common/Darwin/DarwinMisc.cpp index 86cc2e7ba1..1a3b76d6b3 100644 --- a/common/Darwin/DarwinMisc.cpp +++ b/common/Darwin/DarwinMisc.cpp @@ -271,7 +271,7 @@ std::vector DarwinMisc::GetCPUClasses() } else if (std::optional physcpu = sysctlbyname_T("hw.physicalcpu")) { - out.push_back({"Default", *physcpu, sysctlbyname_T("hw.logicalcpu").value_or(0)}); + out.push_back({"Default", *physcpu, sysctlbyname_T("hw.logicalcpu").value_or(*physcpu)}); } else { @@ -281,6 +281,35 @@ std::vector DarwinMisc::GetCPUClasses() return out; } +static CPUInfo CalcCPUInfo() +{ + CPUInfo out; + char name[256]; + size_t name_size = sizeof(name); + if (0 != sysctlbyname("machdep.cpu.brand_string", name, &name_size, nullptr, 0)) + strcpy(name, "Unknown"); + out.name = name; + if (sysctlbyname_T("sysctl.proc_translated").value_or(0)) + out.name += " (Rosetta)"; + std::vector classes = DarwinMisc::GetCPUClasses(); + out.num_clusters = static_cast(classes.size()); + out.num_big_cores = classes.empty() ? 0 : classes[0].num_physical; + out.num_threads = classes.empty() ? 0 : classes[0].num_logical; + out.num_small_cores = 0; + for (std::size_t i = 1; i < classes.size(); i++) + { + out.num_small_cores += classes[i].num_physical; + out.num_threads += classes[i].num_logical; + } + return out; +} + +const CPUInfo& GetCPUInfo() +{ + static const CPUInfo info = CalcCPUInfo(); + return info; +} + size_t HostSys::GetRuntimePageSize() { return sysctlbyname_T("hw.pagesize").value_or(0); diff --git a/common/HostSys.cpp b/common/HostSys.cpp index 01300588e4..3a677be230 100644 --- a/common/HostSys.cpp +++ b/common/HostSys.cpp @@ -5,6 +5,10 @@ #include "Console.h" #include "VectorIntrin.h" +#ifndef __APPLE__ +#include "cpuinfo.h" +#endif + static u32 PAUSE_TIME = 0; static void MultiPause() @@ -135,3 +139,43 @@ void AbortWithMessage(const char* msg) #endif abort(); } + +#ifndef __APPLE__ +// MacOS version is in DarwinMisc +static CPUInfo CalcCPUInfo() +{ + CPUInfo out; + out.name = cpuinfo_get_package(0)->name; + out.num_threads = cpuinfo_get_processors_count(); + out.num_clusters = cpuinfo_get_clusters_count(); + out.num_big_cores = 0; + out.num_small_cores = 0; + const cpuinfo_cluster* clusters = cpuinfo_get_clusters(); + uint64_t big_freq = 0; + for (uint32_t i = 0; i < out.num_clusters; i++) + { + const cpuinfo_cluster& cluster = clusters[i]; + if (cluster.frequency > big_freq) + { + out.num_small_cores += out.num_big_cores; + out.num_big_cores = cluster.core_count; + big_freq = cluster.frequency; + } + else if (cluster.frequency == big_freq) + { + out.num_big_cores += cluster.core_count; + } + else + { + out.num_small_cores += cluster.core_count; + } + } + return out; +} + +const CPUInfo& GetCPUInfo() +{ + static const CPUInfo info = CalcCPUInfo(); + return info; +} +#endif diff --git a/common/HostSys.h b/common/HostSys.h index 08eb31232c..5b8dddbd19 100644 --- a/common/HostSys.h +++ b/common/HostSys.h @@ -192,6 +192,16 @@ extern const u32 SPIN_TIME_NS; extern std::string GetOSVersionString(); +struct CPUInfo { + std::string name; + u32 num_big_cores; + u32 num_small_cores; + u32 num_threads; + u32 num_clusters; +}; + +const CPUInfo& GetCPUInfo(); + namespace Common { /// Enables or disables the screen saver from starting. diff --git a/common/common.vcxproj b/common/common.vcxproj index 6ff5dd2b14..e19f7e18a3 100644 --- a/common/common.vcxproj +++ b/common/common.vcxproj @@ -32,6 +32,7 @@ + %(AdditionalIncludeDirectories);$(SolutionDir)3rdparty\cpuinfo\include %(AdditionalIncludeDirectories);$(SolutionDir)3rdparty\fast_float\include %(AdditionalIncludeDirectories);$(SolutionDir)3rdparty\fmt\include %(AdditionalIncludeDirectories);$(SolutionDir)3rdparty\jpgd @@ -191,4 +192,4 @@ - \ No newline at end of file +