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() {