blob: dd232bfd42648d5a572372a569a90f2b20a12d4c [file] [log] [blame]
//
// 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