summaryrefslogtreecommitdiff
path: root/Source/Core/VideoCommon/VideoBackendBase.cpp
diff options
context:
space:
mode:
authorOatmealDome <julian@oatmealdome.me>2021-07-25 16:11:01 -0400
committerOatmealDome <julian@oatmealdome.me>2021-07-25 19:21:06 -0400
commit46e331d000e0af8986189fb937f2b68f7dcb9bd1 (patch)
tree807722f1f9dce588772debd538b6a6565659397c /Source/Core/VideoCommon/VideoBackendBase.cpp
parent3e04cb6e6bd5e3606f07637711442130f4489bfb (diff)
VideoBackendBase: Prefer Vulkan over OGL on macOS Mojave and newer
Diffstat (limited to 'Source/Core/VideoCommon/VideoBackendBase.cpp')
-rw-r--r--Source/Core/VideoCommon/VideoBackendBase.cpp17
1 files changed, 16 insertions, 1 deletions
diff --git a/Source/Core/VideoCommon/VideoBackendBase.cpp b/Source/Core/VideoCommon/VideoBackendBase.cpp
index 1f93517dd1..cadbd08024 100644
--- a/Source/Core/VideoCommon/VideoBackendBase.cpp
+++ b/Source/Core/VideoCommon/VideoBackendBase.cpp
@@ -214,6 +214,10 @@ const std::vector<std::unique_ptr<VideoBackendBase>>& VideoBackendBase::GetAvail
std::vector<std::unique_ptr<VideoBackendBase>> backends;
// OGL > D3D11 > D3D12 > Vulkan > SW > Null
+ //
+ // On macOS Mojave and newer, we prefer Vulkan over OGL due to outdated drivers.
+ // However, on macOS High Sierra and older, we still prefer OGL due to its older Metal version
+ // missing several features required by the Vulkan backend.
#ifdef HAS_OPENGL
backends.push_back(std::make_unique<OGL::VideoBackend>());
#endif
@@ -222,7 +226,18 @@ const std::vector<std::unique_ptr<VideoBackendBase>>& VideoBackendBase::GetAvail
backends.push_back(std::make_unique<DX12::VideoBackend>());
#endif
#ifdef HAS_VULKAN
- backends.push_back(std::make_unique<Vulkan::VideoBackend>());
+#ifdef __APPLE__
+ // If we can run the Vulkan backend, emplace it at the beginning of the vector so
+ // it takes precedence over OpenGL.
+ if (__builtin_available(macOS 10.14, *))
+ {
+ backends.emplace(backends.begin(), std::make_unique<Vulkan::VideoBackend>());
+ }
+ else
+#endif
+ {
+ backends.push_back(std::make_unique<Vulkan::VideoBackend>());
+ }
#endif
#ifdef HAS_OPENGL
backends.push_back(std::make_unique<SW::VideoSoftware>());