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