xref: /aosp_15_r20/external/angle/src/common/platform_helpers.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2023 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 // platform_helpers.cpp: implementations for platform identification functions
8*8975f5c5SAndroid Build Coastguard Worker // which require runtime detections.
9*8975f5c5SAndroid Build Coastguard Worker 
10*8975f5c5SAndroid Build Coastguard Worker #include "common/platform_helpers.h"
11*8975f5c5SAndroid Build Coastguard Worker #include "common/debug.h"
12*8975f5c5SAndroid Build Coastguard Worker 
13*8975f5c5SAndroid Build Coastguard Worker #include <tuple>
14*8975f5c5SAndroid Build Coastguard Worker 
15*8975f5c5SAndroid Build Coastguard Worker #ifdef ANGLE_PLATFORM_WINDOWS
16*8975f5c5SAndroid Build Coastguard Worker #    include <windows.h>
17*8975f5c5SAndroid Build Coastguard Worker #endif
18*8975f5c5SAndroid Build Coastguard Worker 
19*8975f5c5SAndroid Build Coastguard Worker namespace angle
20*8975f5c5SAndroid Build Coastguard Worker {
21*8975f5c5SAndroid Build Coastguard Worker 
22*8975f5c5SAndroid Build Coastguard Worker namespace
23*8975f5c5SAndroid Build Coastguard Worker {
24*8975f5c5SAndroid Build Coastguard Worker 
25*8975f5c5SAndroid Build Coastguard Worker // Windows version constants, for range check functions
26*8975f5c5SAndroid Build Coastguard Worker constexpr VersionTriple kVersionWindowsXP    = VersionTriple(5, 1, 0);
27*8975f5c5SAndroid Build Coastguard Worker constexpr VersionTriple kVersionWindowsVista = VersionTriple(6, 0, 0);
28*8975f5c5SAndroid Build Coastguard Worker constexpr VersionTriple kVersionWindows7     = VersionTriple(6, 1, 0);
29*8975f5c5SAndroid Build Coastguard Worker constexpr VersionTriple kVersionWindows8     = VersionTriple(6, 2, 0);
30*8975f5c5SAndroid Build Coastguard Worker constexpr VersionTriple kVersionWindows10    = VersionTriple(10, 0, 0);
31*8975f5c5SAndroid Build Coastguard Worker constexpr VersionTriple kVersionWindows11    = VersionTriple(10, 0, 22000);
32*8975f5c5SAndroid Build Coastguard Worker 
IsWindowsVersionOrLater(VersionTriple greaterOrEqual)33*8975f5c5SAndroid Build Coastguard Worker bool IsWindowsVersionOrLater(VersionTriple greaterOrEqual)
34*8975f5c5SAndroid Build Coastguard Worker {
35*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_PLATFORM_WINDOWS)
36*8975f5c5SAndroid Build Coastguard Worker #    if defined(ANGLE_ENABLE_WINDOWS_UWP)
37*8975f5c5SAndroid Build Coastguard Worker     // Windows UWP does not provide access to the VerifyVersionInfo API, nor
38*8975f5c5SAndroid Build Coastguard Worker     // the versionhelpers.h functions. To work around this, always treat UWP
39*8975f5c5SAndroid Build Coastguard Worker     // applications as running on Windows 10 (which is when UWP was
40*8975f5c5SAndroid Build Coastguard Worker     // introduced).
41*8975f5c5SAndroid Build Coastguard Worker     return greaterOrEqual >= kVersionWindows10;
42*8975f5c5SAndroid Build Coastguard Worker #    else
43*8975f5c5SAndroid Build Coastguard Worker     OSVERSIONINFOEXW osvi;
44*8975f5c5SAndroid Build Coastguard Worker     DWORDLONG dwlConditionMask = 0;
45*8975f5c5SAndroid Build Coastguard Worker 
46*8975f5c5SAndroid Build Coastguard Worker     dwlConditionMask = VerSetConditionMask(dwlConditionMask, VER_MAJORVERSION, VER_GREATER_EQUAL);
47*8975f5c5SAndroid Build Coastguard Worker     dwlConditionMask = VerSetConditionMask(dwlConditionMask, VER_MINORVERSION, VER_GREATER_EQUAL);
48*8975f5c5SAndroid Build Coastguard Worker     dwlConditionMask = VerSetConditionMask(dwlConditionMask, VER_BUILDNUMBER, VER_GREATER_EQUAL);
49*8975f5c5SAndroid Build Coastguard Worker 
50*8975f5c5SAndroid Build Coastguard Worker     osvi                     = {};
51*8975f5c5SAndroid Build Coastguard Worker     osvi.dwOSVersionInfoSize = sizeof(osvi);
52*8975f5c5SAndroid Build Coastguard Worker     osvi.dwMajorVersion      = greaterOrEqual.majorVersion;
53*8975f5c5SAndroid Build Coastguard Worker     osvi.dwMinorVersion      = greaterOrEqual.minorVersion;
54*8975f5c5SAndroid Build Coastguard Worker     osvi.dwBuildNumber       = greaterOrEqual.patchVersion;
55*8975f5c5SAndroid Build Coastguard Worker 
56*8975f5c5SAndroid Build Coastguard Worker     return VerifyVersionInfoW(&osvi, VER_MAJORVERSION | VER_MINORVERSION | VER_BUILDNUMBER,
57*8975f5c5SAndroid Build Coastguard Worker                               dwlConditionMask) != FALSE;
58*8975f5c5SAndroid Build Coastguard Worker #    endif  // ANGLE_ENABLE_WINDOWS_UWP
59*8975f5c5SAndroid Build Coastguard Worker #else
60*8975f5c5SAndroid Build Coastguard Worker     return false;
61*8975f5c5SAndroid Build Coastguard Worker #endif  // ANGLE_PLATFORM_WINDOWS
62*8975f5c5SAndroid Build Coastguard Worker }
63*8975f5c5SAndroid Build Coastguard Worker 
IsWindowsVersionInRange(VersionTriple greaterOrEqual,VersionTriple lessThan)64*8975f5c5SAndroid Build Coastguard Worker bool IsWindowsVersionInRange(VersionTriple greaterOrEqual, VersionTriple lessThan)
65*8975f5c5SAndroid Build Coastguard Worker {
66*8975f5c5SAndroid Build Coastguard Worker     // This function is checking (greaterOrEqual <= WindowsVersion < lessThan),
67*8975f5c5SAndroid Build Coastguard Worker     // for when you need to match a specific Windows release.
68*8975f5c5SAndroid Build Coastguard Worker     ASSERT(greaterOrEqual < lessThan);
69*8975f5c5SAndroid Build Coastguard Worker     return IsWindowsVersionOrLater(greaterOrEqual) && !IsWindowsVersionOrLater(lessThan);
70*8975f5c5SAndroid Build Coastguard Worker }
71*8975f5c5SAndroid Build Coastguard Worker 
72*8975f5c5SAndroid Build Coastguard Worker }  // namespace
73*8975f5c5SAndroid Build Coastguard Worker 
operator ==(const VersionTriple & a,const VersionTriple & b)74*8975f5c5SAndroid Build Coastguard Worker bool operator==(const VersionTriple &a, const VersionTriple &b)
75*8975f5c5SAndroid Build Coastguard Worker {
76*8975f5c5SAndroid Build Coastguard Worker     return std::tie(a.majorVersion, a.minorVersion, a.patchVersion) ==
77*8975f5c5SAndroid Build Coastguard Worker            std::tie(b.majorVersion, b.minorVersion, b.patchVersion);
78*8975f5c5SAndroid Build Coastguard Worker }
operator !=(const VersionTriple & a,const VersionTriple & b)79*8975f5c5SAndroid Build Coastguard Worker bool operator!=(const VersionTriple &a, const VersionTriple &b)
80*8975f5c5SAndroid Build Coastguard Worker {
81*8975f5c5SAndroid Build Coastguard Worker     return std::tie(a.majorVersion, a.minorVersion, a.patchVersion) !=
82*8975f5c5SAndroid Build Coastguard Worker            std::tie(b.majorVersion, b.minorVersion, b.patchVersion);
83*8975f5c5SAndroid Build Coastguard Worker }
operator <(const VersionTriple & a,const VersionTriple & b)84*8975f5c5SAndroid Build Coastguard Worker bool operator<(const VersionTriple &a, const VersionTriple &b)
85*8975f5c5SAndroid Build Coastguard Worker {
86*8975f5c5SAndroid Build Coastguard Worker     return std::tie(a.majorVersion, a.minorVersion, a.patchVersion) <
87*8975f5c5SAndroid Build Coastguard Worker            std::tie(b.majorVersion, b.minorVersion, b.patchVersion);
88*8975f5c5SAndroid Build Coastguard Worker }
operator >=(const VersionTriple & a,const VersionTriple & b)89*8975f5c5SAndroid Build Coastguard Worker bool operator>=(const VersionTriple &a, const VersionTriple &b)
90*8975f5c5SAndroid Build Coastguard Worker {
91*8975f5c5SAndroid Build Coastguard Worker     return std::tie(a.majorVersion, a.minorVersion, a.patchVersion) >=
92*8975f5c5SAndroid Build Coastguard Worker            std::tie(b.majorVersion, b.minorVersion, b.patchVersion);
93*8975f5c5SAndroid Build Coastguard Worker }
94*8975f5c5SAndroid Build Coastguard Worker 
95*8975f5c5SAndroid Build Coastguard Worker //
96*8975f5c5SAndroid Build Coastguard Worker // Exact Windows version checks
97*8975f5c5SAndroid Build Coastguard Worker //
98*8975f5c5SAndroid Build Coastguard Worker 
IsWindowsXP()99*8975f5c5SAndroid Build Coastguard Worker bool IsWindowsXP()
100*8975f5c5SAndroid Build Coastguard Worker {
101*8975f5c5SAndroid Build Coastguard Worker     return IsWindowsVersionInRange(kVersionWindowsXP, kVersionWindowsVista);
102*8975f5c5SAndroid Build Coastguard Worker }
103*8975f5c5SAndroid Build Coastguard Worker 
IsWindowsVista()104*8975f5c5SAndroid Build Coastguard Worker bool IsWindowsVista()
105*8975f5c5SAndroid Build Coastguard Worker {
106*8975f5c5SAndroid Build Coastguard Worker     return IsWindowsVersionInRange(kVersionWindowsVista, kVersionWindows7);
107*8975f5c5SAndroid Build Coastguard Worker }
108*8975f5c5SAndroid Build Coastguard Worker 
IsWindows7()109*8975f5c5SAndroid Build Coastguard Worker bool IsWindows7()
110*8975f5c5SAndroid Build Coastguard Worker {
111*8975f5c5SAndroid Build Coastguard Worker     return IsWindowsVersionInRange(kVersionWindows7, kVersionWindows8);
112*8975f5c5SAndroid Build Coastguard Worker }
113*8975f5c5SAndroid Build Coastguard Worker 
IsWindows8()114*8975f5c5SAndroid Build Coastguard Worker bool IsWindows8()
115*8975f5c5SAndroid Build Coastguard Worker {
116*8975f5c5SAndroid Build Coastguard Worker     return IsWindowsVersionInRange(kVersionWindows8, kVersionWindows10);
117*8975f5c5SAndroid Build Coastguard Worker }
118*8975f5c5SAndroid Build Coastguard Worker 
IsWindows10()119*8975f5c5SAndroid Build Coastguard Worker bool IsWindows10()
120*8975f5c5SAndroid Build Coastguard Worker {
121*8975f5c5SAndroid Build Coastguard Worker     return IsWindowsVersionInRange(kVersionWindows10, kVersionWindows11);
122*8975f5c5SAndroid Build Coastguard Worker }
123*8975f5c5SAndroid Build Coastguard Worker 
IsWindows11()124*8975f5c5SAndroid Build Coastguard Worker bool IsWindows11()
125*8975f5c5SAndroid Build Coastguard Worker {
126*8975f5c5SAndroid Build Coastguard Worker     // There's no post-Windows 11 release yet, so this is functionally a
127*8975f5c5SAndroid Build Coastguard Worker     // "Windows 11 or later" check right now.
128*8975f5c5SAndroid Build Coastguard Worker     return IsWindowsVersionOrLater(kVersionWindows11);
129*8975f5c5SAndroid Build Coastguard Worker }
130*8975f5c5SAndroid Build Coastguard Worker 
131*8975f5c5SAndroid Build Coastguard Worker //
132*8975f5c5SAndroid Build Coastguard Worker // Windows version or later helpers
133*8975f5c5SAndroid Build Coastguard Worker //
134*8975f5c5SAndroid Build Coastguard Worker 
IsWindowsXPOrLater()135*8975f5c5SAndroid Build Coastguard Worker bool IsWindowsXPOrLater()
136*8975f5c5SAndroid Build Coastguard Worker {
137*8975f5c5SAndroid Build Coastguard Worker     return IsWindowsVersionOrLater(kVersionWindowsXP);
138*8975f5c5SAndroid Build Coastguard Worker }
139*8975f5c5SAndroid Build Coastguard Worker 
IsWindowsVistaOrLater()140*8975f5c5SAndroid Build Coastguard Worker bool IsWindowsVistaOrLater()
141*8975f5c5SAndroid Build Coastguard Worker {
142*8975f5c5SAndroid Build Coastguard Worker     return IsWindowsVersionOrLater(kVersionWindowsVista);
143*8975f5c5SAndroid Build Coastguard Worker }
144*8975f5c5SAndroid Build Coastguard Worker 
IsWindows7OrLater()145*8975f5c5SAndroid Build Coastguard Worker bool IsWindows7OrLater()
146*8975f5c5SAndroid Build Coastguard Worker {
147*8975f5c5SAndroid Build Coastguard Worker     return IsWindowsVersionOrLater(kVersionWindows7);
148*8975f5c5SAndroid Build Coastguard Worker }
149*8975f5c5SAndroid Build Coastguard Worker 
IsWindows8OrLater()150*8975f5c5SAndroid Build Coastguard Worker bool IsWindows8OrLater()
151*8975f5c5SAndroid Build Coastguard Worker {
152*8975f5c5SAndroid Build Coastguard Worker     return IsWindowsVersionOrLater(kVersionWindows8);
153*8975f5c5SAndroid Build Coastguard Worker }
154*8975f5c5SAndroid Build Coastguard Worker 
IsWindows10OrLater()155*8975f5c5SAndroid Build Coastguard Worker bool IsWindows10OrLater()
156*8975f5c5SAndroid Build Coastguard Worker {
157*8975f5c5SAndroid Build Coastguard Worker     return IsWindowsVersionOrLater(kVersionWindows10);
158*8975f5c5SAndroid Build Coastguard Worker }
159*8975f5c5SAndroid Build Coastguard Worker 
IsWindows11OrLater()160*8975f5c5SAndroid Build Coastguard Worker bool IsWindows11OrLater()
161*8975f5c5SAndroid Build Coastguard Worker {
162*8975f5c5SAndroid Build Coastguard Worker     return IsWindowsVersionOrLater(kVersionWindows11);
163*8975f5c5SAndroid Build Coastguard Worker }
164*8975f5c5SAndroid Build Coastguard Worker 
Is64Bit()165*8975f5c5SAndroid Build Coastguard Worker bool Is64Bit()
166*8975f5c5SAndroid Build Coastguard Worker {
167*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_IS_64_BIT_CPU)
168*8975f5c5SAndroid Build Coastguard Worker     return true;
169*8975f5c5SAndroid Build Coastguard Worker #else
170*8975f5c5SAndroid Build Coastguard Worker     return false;
171*8975f5c5SAndroid Build Coastguard Worker #endif  // defined(ANGLE_IS_64_BIT_CPU)
172*8975f5c5SAndroid Build Coastguard Worker }
173*8975f5c5SAndroid Build Coastguard Worker 
174*8975f5c5SAndroid Build Coastguard Worker }  // namespace angle
175