From 7820a3096b0523678e62449e0432811ec7a4b992 Mon Sep 17 00:00:00 2001 From: Lynix Date: Thu, 13 Dec 2012 17:32:04 +0100 Subject: [PATCH] Refactored HardwareInfo -Can now return processor brand string -Can now return processor vendor name -64 bits is now a processor capability Former-commit-id: 02d0ded16911a88643f4c6799b234a7b18eebefc --- include/Nazara/Core/Enums.hpp | 1 + include/Nazara/Core/HardwareInfo.hpp | 7 ++- src/Nazara/Core/HardwareInfo.cpp | 68 ++++++++++++++++++++-------- 3 files changed, 54 insertions(+), 22 deletions(-) diff --git a/include/Nazara/Core/Enums.hpp b/include/Nazara/Core/Enums.hpp index 7aee6c70d..9a5c4badc 100644 --- a/include/Nazara/Core/Enums.hpp +++ b/include/Nazara/Core/Enums.hpp @@ -9,6 +9,7 @@ enum nzProcessorCap { + nzProcessorCap_x64, nzProcessorCap_AVX, nzProcessorCap_FMA3, nzProcessorCap_FMA4, diff --git a/include/Nazara/Core/HardwareInfo.hpp b/include/Nazara/Core/HardwareInfo.hpp index 8998a1f6a..234ceba5b 100644 --- a/include/Nazara/Core/HardwareInfo.hpp +++ b/include/Nazara/Core/HardwareInfo.hpp @@ -9,20 +9,19 @@ #include #include +#include class NAZARA_API NzHardwareInfo { public: + static NzString GetProcessorBrandString(); static unsigned int GetProcessorCount(); static nzProcessorVendor GetProcessorVendor(); - static void GetProcessorVendor(char vendor[12]); + static NzString GetProcessorVendorName(); static bool HasCapability(nzProcessorCap capability); static bool Initialize(); - - static bool Is64Bits(); - static void Uninitialize(); }; diff --git a/src/Nazara/Core/HardwareInfo.cpp b/src/Nazara/Core/HardwareInfo.cpp index 6a250f1ec..4420f144b 100644 --- a/src/Nazara/Core/HardwareInfo.cpp +++ b/src/Nazara/Core/HardwareInfo.cpp @@ -20,10 +20,27 @@ namespace { nzProcessorVendor s_vendorEnum = nzProcessorVendor_Unknown; bool s_capabilities[nzProcessorCap_Max+1] = {false}; - bool s_x64 = false; + char s_brandString[48] = "Not initialized"; char s_vendor[12] = {'C', 'P', 'U', 'i', 's', 'U', 'n', 'k', 'n', 'o', 'w', 'n'}; + const char* vendorName[nzProcessorVendor_Max+2] = // +1 pour gérer le cas Unknown + { + "Unknown", // nzProcessorVendor_Unknown + "Advanced Micro Devices", // nzProcessorVendor_AMD + "Centaur Technology", // nzProcessorVendor_Centaur + "Cyrix Corporation", // nzProcessorVendor_Cyrix + "Intel Corporation", // nzProcessorVendor_Intel + "Transmeta Corporation", // nzProcessorVendor_Transmeta + "National Semiconductor", // nzProcessorVendor_NSC + "NexGen", // nzProcessorVendor_NexGen + "Rise Technology", // nzProcessorVendor_Rise + "Silicon Integrated Systems", // nzProcessorVendor_SIS + "United Microelectronics Corporation", // nzProcessorVendor_UMC + "VIA Technologies", // nzProcessorVendor_VIA + "Vortex86", // nzProcessorVendor_Vortex + }; + struct VendorString { nzProcessorVendor vendorEnum; @@ -31,6 +48,11 @@ namespace }; } +NzString NzHardwareInfo::GetProcessorBrandString() +{ + return s_brandString; +} + unsigned int NzHardwareInfo::GetProcessorCount() { static unsigned int processorCount = std::max(NzHardwareInfoImpl::GetProcessorCount(), 1U); @@ -42,9 +64,12 @@ nzProcessorVendor NzHardwareInfo::GetProcessorVendor() return s_vendorEnum; } -void NzHardwareInfo::GetProcessorVendor(char vendor[12]) +NzString NzHardwareInfo::GetProcessorVendorName() { - std::memcpy(vendor, s_vendor, 12); + if (s_vendorEnum == nzProcessorVendor_Unknown) + return "Unknown"; + + return vendorName[s_vendorEnum]; } bool NzHardwareInfo::HasCapability(nzProcessorCap capability) @@ -114,28 +139,35 @@ bool NzHardwareInfo::Initialize() s_capabilities[nzProcessorCap_SSSE3] = (result[2] & (1U << 9)) != 0; s_capabilities[nzProcessorCap_SSE41] = (result[2] & (1U << 19)) != 0; s_capabilities[nzProcessorCap_SSE42] = (result[2] & (1U << 20)) != 0; - } - NzHardwareInfoImpl::Cpuid(0x80000000, result); - unsigned int exIds = result[0]; + NzHardwareInfoImpl::Cpuid(0x80000000, result); + unsigned int exIds = result[0]; - if (exIds >= 0x80000001) - { - NzHardwareInfoImpl::Cpuid(0x80000001, result); - s_capabilities[nzProcessorCap_FMA4] = (result[2] & (1U << 16)) != 0; - s_capabilities[nzProcessorCap_SSE4a] = (result[2] & (1U << 6)) != 0; - s_capabilities[nzProcessorCap_XOP] = (result[2] & (1U << 11)) != 0; - s_x64 = (result[3] & (1U << 29)) != 0; + if (exIds >= 0x80000001) + { + NzHardwareInfoImpl::Cpuid(0x80000001, result); + s_capabilities[nzProcessorCap_x64] = (result[3] & (1U << 29)) != 0; + s_capabilities[nzProcessorCap_FMA4] = (result[2] & (1U << 16)) != 0; + s_capabilities[nzProcessorCap_SSE4a] = (result[2] & (1U << 6)) != 0; + s_capabilities[nzProcessorCap_XOP] = (result[2] & (1U << 11)) != 0; + + if (exIds >= 0x80000004) + { + char* ptr = &s_brandString[0]; + for (nzUInt32 code = 0x80000002; code <= 0x80000004; ++code) + { + NzHardwareInfoImpl::Cpuid(code, result); + std::memcpy(ptr, &result[0], 16); + + ptr += 16; + } + } + } } return true; } -bool NzHardwareInfo::Is64Bits() -{ - return s_x64; -} - void NzHardwareInfo::Uninitialize() { // Rien à faire