#include "common/platform_helpers.h"
#include "common/debug.h"
#include <tuple>
#ifdef ANGLE_PLATFORM_WINDOWS
# include <windows.h>
#endif
namespace angle
{
namespace
{
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)
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
#else
return false;
#endif
}
bool IsWindowsVersionInRange(VersionTriple greaterOrEqual, VersionTriple lessThan)
{
ASSERT(greaterOrEqual < lessThan);
return IsWindowsVersionOrLater(greaterOrEqual) && !IsWindowsVersionOrLater(lessThan);
}
}
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);
}
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()
{
return IsWindowsVersionOrLater(kVersionWindows11);
}
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
}
}