1 //
2 // Copyright 2016 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5 //
6 
7 // driver_utils.h : provides more information about current driver.
8 
9 #ifndef LIBANGLE_RENDERER_DRIVER_UTILS_H_
10 #define LIBANGLE_RENDERER_DRIVER_UTILS_H_
11 
12 #include "common/platform.h"
13 #include "libANGLE/angletypes.h"
14 
15 namespace rx
16 {
17 
18 enum VendorID : uint32_t
19 {
20     VENDOR_ID_UNKNOWN = 0x0,
21     VENDOR_ID_AMD     = 0x1002,
22     VENDOR_ID_APPLE   = 0x106B,
23     VENDOR_ID_ARM     = 0x13B5,
24     // Broadcom devices won't use PCI, but this is their Vulkan vendor id.
25     VENDOR_ID_BROADCOM = 0x14E4,
26     VENDOR_ID_GOOGLE   = 0x1AE0,
27     VENDOR_ID_INTEL    = 0x8086,
28     VENDOR_ID_MESA     = 0x10005,
29     VENDOR_ID_NVIDIA   = 0x10DE,
30     VENDOR_ID_POWERVR  = 0x1010,
31     // This is Qualcomm PCI Vendor ID.
32     // Android doesn't have a PCI bus, but all we need is a unique id.
33     VENDOR_ID_QUALCOMM = 0x5143,
34     VENDOR_ID_SAMSUNG  = 0x144D,
35     VENDOR_ID_VMWARE   = 0x15AD,
36     VENDOR_ID_VIVANTE  = 0x9999,
37 };
38 
39 enum AndroidDeviceID : uint32_t
40 {
41     ANDROID_DEVICE_ID_UNKNOWN     = 0x0,
42     ANDROID_DEVICE_ID_NEXUS5X     = 0x4010800,
43     ANDROID_DEVICE_ID_PIXEL2      = 0x5040001,
44     ANDROID_DEVICE_ID_PIXEL1XL    = 0x5030004,
45     ANDROID_DEVICE_ID_PIXEL4      = 0x6040001,
46     ANDROID_DEVICE_ID_SWIFTSHADER = 0xC0DE,
47 };
48 
IsAMD(uint32_t vendorId)49 inline bool IsAMD(uint32_t vendorId)
50 {
51     return vendorId == VENDOR_ID_AMD;
52 }
53 
IsApple(uint32_t vendorId)54 inline bool IsApple(uint32_t vendorId)
55 {
56     return vendorId == VENDOR_ID_APPLE;
57 }
58 
IsARM(uint32_t vendorId)59 inline bool IsARM(uint32_t vendorId)
60 {
61     return vendorId == VENDOR_ID_ARM;
62 }
63 
IsBroadcom(uint32_t vendorId)64 inline bool IsBroadcom(uint32_t vendorId)
65 {
66     return vendorId == VENDOR_ID_BROADCOM;
67 }
68 
IsIntel(uint32_t vendorId)69 inline bool IsIntel(uint32_t vendorId)
70 {
71     return vendorId == VENDOR_ID_INTEL;
72 }
73 
IsGoogle(uint32_t vendorId)74 inline bool IsGoogle(uint32_t vendorId)
75 {
76     return vendorId == VENDOR_ID_GOOGLE;
77 }
78 
IsNvidia(uint32_t vendorId)79 inline bool IsNvidia(uint32_t vendorId)
80 {
81     return vendorId == VENDOR_ID_NVIDIA;
82 }
83 
IsPowerVR(uint32_t vendorId)84 inline bool IsPowerVR(uint32_t vendorId)
85 {
86     return vendorId == VENDOR_ID_POWERVR;
87 }
88 
IsQualcomm(uint32_t vendorId)89 inline bool IsQualcomm(uint32_t vendorId)
90 {
91     return vendorId == VENDOR_ID_QUALCOMM;
92 }
93 
IsVMWare(uint32_t vendorId)94 inline bool IsVMWare(uint32_t vendorId)
95 {
96     return vendorId == VENDOR_ID_VMWARE;
97 }
98 
IsSamsung(uint32_t vendorId)99 inline bool IsSamsung(uint32_t vendorId)
100 {
101     return vendorId == VENDOR_ID_SAMSUNG;
102 }
103 
IsVivante(uint32_t vendorId)104 inline bool IsVivante(uint32_t vendorId)
105 {
106     return vendorId == VENDOR_ID_VIVANTE;
107 }
108 
IsNexus5X(uint32_t vendorId,uint32_t deviceId)109 inline bool IsNexus5X(uint32_t vendorId, uint32_t deviceId)
110 {
111     return IsQualcomm(vendorId) && deviceId == ANDROID_DEVICE_ID_NEXUS5X;
112 }
113 
IsPixel1XL(uint32_t vendorId,uint32_t deviceId)114 inline bool IsPixel1XL(uint32_t vendorId, uint32_t deviceId)
115 {
116     return IsQualcomm(vendorId) && deviceId == ANDROID_DEVICE_ID_PIXEL1XL;
117 }
118 
IsPixel2(uint32_t vendorId,uint32_t deviceId)119 inline bool IsPixel2(uint32_t vendorId, uint32_t deviceId)
120 {
121     return IsQualcomm(vendorId) && deviceId == ANDROID_DEVICE_ID_PIXEL2;
122 }
123 
IsPixel4(uint32_t vendorId,uint32_t deviceId)124 inline bool IsPixel4(uint32_t vendorId, uint32_t deviceId)
125 {
126     return IsQualcomm(vendorId) && deviceId == ANDROID_DEVICE_ID_PIXEL4;
127 }
128 
IsSwiftshader(uint32_t vendorId,uint32_t deviceId)129 inline bool IsSwiftshader(uint32_t vendorId, uint32_t deviceId)
130 {
131     return IsGoogle(vendorId) && deviceId == ANDROID_DEVICE_ID_SWIFTSHADER;
132 }
133 
134 const char *GetVendorString(uint32_t vendorId);
135 
136 // For Linux, Intel graphics driver version is the Mesa version. The version number has three
137 // fields: major revision, minor revision and release number.
138 // For Windows, The version number includes 3rd and 4th fields. Please refer the details at
139 // http://www.intel.com/content/www/us/en/support/graphics-drivers/000005654.html.
140 // Current implementation only supports Windows.
141 class IntelDriverVersion
142 {
143   public:
144     IntelDriverVersion(uint32_t buildNumber);
145     bool operator==(const IntelDriverVersion &);
146     bool operator!=(const IntelDriverVersion &);
147     bool operator<(const IntelDriverVersion &);
148     bool operator>=(const IntelDriverVersion &);
149 
150   private:
151     uint32_t mBuildNumber;
152 };
153 
154 bool IsSandyBridge(uint32_t DeviceId);
155 bool IsIvyBridge(uint32_t DeviceId);
156 bool IsHaswell(uint32_t DeviceId);
157 bool IsBroadwell(uint32_t DeviceId);
158 bool IsCherryView(uint32_t DeviceId);
159 bool IsSkylake(uint32_t DeviceId);
160 bool IsBroxton(uint32_t DeviceId);
161 bool IsKabylake(uint32_t DeviceId);
162 bool Is9thGenIntel(uint32_t DeviceId);
163 
164 // Platform helpers
IsWindows()165 inline bool IsWindows()
166 {
167 #if defined(ANGLE_PLATFORM_WINDOWS)
168     return true;
169 #else
170     return false;
171 #endif
172 }
173 
IsLinux()174 inline bool IsLinux()
175 {
176 #if defined(ANGLE_PLATFORM_LINUX)
177     return true;
178 #else
179     return false;
180 #endif
181 }
182 
IsApple()183 inline bool IsApple()
184 {
185 #if defined(ANGLE_PLATFORM_APPLE)
186     return true;
187 #else
188     return false;
189 #endif
190 }
191 
IsMac()192 inline bool IsMac()
193 {
194 #if defined(ANGLE_PLATFORM_APPLE) && defined(ANGLE_PLATFORM_MACOS)
195     return true;
196 #else
197     return false;
198 #endif
199 }
200 
IsFuchsia()201 inline bool IsFuchsia()
202 {
203 #if defined(ANGLE_PLATFORM_FUCHSIA)
204     return true;
205 #else
206     return false;
207 #endif
208 }
209 
IsIOS()210 inline bool IsIOS()
211 {
212 #if defined(ANGLE_PLATFORM_IOS)
213     return true;
214 #else
215     return false;
216 #endif
217 }
218 
219 bool IsWayland();
220 bool IsWin10OrGreater();
221 
222 struct OSVersion
223 {
224     OSVersion();
225     OSVersion(int major, int minor, int patch);
226 
227     int majorVersion = 0;
228     int minorVersion = 0;
229     int patchVersion = 0;
230 };
231 bool operator==(const OSVersion &a, const OSVersion &b);
232 bool operator!=(const OSVersion &a, const OSVersion &b);
233 bool operator<(const OSVersion &a, const OSVersion &b);
234 bool operator>=(const OSVersion &a, const OSVersion &b);
235 
236 OSVersion GetMacOSVersion();
237 
238 OSVersion GetiOSVersion();
239 
240 OSVersion GetLinuxOSVersion();
241 
IsAndroid()242 inline bool IsAndroid()
243 {
244 #if defined(ANGLE_PLATFORM_ANDROID)
245     return true;
246 #else
247     return false;
248 #endif
249 }
250 
251 int GetAndroidSDKVersion();
252 
253 }  // namespace rx
254 #endif  // LIBANGLE_RENDERER_DRIVER_UTILS_H_
255