| // |
| // Copyright 2023 The ANGLE Project Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| // |
| |
| // platform_helpers.cpp: implementations for platform identification functions |
| // which require runtime detections. |
| |
| #include "common/platform_helpers.h" |
| #include "common/debug.h" |
| |
| #include <tuple> |
| |
| #ifdef ANGLE_PLATFORM_WINDOWS |
| # include <windows.h> |
| #endif |
| |
| namespace angle |
| { |
| |
| namespace |
| { |
| |
| // Windows version constants, for range check functions |
| constexpr VersionTriple kVersionWindowsXP = VersionTriple(5, 1, 0); |
| constexpr VersionTriple kVersionWindowsVista = VersionTriple(6, 0, 0); |
| constexpr VersionTriple kVersionWindows7 = VersionTriple(6, 1, 0); |
| constexpr VersionTriple kVersionWindows8 = VersionTriple(6, 2, 0); |
| constexpr VersionTriple kVersionWindows10 = VersionTriple(10, 0, 0); |
| constexpr VersionTriple kVersionWindows11 = VersionTriple(10, 0, 22000); |
| |
| bool IsWindowsVersionOrLater(VersionTriple greaterOrEqual) |
| { |
| #if defined(ANGLE_PLATFORM_WINDOWS) |
| # if defined(ANGLE_ENABLE_WINDOWS_UWP) |
| // Windows UWP does not provide access to the VerifyVersionInfo API, nor |
| // the versionhelpers.h functions. To work around this, always treat UWP |
| // applications as running on Windows 10 (which is when UWP was |
| // introduced). |
| return greaterOrEqual >= kVersionWindows10; |
| # else |
| OSVERSIONINFOEXW osvi; |
| DWORDLONG dwlConditionMask = 0; |
| |
| dwlConditionMask = VerSetConditionMask(dwlConditionMask, VER_MAJORVERSION, VER_GREATER_EQUAL); |
| dwlConditionMask = VerSetConditionMask(dwlConditionMask, VER_MINORVERSION, VER_GREATER_EQUAL); |
| dwlConditionMask = VerSetConditionMask(dwlConditionMask, VER_BUILDNUMBER, VER_GREATER_EQUAL); |
| |
| osvi = {}; |
| osvi.dwOSVersionInfoSize = sizeof(osvi); |
| osvi.dwMajorVersion = greaterOrEqual.majorVersion; |
| osvi.dwMinorVersion = greaterOrEqual.minorVersion; |
| osvi.dwBuildNumber = greaterOrEqual.patchVersion; |
| |
| return VerifyVersionInfoW(&osvi, VER_MAJORVERSION | VER_MINORVERSION | VER_BUILDNUMBER, |
| dwlConditionMask) != FALSE; |
| # endif // ANGLE_ENABLE_WINDOWS_UWP |
| #else |
| return false; |
| #endif // ANGLE_PLATFORM_WINDOWS |
| } |
| |
| bool IsWindowsVersionInRange(VersionTriple greaterOrEqual, VersionTriple lessThan) |
| { |
| // This function is checking (greaterOrEqual <= WindowsVersion < lessThan), |
| // for when you need to match a specific Windows release. |
| ASSERT(greaterOrEqual < lessThan); |
| return IsWindowsVersionOrLater(greaterOrEqual) && !IsWindowsVersionOrLater(lessThan); |
| } |
| |
| } // namespace |
| |
| bool operator==(const VersionTriple &a, const VersionTriple &b) |
| { |
| return std::tie(a.majorVersion, a.minorVersion, a.patchVersion) == |
| std::tie(b.majorVersion, b.minorVersion, b.patchVersion); |
| } |
| bool operator!=(const VersionTriple &a, const VersionTriple &b) |
| { |
| return std::tie(a.majorVersion, a.minorVersion, a.patchVersion) != |
| std::tie(b.majorVersion, b.minorVersion, b.patchVersion); |
| } |
| bool operator<(const VersionTriple &a, const VersionTriple &b) |
| { |
| return std::tie(a.majorVersion, a.minorVersion, a.patchVersion) < |
| std::tie(b.majorVersion, b.minorVersion, b.patchVersion); |
| } |
| bool operator>=(const VersionTriple &a, const VersionTriple &b) |
| { |
| return std::tie(a.majorVersion, a.minorVersion, a.patchVersion) >= |
| std::tie(b.majorVersion, b.minorVersion, b.patchVersion); |
| } |
| |
| // |
| // Exact Windows version checks |
| // |
| |
| bool IsWindowsXP() |
| { |
| return IsWindowsVersionInRange(kVersionWindowsXP, kVersionWindowsVista); |
| } |
| |
| bool IsWindowsVista() |
| { |
| return IsWindowsVersionInRange(kVersionWindowsVista, kVersionWindows7); |
| } |
| |
| bool IsWindows7() |
| { |
| return IsWindowsVersionInRange(kVersionWindows7, kVersionWindows8); |
| } |
| |
| bool IsWindows8() |
| { |
| return IsWindowsVersionInRange(kVersionWindows8, kVersionWindows10); |
| } |
| |
| bool IsWindows10() |
| { |
| return IsWindowsVersionInRange(kVersionWindows10, kVersionWindows11); |
| } |
| |
| bool IsWindows11() |
| { |
| // There's no post-Windows 11 release yet, so this is functionally a |
| // "Windows 11 or later" check right now. |
| return IsWindowsVersionOrLater(kVersionWindows11); |
| } |
| |
| // |
| // Windows version or later helpers |
| // |
| |
| bool IsWindowsXPOrLater() |
| { |
| return IsWindowsVersionOrLater(kVersionWindowsXP); |
| } |
| |
| bool IsWindowsVistaOrLater() |
| { |
| return IsWindowsVersionOrLater(kVersionWindowsVista); |
| } |
| |
| bool IsWindows7OrLater() |
| { |
| return IsWindowsVersionOrLater(kVersionWindows7); |
| } |
| |
| bool IsWindows8OrLater() |
| { |
| return IsWindowsVersionOrLater(kVersionWindows8); |
| } |
| |
| bool IsWindows10OrLater() |
| { |
| return IsWindowsVersionOrLater(kVersionWindows10); |
| } |
| |
| bool IsWindows11OrLater() |
| { |
| return IsWindowsVersionOrLater(kVersionWindows11); |
| } |
| |
| bool Is64Bit() |
| { |
| #if defined(ANGLE_IS_64_BIT_CPU) |
| return true; |
| #else |
| return false; |
| #endif // defined(ANGLE_IS_64_BIT_CPU) |
| } |
| |
| } // namespace angle |