summaryrefslogtreecommitdiffstats
path: root/gfx/angle/checkout/src/gpu_info_util/SystemInfo.h
diff options
context:
space:
mode:
Diffstat (limited to 'gfx/angle/checkout/src/gpu_info_util/SystemInfo.h')
-rw-r--r--gfx/angle/checkout/src/gpu_info_util/SystemInfo.h179
1 files changed, 179 insertions, 0 deletions
diff --git a/gfx/angle/checkout/src/gpu_info_util/SystemInfo.h b/gfx/angle/checkout/src/gpu_info_util/SystemInfo.h
new file mode 100644
index 0000000000..7347404ae7
--- /dev/null
+++ b/gfx/angle/checkout/src/gpu_info_util/SystemInfo.h
@@ -0,0 +1,179 @@
+//
+// Copyright 2013 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// SystemInfo.h: gathers information available without starting a GPU driver.
+
+#ifndef GPU_INFO_UTIL_SYSTEM_INFO_H_
+#define GPU_INFO_UTIL_SYSTEM_INFO_H_
+
+#include <cstdint>
+#include <optional>
+#include <string>
+#include <vector>
+
+namespace angle
+{
+
+using VendorID = uint32_t;
+using DeviceID = uint32_t;
+using RevisionID = uint32_t;
+using SystemDeviceID = uint64_t;
+using DriverID = uint32_t;
+
+struct VersionInfo
+{
+ uint32_t major = 0;
+ uint32_t minor = 0;
+ uint32_t subMinor = 0;
+ uint32_t patch = 0;
+};
+
+struct GPUDeviceInfo
+{
+ GPUDeviceInfo();
+ ~GPUDeviceInfo();
+
+ GPUDeviceInfo(const GPUDeviceInfo &other);
+
+ VendorID vendorId = 0;
+ DeviceID deviceId = 0;
+ RevisionID revisionId = 0;
+ SystemDeviceID systemDeviceId = 0;
+
+ std::string driverVendor;
+ std::string driverVersion;
+ std::string driverDate;
+
+ // Fields only available via GetSystemInfoVulkan:
+ VersionInfo detailedDriverVersion;
+ DriverID driverId = 0;
+ uint32_t driverApiVersion = 0;
+};
+
+struct SystemInfo
+{
+ SystemInfo();
+ ~SystemInfo();
+
+ SystemInfo(const SystemInfo &other);
+
+ bool hasNVIDIAGPU() const;
+ bool hasIntelGPU() const;
+ bool hasAMDGPU() const;
+
+ // Returns the index to `gpus` if the entry matches the preferred device string.
+ std::optional<size_t> getPreferredGPUIndex() const;
+
+ std::vector<GPUDeviceInfo> gpus;
+
+ // Index of the GPU expected to be used for 3D graphics. Based on a best-guess heuristic on
+ // some platforms. On Windows, this is accurate. Note `gpus` must be checked for empty before
+ // indexing.
+ int activeGPUIndex = 0;
+
+ bool isOptimus = false;
+ bool isAMDSwitchable = false;
+ // Only true on dual-GPU Mac laptops.
+ bool isMacSwitchable = false;
+ // Only true on Apple Silicon Macs when running in macCatalyst.
+ bool needsEAGLOnMac = false;
+
+ // Only available on Android
+ std::string machineManufacturer;
+ int androidSdkLevel = 0;
+
+ // Only available on macOS and Android
+ std::string machineModelName;
+
+ // Only available on macOS
+ std::string machineModelVersion;
+};
+
+// Gathers information about the system without starting a GPU driver and returns them in `info`.
+// Returns true if all info was gathered, false otherwise. Even when false is returned, `info` will
+// be filled with partial information.
+bool GetSystemInfo(SystemInfo *info);
+
+// Vulkan-specific info collection.
+bool GetSystemInfoVulkan(SystemInfo *info);
+
+// Known PCI vendor IDs
+constexpr VendorID kVendorID_AMD = 0x1002;
+constexpr VendorID kVendorID_ARM = 0x13B5;
+constexpr VendorID kVendorID_Broadcom = 0x14E4;
+constexpr VendorID kVendorID_GOOGLE = 0x1AE0;
+constexpr VendorID kVendorID_ImgTec = 0x1010;
+constexpr VendorID kVendorID_Intel = 0x8086;
+constexpr VendorID kVendorID_NVIDIA = 0x10DE;
+constexpr VendorID kVendorID_Qualcomm = 0x5143;
+constexpr VendorID kVendorID_VMWare = 0x15ad;
+constexpr VendorID kVendorID_Apple = 0x106B;
+constexpr VendorID kVendorID_Microsoft = 0x1414;
+
+// Known non-PCI (i.e. Khronos-registered) vendor IDs
+constexpr VendorID kVendorID_Vivante = 0x10001;
+constexpr VendorID kVendorID_VeriSilicon = 0x10002;
+constexpr VendorID kVendorID_Kazan = 0x10003;
+constexpr VendorID kVendorID_CodePlay = 0x10004;
+constexpr VendorID kVendorID_Mesa = 0x10005;
+constexpr VendorID kVendorID_PoCL = 0x10006;
+
+// Known device IDs
+constexpr DeviceID kDeviceID_Swiftshader = 0xC0DE;
+constexpr DeviceID kDeviceID_Adreno540 = 0x5040001;
+constexpr DeviceID kDeviceID_UHD630Mobile = 0x3E9B;
+
+// Predicates on vendor IDs
+bool IsAMD(VendorID vendorId);
+bool IsARM(VendorID vendorId);
+bool IsBroadcom(VendorID vendorId);
+bool IsImgTec(VendorID vendorId);
+bool IsIntel(VendorID vendorId);
+bool IsKazan(VendorID vendorId);
+bool IsNVIDIA(VendorID vendorId);
+bool IsQualcomm(VendorID vendorId);
+bool IsGoogle(VendorID vendorId);
+bool IsSwiftshader(VendorID vendorId);
+bool IsVeriSilicon(VendorID vendorId);
+bool IsVMWare(VendorID vendorId);
+bool IsVivante(VendorID vendorId);
+bool IsApple(VendorID vendorId);
+bool IsMicrosoft(VendorID vendorId);
+
+// Returns a readable vendor name given the VendorID
+std::string VendorName(VendorID vendor);
+
+// Use a heuristic to attempt to find the GPU used for 3D graphics. Sets activeGPUIndex,
+// isOptimus, and isAMDSwitchable.
+// Always assumes the non-Intel GPU is active on dual-GPU machines.
+void GetDualGPUInfo(SystemInfo *info);
+
+// Dumps the system info to stdout.
+void PrintSystemInfo(const SystemInfo &info);
+
+VersionInfo ParseNvidiaDriverVersion(uint32_t version);
+
+#if defined(ANGLE_PLATFORM_MACOS) || defined(ANGLE_PLATFORM_MACCATALYST)
+// Helper to get the active GPU ID from a given Core Graphics display ID.
+uint64_t GetGpuIDFromDisplayID(uint32_t displayID);
+
+// Helper to get the active GPU ID from an OpenGL display mask.
+uint64_t GetGpuIDFromOpenGLDisplayMask(uint32_t displayMask);
+
+// Get VendorID from metal device's registry ID
+VendorID GetVendorIDFromMetalDeviceRegistryID(uint64_t registryID);
+#endif
+
+uint64_t GetSystemDeviceIdFromParts(uint32_t highPart, uint32_t lowPart);
+uint32_t GetSystemDeviceIdHighPart(uint64_t systemDeviceId);
+uint32_t GetSystemDeviceIdLowPart(uint64_t systemDeviceId);
+
+// Returns lower-case of ANGLE_PREFERRED_DEVICE environment variable contents.
+std::string GetPreferredDeviceString();
+
+} // namespace angle
+
+#endif // GPU_INFO_UTIL_SYSTEM_INFO_H_