1*8975f5c5SAndroid Build Coastguard Worker // 2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2013 The ANGLE Project Authors. All rights reserved. 3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file. 5*8975f5c5SAndroid Build Coastguard Worker // 6*8975f5c5SAndroid Build Coastguard Worker 7*8975f5c5SAndroid Build Coastguard Worker // SystemInfo.h: gathers information available without starting a GPU driver. 8*8975f5c5SAndroid Build Coastguard Worker 9*8975f5c5SAndroid Build Coastguard Worker #ifndef GPU_INFO_UTIL_SYSTEM_INFO_H_ 10*8975f5c5SAndroid Build Coastguard Worker #define GPU_INFO_UTIL_SYSTEM_INFO_H_ 11*8975f5c5SAndroid Build Coastguard Worker 12*8975f5c5SAndroid Build Coastguard Worker #include <cstdint> 13*8975f5c5SAndroid Build Coastguard Worker #include <optional> 14*8975f5c5SAndroid Build Coastguard Worker #include <string> 15*8975f5c5SAndroid Build Coastguard Worker #include <vector> 16*8975f5c5SAndroid Build Coastguard Worker 17*8975f5c5SAndroid Build Coastguard Worker namespace angle 18*8975f5c5SAndroid Build Coastguard Worker { 19*8975f5c5SAndroid Build Coastguard Worker 20*8975f5c5SAndroid Build Coastguard Worker using VendorID = uint32_t; 21*8975f5c5SAndroid Build Coastguard Worker using DeviceID = uint32_t; 22*8975f5c5SAndroid Build Coastguard Worker using RevisionID = uint32_t; 23*8975f5c5SAndroid Build Coastguard Worker using SystemDeviceID = uint64_t; 24*8975f5c5SAndroid Build Coastguard Worker using DriverID = uint32_t; 25*8975f5c5SAndroid Build Coastguard Worker 26*8975f5c5SAndroid Build Coastguard Worker struct VersionInfo 27*8975f5c5SAndroid Build Coastguard Worker { 28*8975f5c5SAndroid Build Coastguard Worker uint32_t major = 0; 29*8975f5c5SAndroid Build Coastguard Worker uint32_t minor = 0; 30*8975f5c5SAndroid Build Coastguard Worker uint32_t subMinor = 0; 31*8975f5c5SAndroid Build Coastguard Worker uint32_t patch = 0; 32*8975f5c5SAndroid Build Coastguard Worker }; 33*8975f5c5SAndroid Build Coastguard Worker 34*8975f5c5SAndroid Build Coastguard Worker struct GPUDeviceInfo 35*8975f5c5SAndroid Build Coastguard Worker { 36*8975f5c5SAndroid Build Coastguard Worker GPUDeviceInfo(); 37*8975f5c5SAndroid Build Coastguard Worker ~GPUDeviceInfo(); 38*8975f5c5SAndroid Build Coastguard Worker 39*8975f5c5SAndroid Build Coastguard Worker GPUDeviceInfo(const GPUDeviceInfo &other); 40*8975f5c5SAndroid Build Coastguard Worker 41*8975f5c5SAndroid Build Coastguard Worker VendorID vendorId = 0; 42*8975f5c5SAndroid Build Coastguard Worker DeviceID deviceId = 0; 43*8975f5c5SAndroid Build Coastguard Worker RevisionID revisionId = 0; 44*8975f5c5SAndroid Build Coastguard Worker SystemDeviceID systemDeviceId = 0; 45*8975f5c5SAndroid Build Coastguard Worker 46*8975f5c5SAndroid Build Coastguard Worker std::string driverVendor; 47*8975f5c5SAndroid Build Coastguard Worker std::string driverVersion; 48*8975f5c5SAndroid Build Coastguard Worker std::string driverDate; 49*8975f5c5SAndroid Build Coastguard Worker 50*8975f5c5SAndroid Build Coastguard Worker // Fields only available via GetSystemInfoVulkan: 51*8975f5c5SAndroid Build Coastguard Worker VersionInfo detailedDriverVersion; 52*8975f5c5SAndroid Build Coastguard Worker DriverID driverId = 0; 53*8975f5c5SAndroid Build Coastguard Worker uint32_t driverApiVersion = 0; 54*8975f5c5SAndroid Build Coastguard Worker }; 55*8975f5c5SAndroid Build Coastguard Worker 56*8975f5c5SAndroid Build Coastguard Worker struct SystemInfo 57*8975f5c5SAndroid Build Coastguard Worker { 58*8975f5c5SAndroid Build Coastguard Worker SystemInfo(); 59*8975f5c5SAndroid Build Coastguard Worker ~SystemInfo(); 60*8975f5c5SAndroid Build Coastguard Worker 61*8975f5c5SAndroid Build Coastguard Worker SystemInfo(const SystemInfo &other); 62*8975f5c5SAndroid Build Coastguard Worker 63*8975f5c5SAndroid Build Coastguard Worker bool hasNVIDIAGPU() const; 64*8975f5c5SAndroid Build Coastguard Worker bool hasIntelGPU() const; 65*8975f5c5SAndroid Build Coastguard Worker bool hasAMDGPU() const; 66*8975f5c5SAndroid Build Coastguard Worker 67*8975f5c5SAndroid Build Coastguard Worker // Returns the index to `gpus` if the entry matches the preferred device string. 68*8975f5c5SAndroid Build Coastguard Worker std::optional<size_t> getPreferredGPUIndex() const; 69*8975f5c5SAndroid Build Coastguard Worker 70*8975f5c5SAndroid Build Coastguard Worker std::vector<GPUDeviceInfo> gpus; 71*8975f5c5SAndroid Build Coastguard Worker 72*8975f5c5SAndroid Build Coastguard Worker // Index of the GPU expected to be used for 3D graphics. Based on a best-guess heuristic on 73*8975f5c5SAndroid Build Coastguard Worker // some platforms. On Windows, this is accurate. Note `gpus` must be checked for empty before 74*8975f5c5SAndroid Build Coastguard Worker // indexing. 75*8975f5c5SAndroid Build Coastguard Worker int activeGPUIndex = 0; 76*8975f5c5SAndroid Build Coastguard Worker 77*8975f5c5SAndroid Build Coastguard Worker bool isOptimus = false; 78*8975f5c5SAndroid Build Coastguard Worker bool isAMDSwitchable = false; 79*8975f5c5SAndroid Build Coastguard Worker // Only true on dual-GPU Mac laptops. 80*8975f5c5SAndroid Build Coastguard Worker bool isMacSwitchable = false; 81*8975f5c5SAndroid Build Coastguard Worker 82*8975f5c5SAndroid Build Coastguard Worker // Only available on Android 83*8975f5c5SAndroid Build Coastguard Worker std::string machineManufacturer; 84*8975f5c5SAndroid Build Coastguard Worker int androidSdkLevel = 0; 85*8975f5c5SAndroid Build Coastguard Worker 86*8975f5c5SAndroid Build Coastguard Worker // Only available on macOS and Android 87*8975f5c5SAndroid Build Coastguard Worker std::string machineModelName; 88*8975f5c5SAndroid Build Coastguard Worker 89*8975f5c5SAndroid Build Coastguard Worker // Only available on macOS 90*8975f5c5SAndroid Build Coastguard Worker std::string machineModelVersion; 91*8975f5c5SAndroid Build Coastguard Worker }; 92*8975f5c5SAndroid Build Coastguard Worker 93*8975f5c5SAndroid Build Coastguard Worker // Gathers information about the system without starting a GPU driver and returns them in `info`. 94*8975f5c5SAndroid Build Coastguard Worker // Returns true if all info was gathered, false otherwise. Even when false is returned, `info` will 95*8975f5c5SAndroid Build Coastguard Worker // be filled with partial information. 96*8975f5c5SAndroid Build Coastguard Worker bool GetSystemInfo(SystemInfo *info); 97*8975f5c5SAndroid Build Coastguard Worker 98*8975f5c5SAndroid Build Coastguard Worker // Vulkan-specific info collection. 99*8975f5c5SAndroid Build Coastguard Worker bool GetSystemInfoVulkan(SystemInfo *info); 100*8975f5c5SAndroid Build Coastguard Worker 101*8975f5c5SAndroid Build Coastguard Worker // Known PCI vendor IDs 102*8975f5c5SAndroid Build Coastguard Worker constexpr VendorID kVendorID_AMD = 0x1002; 103*8975f5c5SAndroid Build Coastguard Worker constexpr VendorID kVendorID_ARM = 0x13B5; 104*8975f5c5SAndroid Build Coastguard Worker constexpr VendorID kVendorID_Broadcom = 0x14E4; 105*8975f5c5SAndroid Build Coastguard Worker constexpr VendorID kVendorID_GOOGLE = 0x1AE0; 106*8975f5c5SAndroid Build Coastguard Worker constexpr VendorID kVendorID_ImgTec = 0x1010; 107*8975f5c5SAndroid Build Coastguard Worker constexpr VendorID kVendorID_Intel = 0x8086; 108*8975f5c5SAndroid Build Coastguard Worker constexpr VendorID kVendorID_NVIDIA = 0x10DE; 109*8975f5c5SAndroid Build Coastguard Worker constexpr VendorID kVendorID_Qualcomm = 0x5143; 110*8975f5c5SAndroid Build Coastguard Worker constexpr VendorID kVendorID_Samsung = 0x144D; 111*8975f5c5SAndroid Build Coastguard Worker constexpr VendorID kVendorID_VMWare = 0x15ad; 112*8975f5c5SAndroid Build Coastguard Worker constexpr VendorID kVendorID_Apple = 0x106B; 113*8975f5c5SAndroid Build Coastguard Worker constexpr VendorID kVendorID_Microsoft = 0x1414; 114*8975f5c5SAndroid Build Coastguard Worker constexpr VendorID kVendorID_VirtIO = 0x1AF4; 115*8975f5c5SAndroid Build Coastguard Worker 116*8975f5c5SAndroid Build Coastguard Worker // Known non-PCI (i.e. Khronos-registered) vendor IDs 117*8975f5c5SAndroid Build Coastguard Worker constexpr VendorID kVendorID_Vivante = 0x10001; 118*8975f5c5SAndroid Build Coastguard Worker constexpr VendorID kVendorID_VeriSilicon = 0x10002; 119*8975f5c5SAndroid Build Coastguard Worker constexpr VendorID kVendorID_Kazan = 0x10003; 120*8975f5c5SAndroid Build Coastguard Worker constexpr VendorID kVendorID_CodePlay = 0x10004; 121*8975f5c5SAndroid Build Coastguard Worker constexpr VendorID kVendorID_Mesa = 0x10005; 122*8975f5c5SAndroid Build Coastguard Worker constexpr VendorID kVendorID_PoCL = 0x10006; 123*8975f5c5SAndroid Build Coastguard Worker 124*8975f5c5SAndroid Build Coastguard Worker // Known device IDs 125*8975f5c5SAndroid Build Coastguard Worker constexpr DeviceID kDeviceID_Swiftshader = 0xC0DE; 126*8975f5c5SAndroid Build Coastguard Worker constexpr DeviceID kDeviceID_Adreno540 = 0x5040001; 127*8975f5c5SAndroid Build Coastguard Worker constexpr DeviceID kDeviceID_Adreno750 = 0x43051401; 128*8975f5c5SAndroid Build Coastguard Worker constexpr DeviceID kDeviceID_UHD630Mobile = 0x3E9B; 129*8975f5c5SAndroid Build Coastguard Worker 130*8975f5c5SAndroid Build Coastguard Worker // Predicates on vendor IDs 131*8975f5c5SAndroid Build Coastguard Worker bool IsAMD(VendorID vendorId); 132*8975f5c5SAndroid Build Coastguard Worker bool IsARM(VendorID vendorId); 133*8975f5c5SAndroid Build Coastguard Worker bool IsBroadcom(VendorID vendorId); 134*8975f5c5SAndroid Build Coastguard Worker bool IsImgTec(VendorID vendorId); 135*8975f5c5SAndroid Build Coastguard Worker bool IsIntel(VendorID vendorId); 136*8975f5c5SAndroid Build Coastguard Worker bool IsKazan(VendorID vendorId); 137*8975f5c5SAndroid Build Coastguard Worker bool IsNVIDIA(VendorID vendorId); 138*8975f5c5SAndroid Build Coastguard Worker bool IsQualcomm(VendorID vendorId); 139*8975f5c5SAndroid Build Coastguard Worker bool IsSamsung(VendorID vendorId); 140*8975f5c5SAndroid Build Coastguard Worker bool IsGoogle(VendorID vendorId); 141*8975f5c5SAndroid Build Coastguard Worker bool IsSwiftshader(VendorID vendorId); 142*8975f5c5SAndroid Build Coastguard Worker bool IsVeriSilicon(VendorID vendorId); 143*8975f5c5SAndroid Build Coastguard Worker bool IsVMWare(VendorID vendorId); 144*8975f5c5SAndroid Build Coastguard Worker bool IsVirtIO(VendorID vendorId); 145*8975f5c5SAndroid Build Coastguard Worker bool IsVivante(VendorID vendorId); 146*8975f5c5SAndroid Build Coastguard Worker bool IsAppleGPU(VendorID vendorId); 147*8975f5c5SAndroid Build Coastguard Worker bool IsMicrosoft(VendorID vendorId); 148*8975f5c5SAndroid Build Coastguard Worker 149*8975f5c5SAndroid Build Coastguard Worker // Returns a readable vendor name given the VendorID 150*8975f5c5SAndroid Build Coastguard Worker std::string VendorName(VendorID vendor); 151*8975f5c5SAndroid Build Coastguard Worker 152*8975f5c5SAndroid Build Coastguard Worker // Use a heuristic to attempt to find the GPU used for 3D graphics. Sets activeGPUIndex, 153*8975f5c5SAndroid Build Coastguard Worker // isOptimus, and isAMDSwitchable. 154*8975f5c5SAndroid Build Coastguard Worker // Always assumes the non-Intel GPU is active on dual-GPU machines. 155*8975f5c5SAndroid Build Coastguard Worker void GetDualGPUInfo(SystemInfo *info); 156*8975f5c5SAndroid Build Coastguard Worker 157*8975f5c5SAndroid Build Coastguard Worker // Dumps the system info to stdout. 158*8975f5c5SAndroid Build Coastguard Worker void PrintSystemInfo(const SystemInfo &info); 159*8975f5c5SAndroid Build Coastguard Worker 160*8975f5c5SAndroid Build Coastguard Worker VersionInfo ParseNvidiaDriverVersion(uint32_t version); 161*8975f5c5SAndroid Build Coastguard Worker VersionInfo ParseMesaDriverVersion(uint32_t version); 162*8975f5c5SAndroid Build Coastguard Worker 163*8975f5c5SAndroid Build Coastguard Worker uint64_t GetSystemDeviceIdFromParts(uint32_t highPart, uint32_t lowPart); 164*8975f5c5SAndroid Build Coastguard Worker uint32_t GetSystemDeviceIdHighPart(uint64_t systemDeviceId); 165*8975f5c5SAndroid Build Coastguard Worker uint32_t GetSystemDeviceIdLowPart(uint64_t systemDeviceId); 166*8975f5c5SAndroid Build Coastguard Worker 167*8975f5c5SAndroid Build Coastguard Worker // Returns lower-case of ANGLE_PREFERRED_DEVICE environment variable contents. 168*8975f5c5SAndroid Build Coastguard Worker std::string GetPreferredDeviceString(); 169*8975f5c5SAndroid Build Coastguard Worker 170*8975f5c5SAndroid Build Coastguard Worker } // namespace angle 171*8975f5c5SAndroid Build Coastguard Worker 172*8975f5c5SAndroid Build Coastguard Worker #endif // GPU_INFO_UTIL_SYSTEM_INFO_H_ 173