diff --git a/CMakeLists.txt b/CMakeLists.txt index 4776215820..b1921725f1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -347,6 +347,8 @@ add_library(Common STATIC Common/Misc.cpp Common/MsgHandler.cpp Common/MsgHandler.h + Common/OSVersion.cpp + Common/OSVersion.h Common/StringUtils.cpp Common/StringUtils.h Common/ThreadPools.cpp diff --git a/Common/Common.vcxproj b/Common/Common.vcxproj index c2ed3cd411..c2266ce701 100644 --- a/Common/Common.vcxproj +++ b/Common/Common.vcxproj @@ -233,6 +233,7 @@ + @@ -300,6 +301,7 @@ + Create Create @@ -326,4 +328,4 @@ - + \ No newline at end of file diff --git a/Common/Common.vcxproj.filters b/Common/Common.vcxproj.filters index c707726aa0..874c86925a 100644 --- a/Common/Common.vcxproj.filters +++ b/Common/Common.vcxproj.filters @@ -73,6 +73,7 @@ Vulkan + @@ -135,6 +136,7 @@ + @@ -150,4 +152,4 @@ {c14d66ef-5f7c-4565-975a-72774e7ccfb9} - + \ No newline at end of file diff --git a/Common/OSVersion.cpp b/Common/OSVersion.cpp new file mode 100644 index 0000000000..4e1a2f5381 --- /dev/null +++ b/Common/OSVersion.cpp @@ -0,0 +1,87 @@ + +#ifdef _MSC_VER + +#include +#include "OSVersion.h" +#include "Common/CommonWindows.h" + +bool DoesVersionMatchWindows(uint32_t major, uint32_t minor, uint32_t spMajor, uint32_t spMinor) { + uint64_t conditionMask = 0; + OSVERSIONINFOEX osvi; + ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX)); + + osvi.dwOSVersionInfoSize = sizeof(osvi); + osvi.dwMajorVersion = major; + osvi.dwMinorVersion = minor; + osvi.wServicePackMajor = spMajor; + osvi.wServicePackMinor = spMinor; + uint32_t op = VER_EQUAL; + + VER_SET_CONDITION(conditionMask, VER_MAJORVERSION, op); + VER_SET_CONDITION(conditionMask, VER_MINORVERSION, op); + VER_SET_CONDITION(conditionMask, VER_SERVICEPACKMAJOR, op); + VER_SET_CONDITION(conditionMask, VER_SERVICEPACKMINOR, op); + + const uint32_t typeMask = VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR; + + return VerifyVersionInfo(&osvi, typeMask, conditionMask) != FALSE; +} + +std::string GetWindowsVersion() { + const bool IsWindowsXPSP2 = DoesVersionMatchWindows(5, 1, 2, 0); + const bool IsWindowsXPSP3 = DoesVersionMatchWindows(5, 1, 3, 0); + const bool IsWindowsVista = DoesVersionMatchWindows(6, 0); + const bool IsWindowsVistaSP1 = DoesVersionMatchWindows(6, 0, 1, 0); + const bool IsWindowsVistaSP2 = DoesVersionMatchWindows(6, 0, 2, 0); + const bool IsWindows7 = DoesVersionMatchWindows(6, 1); + const bool IsWindows7SP1 = DoesVersionMatchWindows(6, 1, 1, 0); + const bool IsWindows8 = DoesVersionMatchWindows(6, 2); + const bool IsWindows8_1 = DoesVersionMatchWindows(6, 3); + + if (IsWindowsXPSP2) + return "Microsoft Windows XP, Service Pack 2"; + + if (IsWindowsXPSP3) + return "Microsoft Windows XP, Service Pack 3"; + + if (IsWindowsVista) + return "Microsoft Windows Vista"; + + if (IsWindowsVistaSP1) + return "Microsoft Windows Vista, Service Pack 1"; + + if (IsWindowsVistaSP2) + return "Microsoft Windows Vista, Service Pack 2"; + + if (IsWindows7) + return "Microsoft Windows 7"; + + if (IsWindows7SP1) + return "Microsoft Windows 7, Service Pack 1"; + + if (IsWindows8) + return "Microsoft Windows 8 or greater"; // "Applications not manifested for Windows 10 will return the Windows 8 OS version value (6.2)." + + if (IsWindows8_1) + return "Microsoft Windows 8.1"; + + return "Unsupported version of Microsoft Windows."; +} + +std::string GetWindowsSystemArchitecture() { + SYSTEM_INFO sysinfo; + ZeroMemory(&sysinfo, sizeof(SYSTEM_INFO)); + GetNativeSystemInfo(&sysinfo); + + if (sysinfo.wProcessorArchitecture & PROCESSOR_ARCHITECTURE_AMD64) + return "(x64)"; + // Need to check for equality here, since ANDing with 0 is always 0. + else if (sysinfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL) + return "(x86)"; + else if (sysinfo.wProcessorArchitecture & PROCESSOR_ARCHITECTURE_ARM) + return "(ARM)"; + else + return "(Unknown)"; +} + +#endif \ No newline at end of file diff --git a/Common/OSVersion.h b/Common/OSVersion.h new file mode 100644 index 0000000000..ded3801046 --- /dev/null +++ b/Common/OSVersion.h @@ -0,0 +1,11 @@ +#pragma once + +#include + +#ifdef _MSC_VER + +bool DoesVersionMatchWindows(uint32_t major, uint32_t minor, uint32_t spMajor = 0, uint32_t spMinor = 0); +std::string GetWindowsVersion(); +std::string GetWindowsSystemArchitecture(); + +#endif \ No newline at end of file diff --git a/UI/GameSettingsScreen.cpp b/UI/GameSettingsScreen.cpp index 48c1d09dfb..a60ccdc04c 100644 --- a/UI/GameSettingsScreen.cpp +++ b/UI/GameSettingsScreen.cpp @@ -44,6 +44,7 @@ #include "Common/KeyMap.h" #include "Common/FileUtil.h" +#include "Common/OSVersion.h" #include "Core/Config.h" #include "Core/Host.h" #include "Core/System.h" @@ -159,6 +160,13 @@ void GameSettingsScreen::CreateViews() { #if !defined(_WIN32) renderingBackendChoice->HideChoice(1); // D3D9 renderingBackendChoice->HideChoice(2); // D3D11 +#else + if (!DoesVersionMatchWindows(6, 2)) { + // Hide the D3D11 choice if Windows version is older than Windows 8. + // We will later be able to support Windows 7 and Vista (unofficially) as well, + // but we currently depend on a texture format that's only available in Win8+. + renderingBackendChoice->HideChoice(2); // D3D11 + } #endif #if !defined(_WIN32) // TODO: Add dynamic runtime check for Vulkan support on Android diff --git a/Windows/main.cpp b/Windows/main.cpp index 3df8e75021..3b6a10a307 100644 --- a/Windows/main.cpp +++ b/Windows/main.cpp @@ -19,6 +19,8 @@ #include #include "Common/CommonWindows.h" +#include "Common/OSVersion.h" + #include #include #include @@ -85,86 +87,6 @@ void Vibrate(int length_ms) { // Ignore on PC } -bool DoesVersionMatchWindows(const u32 major, const u32 minor, const u32 spMajor = 0, const u32 spMinor = 0) { - u64 conditionMask = 0; - OSVERSIONINFOEX osvi; - ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX)); - - osvi.dwOSVersionInfoSize = sizeof(osvi); - osvi.dwMajorVersion = major; - osvi.dwMinorVersion = minor; - osvi.wServicePackMajor = spMajor; - osvi.wServicePackMinor = spMinor; - u32 op = VER_EQUAL; - - VER_SET_CONDITION(conditionMask, VER_MAJORVERSION, op); - VER_SET_CONDITION(conditionMask, VER_MINORVERSION, op); - VER_SET_CONDITION(conditionMask, VER_SERVICEPACKMAJOR, op); - VER_SET_CONDITION(conditionMask, VER_SERVICEPACKMINOR, op); - - const u32 typeMask = VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR; - - return VerifyVersionInfo(&osvi, typeMask, conditionMask) != FALSE; -} - -std::string GetWindowsVersion() { - const bool IsWindowsXPSP2 = DoesVersionMatchWindows(5, 1, 2, 0); - const bool IsWindowsXPSP3 = DoesVersionMatchWindows(5, 1, 3, 0); - const bool IsWindowsVista = DoesVersionMatchWindows(6, 0); - const bool IsWindowsVistaSP1 = DoesVersionMatchWindows(6, 0, 1, 0); - const bool IsWindowsVistaSP2 = DoesVersionMatchWindows(6, 0, 2, 0); - const bool IsWindows7 = DoesVersionMatchWindows(6, 1); - const bool IsWindows7SP1 = DoesVersionMatchWindows(6, 1, 1, 0); - const bool IsWindows8 = DoesVersionMatchWindows(6, 2); - const bool IsWindows8_1 = DoesVersionMatchWindows(6, 3); - - - if (IsWindowsXPSP2) - return "Microsoft Windows XP, Service Pack 2"; - - if (IsWindowsXPSP3) - return "Microsoft Windows XP, Service Pack 3"; - - if (IsWindowsVista) - return "Microsoft Windows Vista"; - - if (IsWindowsVistaSP1) - return "Microsoft Windows Vista, Service Pack 1"; - - if (IsWindowsVistaSP2) - return "Microsoft Windows Vista, Service Pack 2"; - - if (IsWindows7) - return "Microsoft Windows 7"; - - if (IsWindows7SP1) - return "Microsoft Windows 7, Service Pack 1"; - - if (IsWindows8) - return "Microsoft Windows 8 or greater"; // "Applications not manifested for Windows 10 will return the Windows 8 OS version value (6.2)." - - if (IsWindows8_1) - return "Microsoft Windows 8.1"; - - return "Unsupported version of Microsoft Windows."; -} - -std::string GetWindowsSystemArchitecture() { - SYSTEM_INFO sysinfo; - ZeroMemory(&sysinfo, sizeof(SYSTEM_INFO)); - GetNativeSystemInfo(&sysinfo); - - if (sysinfo.wProcessorArchitecture & PROCESSOR_ARCHITECTURE_AMD64) - return "(x64)"; - // Need to check for equality here, since ANDing with 0 is always 0. - else if (sysinfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL) - return "(x86)"; - else if (sysinfo.wProcessorArchitecture & PROCESSOR_ARCHITECTURE_ARM) - return "(ARM)"; - else - return "(Unknown)"; -} - // Adapted mostly as-is from http://www.gamedev.net/topic/495075-how-to-retrieve-info-about-videocard/?view=findpost&p=4229170 // so credit goes to that post's author, and in turn, the author of the site mentioned in that post (which seems to be down?). std::string GetVideoCardDriverVersion() {