22 #include <sys/sysinfo.h>
26 #if defined(IS_OSX) || defined(IS_FREEBSD)
27 #include <sys/sysctl.h>
32 #ifndef WIN32_LEAN_AND_MEAN
33 #define WIN32_LEAN_AND_MEAN 1
39 #if defined(__i386) || defined(__x86_64__) || defined(_M_IX86) || defined(_M_X64)
41 #if defined(__GNUC__) && !defined(__APPLE__)
54 uint32_t eax, ebx, ecx, edx;
61 static inline void get_cpuid(uint32_t leaf, cpuid_info &info) {
62 #if defined(__GNUC__) && !defined(__APPLE__)
63 __cpuid(leaf, info.eax, info.ebx, info.ecx, info.edx);
64 #elif defined(_MSC_VER)
65 __cpuid((
int *)info.str, leaf);
68 :
"=a" (info.eax),
"=b" (info.ebx),
"=c" (info.ecx),
"=d" (info.edx)
76 static inline uint32_t get_cpuid_max(uint32_t leaf) {
77 #if defined(__GNUC__) && !defined(__APPLE__)
78 return __get_cpuid_max(leaf,
nullptr);
81 get_cpuid(leaf, info);
92 struct sysinfo meminfo;
93 if (sysinfo(&meminfo) == 0) {
94 info->_physical_memory = meminfo.totalram;
95 info->_available_physical_memory = meminfo.freeram;
96 info->_page_file_size = meminfo.totalswap;
97 info->_available_page_file_size = meminfo.freeswap;
109 _lock(
"GraphicsPipe")
117 _supported_types = 0;
124 #if defined(__i386) || defined(__x86_64__) || defined(_M_IX86) || defined(_M_X64)
126 const uint32_t max_cpuid = get_cpuid_max(0);
127 const uint32_t max_extended = get_cpuid_max(0x80000000);
129 if (max_cpuid >= 1) {
131 std::swap(info.ecx, info.edx);
132 _display_information->_cpu_vendor_string = std::string(info.str + 4, 12);
135 _display_information->_cpu_version_information = info.eax;
136 _display_information->_cpu_brand_index = info.ebx & 0xff;
139 if (max_extended >= 0x80000004) {
141 get_cpuid(0x80000002, info);
142 memcpy(brand, info.str, 16);
143 get_cpuid(0x80000003, info);
144 memcpy(brand + 16, info.str, 16);
145 get_cpuid(0x80000004, info);
146 memcpy(brand + 32, info.str, 16);
148 _display_information->_cpu_brand_string = brand;
154 size_t len =
sizeof(uint64_t);
155 sysctlbyname(
"hw.memsize", &_display_information->_physical_memory, &len,
nullptr, 0);
156 len =
sizeof(uint64_t);
157 sysctlbyname(
"hw.cpufrequency", &_display_information->_cpu_frequency, &len,
nullptr, 0);
158 len =
sizeof(uint64_t);
159 sysctlbyname(
"hw.cpufrequency", &_display_information->_current_cpu_frequency, &len,
nullptr, 0);
160 len =
sizeof(uint64_t);
161 sysctlbyname(
"hw.cpufrequency_max", &_display_information->_maximum_cpu_frequency, &len,
nullptr, 0);
163 sysctlbyname(
"hw.physicalcpu", &_display_information->_num_cpu_cores, &len,
nullptr, 0);
165 sysctlbyname(
"hw.logicalcpu", &_display_information->_num_logical_cpus, &len,
nullptr, 0);
167 #elif defined(IS_LINUX)
168 _display_information->_get_memory_information_function = &update_memory_info;
169 update_memory_info(_display_information);
171 #elif defined(IS_FREEBSD)
172 size_t len =
sizeof(uint64_t);
173 sysctlbyname(
"hw.physmem", &_display_information->_physical_memory, &len,
nullptr, 0);
174 len =
sizeof(uint64_t);
175 sysctlbyname(
"vm.swap_total", &_display_information->_page_file_size, &len,
nullptr, 0);
177 #elif defined(_WIN32)
178 MEMORYSTATUSEX status;
179 status.dwLength =
sizeof(MEMORYSTATUSEX);
180 if (GlobalMemoryStatusEx(&status)) {
181 _display_information->_physical_memory = status.ullTotalPhys;
182 _display_information->_available_physical_memory = status.ullAvailPhys;
183 _display_information->_page_file_size = status.ullTotalPageFile;
184 _display_information->_available_page_file_size = status.ullAvailPageFile;
185 _display_information->_process_virtual_memory = status.ullTotalVirtual;
186 _display_information->_available_process_virtual_memory = status.ullAvailVirtual;
187 _display_information->_memory_load = status.dwMemoryLoad;
191 #if defined(IS_LINUX) || defined(IS_FREEBSD)
192 long nproc = sysconf(_SC_NPROCESSORS_CONF);
194 _display_information->_num_logical_cpus = nproc;
204 delete _display_information;
212 GraphicsPipe::PreferredWindowThread
233 make_device(
void *scrn) {
235 <<
"make_device() unimplemented by " << get_type() <<
"\n";
248 if (gsg !=
nullptr) {
257 make_output(
const std::string &name,
267 << get_type() <<
" cannot create buffers or windows.\n";
276 return _display_information;