xref: /aosp_15_r20/external/angle/src/libANGLE/renderer/driver_utils.h (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
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 "common/platform_helpers.h"
14 #include "libANGLE/angletypes.h"
15 
16 namespace rx
17 {
18 
19 enum VendorID : uint32_t
20 {
21     VENDOR_ID_UNKNOWN = 0x0,
22     VENDOR_ID_AMD     = 0x1002,
23     VENDOR_ID_APPLE   = 0x106B,
24     VENDOR_ID_ARM     = 0x13B5,
25     // Broadcom devices won't use PCI, but this is their Vulkan vendor id.
26     VENDOR_ID_BROADCOM  = 0x14E4,
27     VENDOR_ID_GOOGLE    = 0x1AE0,
28     VENDOR_ID_INTEL     = 0x8086,
29     VENDOR_ID_MESA      = 0x10005,
30     VENDOR_ID_MICROSOFT = 0x1414,
31     VENDOR_ID_NVIDIA    = 0x10DE,
32     VENDOR_ID_POWERVR   = 0x1010,
33 #if defined(ANGLE_PLATFORM_WINDOWS)
34     // Qualcomm devices on Windows are ACPI, and use a different vendor ID than Android.
35     VENDOR_ID_QUALCOMM = 0x4D4F4351,
36 #else
37     // This is Qualcomm PCI Vendor ID.
38     // Android doesn't have a PCI bus, but all we need is a unique id.
39     VENDOR_ID_QUALCOMM = 0x5143,
40 #endif
41     VENDOR_ID_SAMSUNG = 0x144D,
42     VENDOR_ID_VIVANTE = 0x9999,
43     VENDOR_ID_VMWARE  = 0x15AD,
44     VENDOR_ID_VIRTIO  = 0x1AF4,
45 };
46 
47 enum AndroidDeviceID : uint32_t
48 {
49     ANDROID_DEVICE_ID_UNKNOWN     = 0x0,
50     ANDROID_DEVICE_ID_NEXUS5X     = 0x4010800,
51     ANDROID_DEVICE_ID_PIXEL2      = 0x5040001,
52     ANDROID_DEVICE_ID_PIXEL1XL    = 0x5030004,
53     ANDROID_DEVICE_ID_PIXEL4      = 0x6040001,
54     ANDROID_DEVICE_ID_GALAXYA23   = 0x6010901,
55     ANDROID_DEVICE_ID_GALAXYS23   = 0x43050A01,
56     ANDROID_DEVICE_ID_SWIFTSHADER = 0xC0DE,
57 };
58 
IsAMD(uint32_t vendorId)59 inline bool IsAMD(uint32_t vendorId)
60 {
61     return vendorId == VENDOR_ID_AMD;
62 }
63 
IsAppleGPU(uint32_t vendorId)64 inline bool IsAppleGPU(uint32_t vendorId)
65 {
66     return vendorId == VENDOR_ID_APPLE;
67 }
68 
IsARM(uint32_t vendorId)69 inline bool IsARM(uint32_t vendorId)
70 {
71     return vendorId == VENDOR_ID_ARM;
72 }
73 
IsBroadcom(uint32_t vendorId)74 inline bool IsBroadcom(uint32_t vendorId)
75 {
76     return vendorId == VENDOR_ID_BROADCOM;
77 }
78 
IsIntel(uint32_t vendorId)79 inline bool IsIntel(uint32_t vendorId)
80 {
81     return vendorId == VENDOR_ID_INTEL;
82 }
83 
IsGoogle(uint32_t vendorId)84 inline bool IsGoogle(uint32_t vendorId)
85 {
86     return vendorId == VENDOR_ID_GOOGLE;
87 }
88 
IsMicrosoft(uint32_t vendorId)89 inline bool IsMicrosoft(uint32_t vendorId)
90 {
91     return vendorId == VENDOR_ID_MICROSOFT;
92 }
93 
IsNvidia(uint32_t vendorId)94 inline bool IsNvidia(uint32_t vendorId)
95 {
96     return vendorId == VENDOR_ID_NVIDIA;
97 }
98 
IsPowerVR(uint32_t vendorId)99 inline bool IsPowerVR(uint32_t vendorId)
100 {
101     return vendorId == VENDOR_ID_POWERVR;
102 }
103 
IsQualcomm(uint32_t vendorId)104 inline bool IsQualcomm(uint32_t vendorId)
105 {
106     return vendorId == VENDOR_ID_QUALCOMM;
107 }
108 
IsSamsung(uint32_t vendorId)109 inline bool IsSamsung(uint32_t vendorId)
110 {
111     return vendorId == VENDOR_ID_SAMSUNG;
112 }
113 
IsVivante(uint32_t vendorId)114 inline bool IsVivante(uint32_t vendorId)
115 {
116     return vendorId == VENDOR_ID_VIVANTE;
117 }
118 
IsVMWare(uint32_t vendorId)119 inline bool IsVMWare(uint32_t vendorId)
120 {
121     return vendorId == VENDOR_ID_VMWARE;
122 }
123 
IsVirtIO(uint32_t vendorId)124 inline bool IsVirtIO(uint32_t vendorId)
125 {
126     return vendorId == VENDOR_ID_VIRTIO;
127 }
128 
IsNexus5X(uint32_t vendorId,uint32_t deviceId)129 inline bool IsNexus5X(uint32_t vendorId, uint32_t deviceId)
130 {
131     return IsQualcomm(vendorId) && deviceId == ANDROID_DEVICE_ID_NEXUS5X;
132 }
133 
IsPixel1XL(uint32_t vendorId,uint32_t deviceId)134 inline bool IsPixel1XL(uint32_t vendorId, uint32_t deviceId)
135 {
136     return IsQualcomm(vendorId) && deviceId == ANDROID_DEVICE_ID_PIXEL1XL;
137 }
138 
IsPixel2(uint32_t vendorId,uint32_t deviceId)139 inline bool IsPixel2(uint32_t vendorId, uint32_t deviceId)
140 {
141     return IsQualcomm(vendorId) && deviceId == ANDROID_DEVICE_ID_PIXEL2;
142 }
143 
IsPixel4(uint32_t vendorId,uint32_t deviceId)144 inline bool IsPixel4(uint32_t vendorId, uint32_t deviceId)
145 {
146     return IsQualcomm(vendorId) && deviceId == ANDROID_DEVICE_ID_PIXEL4;
147 }
148 
IsGalaxyA23(uint32_t vendorId,uint32_t deviceId)149 inline bool IsGalaxyA23(uint32_t vendorId, uint32_t deviceId)
150 {
151     return IsQualcomm(vendorId) && deviceId == ANDROID_DEVICE_ID_GALAXYA23;
152 }
153 
IsGalaxyS23(uint32_t vendorId,uint32_t deviceId)154 inline bool IsGalaxyS23(uint32_t vendorId, uint32_t deviceId)
155 {
156     return IsQualcomm(vendorId) && deviceId == ANDROID_DEVICE_ID_GALAXYS23;
157 }
158 
IsSwiftshader(uint32_t vendorId,uint32_t deviceId)159 inline bool IsSwiftshader(uint32_t vendorId, uint32_t deviceId)
160 {
161     return IsGoogle(vendorId) && deviceId == ANDROID_DEVICE_ID_SWIFTSHADER;
162 }
163 
164 std::string GetVendorString(uint32_t vendorId);
165 
166 // For Linux, Intel graphics driver version is the Mesa version. The version number has three
167 // fields: major revision, minor revision and release number.
168 // For Windows, The version number includes 3rd and 4th fields. Please refer the details at
169 // http://www.intel.com/content/www/us/en/support/graphics-drivers/000005654.html.
170 // Current implementation only supports Windows.
171 class IntelDriverVersion
172 {
173   public:
174     IntelDriverVersion(uint32_t buildNumber);
175     IntelDriverVersion(uint32_t majorVersion, uint32_t minorVersion);
176     bool operator==(const IntelDriverVersion &) const;
177     bool operator!=(const IntelDriverVersion &) const;
178     bool operator<(const IntelDriverVersion &) const;
179     bool operator>=(const IntelDriverVersion &) const;
180 
181   private:
182     uint32_t mBuildNumber;
183 };
184 
185 IntelDriverVersion ParseIntelWindowsDriverVersion(uint32_t driverVersion);
186 
187 bool IsSandyBridge(uint32_t DeviceId);
188 bool IsIvyBridge(uint32_t DeviceId);
189 bool IsHaswell(uint32_t DeviceId);
190 bool IsBroadwell(uint32_t DeviceId);
191 bool IsCherryView(uint32_t DeviceId);
192 bool IsSkylake(uint32_t DeviceId);
193 bool IsBroxton(uint32_t DeviceId);
194 bool IsKabyLake(uint32_t DeviceId);
195 bool IsGeminiLake(uint32_t DeviceId);
196 bool IsCoffeeLake(uint32_t DeviceId);
197 bool IsMeteorLake(uint32_t DeviceId);
198 bool Is9thGenIntel(uint32_t DeviceId);
199 bool Is11thGenIntel(uint32_t DeviceId);
200 bool Is12thGenIntel(uint32_t DeviceId);
201 
202 using ARMDriverVersion = angle::VersionTriple;
203 ARMDriverVersion ParseARMVulkanDriverVersion(uint32_t driverVersion);
204 
205 using QualcommDriverVersion = angle::VersionTriple;
206 QualcommDriverVersion ParseQualcommVulkanDriverVersion(uint32_t driverVersion);
207 
208 // Platform helpers
209 using angle::IsAndroid;
210 using angle::IsApple;
211 using angle::IsChromeOS;
212 using angle::IsFuchsia;
213 using angle::IsIOS;
214 using angle::IsLinux;
215 using angle::IsMac;
216 using angle::IsWindows;
217 using angle::IsWindows10OrLater;
218 using angle::IsWindows8OrLater;
219 using angle::IsWindowsVistaOrLater;
220 
221 bool IsWayland();
222 
223 using OSVersion = angle::VersionTriple;
224 
225 OSVersion GetMacOSVersion();
226 
227 OSVersion GetiOSVersion();
228 
229 OSVersion GetLinuxOSVersion();
230 
231 int GetAndroidSDKVersion();
232 
233 }  // namespace rx
234 #endif  // LIBANGLE_RENDERER_DRIVER_UTILS_H_
235