// // 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 #ifdef ANGLE_PLATFORM_WINDOWS # include #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