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
|
enum nzProcessorCap
|
||||||
{
|
{
|
||||||
|
nzProcessorCap_x64,
|
||||||
nzProcessorCap_AVX,
|
nzProcessorCap_AVX,
|
||||||
nzProcessorCap_FMA3,
|
nzProcessorCap_FMA3,
|
||||||
nzProcessorCap_FMA4,
|
nzProcessorCap_FMA4,
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue