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
This commit is contained in:
Lynix 2012-12-13 17:32:04 +01:00
parent 5c3be23a21
commit 7820a3096b
3 changed files with 54 additions and 22 deletions

View File

@ -9,6 +9,7 @@
enum nzProcessorCap enum nzProcessorCap
{ {
nzProcessorCap_x64,
nzProcessorCap_AVX, nzProcessorCap_AVX,
nzProcessorCap_FMA3, nzProcessorCap_FMA3,
nzProcessorCap_FMA4, nzProcessorCap_FMA4,

View File

@ -9,20 +9,19 @@
#include <Nazara/Prerequesites.hpp> #include <Nazara/Prerequesites.hpp>
#include <Nazara/Core/Enums.hpp> #include <Nazara/Core/Enums.hpp>
#include <Nazara/Core/String.hpp>
class NAZARA_API NzHardwareInfo class NAZARA_API NzHardwareInfo
{ {
public: public:
static NzString GetProcessorBrandString();
static unsigned int GetProcessorCount(); static unsigned int GetProcessorCount();
static nzProcessorVendor GetProcessorVendor(); static nzProcessorVendor GetProcessorVendor();
static void GetProcessorVendor(char vendor[12]); static NzString GetProcessorVendorName();
static bool HasCapability(nzProcessorCap capability); static bool HasCapability(nzProcessorCap capability);
static bool Initialize(); static bool Initialize();
static bool Is64Bits();
static void Uninitialize(); static void Uninitialize();
}; };

View File

@ -20,10 +20,27 @@ namespace
{ {
nzProcessorVendor s_vendorEnum = nzProcessorVendor_Unknown; nzProcessorVendor s_vendorEnum = nzProcessorVendor_Unknown;
bool s_capabilities[nzProcessorCap_Max+1] = {false}; 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'}; 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 struct VendorString
{ {
nzProcessorVendor vendorEnum; nzProcessorVendor vendorEnum;
@ -31,6 +48,11 @@ namespace
}; };
} }
NzString NzHardwareInfo::GetProcessorBrandString()
{
return s_brandString;
}
unsigned int NzHardwareInfo::GetProcessorCount() unsigned int NzHardwareInfo::GetProcessorCount()
{ {
static unsigned int processorCount = std::max(NzHardwareInfoImpl::GetProcessorCount(), 1U); static unsigned int processorCount = std::max(NzHardwareInfoImpl::GetProcessorCount(), 1U);
@ -42,9 +64,12 @@ nzProcessorVendor NzHardwareInfo::GetProcessorVendor()
return s_vendorEnum; 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) bool NzHardwareInfo::HasCapability(nzProcessorCap capability)
@ -114,7 +139,6 @@ bool NzHardwareInfo::Initialize()
s_capabilities[nzProcessorCap_SSSE3] = (result[2] & (1U << 9)) != 0; s_capabilities[nzProcessorCap_SSSE3] = (result[2] & (1U << 9)) != 0;
s_capabilities[nzProcessorCap_SSE41] = (result[2] & (1U << 19)) != 0; s_capabilities[nzProcessorCap_SSE41] = (result[2] & (1U << 19)) != 0;
s_capabilities[nzProcessorCap_SSE42] = (result[2] & (1U << 20)) != 0; s_capabilities[nzProcessorCap_SSE42] = (result[2] & (1U << 20)) != 0;
}
NzHardwareInfoImpl::Cpuid(0x80000000, result); NzHardwareInfoImpl::Cpuid(0x80000000, result);
unsigned int exIds = result[0]; unsigned int exIds = result[0];
@ -122,20 +146,28 @@ bool NzHardwareInfo::Initialize()
if (exIds >= 0x80000001) if (exIds >= 0x80000001)
{ {
NzHardwareInfoImpl::Cpuid(0x80000001, result); 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_FMA4] = (result[2] & (1U << 16)) != 0;
s_capabilities[nzProcessorCap_SSE4a] = (result[2] & (1U << 6)) != 0; s_capabilities[nzProcessorCap_SSE4a] = (result[2] & (1U << 6)) != 0;
s_capabilities[nzProcessorCap_XOP] = (result[2] & (1U << 11)) != 0; s_capabilities[nzProcessorCap_XOP] = (result[2] & (1U << 11)) != 0;
s_x64 = (result[3] & (1U << 29)) != 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; return true;
} }
bool NzHardwareInfo::Is64Bits()
{
return s_x64;
}
void NzHardwareInfo::Uninitialize() void NzHardwareInfo::Uninitialize()
{ {
// Rien à faire // Rien à faire