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:
parent
5c3be23a21
commit
7820a3096b
|
|
@ -9,6 +9,7 @@
|
|||
|
||||
enum nzProcessorCap
|
||||
{
|
||||
nzProcessorCap_x64,
|
||||
nzProcessorCap_AVX,
|
||||
nzProcessorCap_FMA3,
|
||||
nzProcessorCap_FMA4,
|
||||
|
|
|
|||
|
|
@ -9,20 +9,19 @@
|
|||
|
||||
#include <Nazara/Prerequesites.hpp>
|
||||
#include <Nazara/Core/Enums.hpp>
|
||||
#include <Nazara/Core/String.hpp>
|
||||
|
||||
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();
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue