diff options
author | Wunkolo <Wunkolo@gmail.com> | 2022-02-24 04:41:27 +0100 |
---|---|---|
committer | Wunkolo <Wunkolo@gmail.com> | 2022-03-09 22:57:47 +0100 |
commit | ec5f3351b69b6427d1e411fcc849e98705a044c3 (patch) | |
tree | c137667f61e31588ef1b07298a7e2c8a0d1a49be /src/common/x64/cpu_detect.cpp | |
parent | cpu_detect: Update array-types to `span` and `array` (diff) | |
download | yuzu-ec5f3351b69b6427d1e411fcc849e98705a044c3.tar yuzu-ec5f3351b69b6427d1e411fcc849e98705a044c3.tar.gz yuzu-ec5f3351b69b6427d1e411fcc849e98705a044c3.tar.bz2 yuzu-ec5f3351b69b6427d1e411fcc849e98705a044c3.tar.lz yuzu-ec5f3351b69b6427d1e411fcc849e98705a044c3.tar.xz yuzu-ec5f3351b69b6427d1e411fcc849e98705a044c3.tar.zst yuzu-ec5f3351b69b6427d1e411fcc849e98705a044c3.zip |
Diffstat (limited to 'src/common/x64/cpu_detect.cpp')
-rw-r--r-- | src/common/x64/cpu_detect.cpp | 37 |
1 files changed, 22 insertions, 15 deletions
diff --git a/src/common/x64/cpu_detect.cpp b/src/common/x64/cpu_detect.cpp index 23adc5c75..65369bfbe 100644 --- a/src/common/x64/cpu_detect.cpp +++ b/src/common/x64/cpu_detect.cpp @@ -3,7 +3,9 @@ #include <array> #include <cstring> +#include <iterator> #include <span> +#include <string_view> #include "common/bit_util.h" #include "common/common_types.h" #include "common/x64/cpu_detect.h" @@ -47,6 +49,17 @@ static inline u64 _xgetbv(u32 index) { namespace Common { +CPUCaps::Manufacturer CPUCaps::ParseManufacturer(std::string_view brand_string) { + if (brand_string == "GenuineIntel") { + return Manufacturer::Intel; + } else if (brand_string == "AuthenticAMD") { + return Manufacturer::AMD; + } else if (brand_string == "HygonGenuine") { + return Manufacturer::Hygon; + } + return Manufacturer::Unknown; +} + // Detects the various CPU features static CPUCaps Detect() { CPUCaps caps = {}; @@ -55,30 +68,24 @@ static CPUCaps Detect() { // yuzu at all anyway std::array<u32, 4> cpu_id; - std::memset(caps.brand_string, 0, sizeof(caps.brand_string)); - // Detect CPU's CPUID capabilities and grab CPU string + // Detect CPU's CPUID capabilities and grab manufacturer string __cpuid(cpu_id, 0x00000000); - u32 max_std_fn = cpu_id[0]; // EAX + const u32 max_std_fn = cpu_id[0]; // EAX + std::memset(caps.brand_string, 0, std::size(caps.brand_string)); std::memcpy(&caps.brand_string[0], &cpu_id[1], sizeof(u32)); std::memcpy(&caps.brand_string[4], &cpu_id[3], sizeof(u32)); std::memcpy(&caps.brand_string[8], &cpu_id[2], sizeof(u32)); - if (cpu_id[1] == 0x756e6547 && cpu_id[2] == 0x6c65746e && cpu_id[3] == 0x49656e69) - caps.manufacturer = Manufacturer::Intel; - else if (cpu_id[1] == 0x68747541 && cpu_id[2] == 0x444d4163 && cpu_id[3] == 0x69746e65) - caps.manufacturer = Manufacturer::AMD; - else if (cpu_id[1] == 0x6f677948 && cpu_id[2] == 0x656e6975 && cpu_id[3] == 0x6e65476e) - caps.manufacturer = Manufacturer::Hygon; - else - caps.manufacturer = Manufacturer::Unknown; - __cpuid(cpu_id, 0x80000000); + caps.manufacturer = CPUCaps::ParseManufacturer(caps.brand_string); + + // Set reasonable default cpu string even if brand string not available + std::strncpy(caps.cpu_string, caps.brand_string, std::size(caps.brand_string)); - u32 max_ex_fn = cpu_id[0]; + __cpuid(cpu_id, 0x80000000); - // Set reasonable default brand string even if brand string not available - std::strcpy(caps.cpu_string, caps.brand_string); + const u32 max_ex_fn = cpu_id[0]; // Detect family and other miscellaneous features if (max_std_fn >= 1) { |