summaryrefslogtreecommitdiff
path: root/Source/Core/VideoCommon/VideoBackendBase.cpp
diff options
context:
space:
mode:
authorJules Blok <jules.blok@gmail.com>2015-06-10 00:00:12 +0200
committerJules Blok <jules.blok@gmail.com>2015-06-10 00:00:12 +0200
commit7dfced21a2e5aac7195e0e1ad76468e30306766b (patch)
treebd671b639d3d911460b767caabad8fc8a759a6bf /Source/Core/VideoCommon/VideoBackendBase.cpp
parentc25be031fc1031d795157d8344b87b7841145197 (diff)
parent7b0a65e295c784f9d573f2ef52d4e2a7b9bb2889 (diff)
Merge branch 'master' into stable
Diffstat (limited to 'Source/Core/VideoCommon/VideoBackendBase.cpp')
-rw-r--r--Source/Core/VideoCommon/VideoBackendBase.cpp83
1 files changed, 83 insertions, 0 deletions
diff --git a/Source/Core/VideoCommon/VideoBackendBase.cpp b/Source/Core/VideoCommon/VideoBackendBase.cpp
new file mode 100644
index 0000000000..c0e466cb5c
--- /dev/null
+++ b/Source/Core/VideoCommon/VideoBackendBase.cpp
@@ -0,0 +1,83 @@
+// Copyright 2011 Dolphin Emulator Project
+// Licensed under GPLv2+
+// Refer to the license.txt file included.
+
+// TODO: ugly
+#ifdef _WIN32
+#include "VideoBackends/D3D/VideoBackend.h"
+#endif
+#include "VideoBackends/OGL/VideoBackend.h"
+#include "VideoBackends/Software/VideoBackend.h"
+
+#include "VideoCommon/VideoBackendBase.h"
+
+std::vector<VideoBackend*> g_available_video_backends;
+VideoBackend* g_video_backend = nullptr;
+static VideoBackend* s_default_backend = nullptr;
+
+#ifdef _WIN32
+#include <windows.h>
+
+// http://msdn.microsoft.com/en-us/library/ms725491.aspx
+static bool IsGteVista()
+{
+ OSVERSIONINFOEX osvi;
+ DWORDLONG dwlConditionMask = 0;
+
+ ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
+ osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
+ osvi.dwMajorVersion = 6;
+
+ VER_SET_CONDITION(dwlConditionMask, VER_MAJORVERSION, VER_GREATER_EQUAL);
+
+ return VerifyVersionInfo(&osvi, VER_MAJORVERSION, dwlConditionMask) != FALSE;
+}
+
+// Nvidia drivers >= v302 will check if the application exports a global
+// variable named NvOptimusEnablement to know if it should run the app in high
+// performance graphics mode or using the IGP.
+extern "C" {
+__declspec(dllexport) DWORD NvOptimusEnablement = 1;
+}
+#endif
+
+void VideoBackend::PopulateList()
+{
+ VideoBackend* backends[4] = { nullptr };
+
+ // OGL > D3D11 > SW
+ g_available_video_backends.push_back(backends[0] = new OGL::VideoBackend);
+#ifdef _WIN32
+ if (IsGteVista())
+ g_available_video_backends.push_back(backends[1] = new DX11::VideoBackend);
+#endif
+ g_available_video_backends.push_back(backends[3] = new SW::VideoSoftware);
+
+ for (VideoBackend* backend : backends)
+ {
+ if (backend)
+ {
+ s_default_backend = g_video_backend = backend;
+ break;
+ }
+ }
+}
+
+void VideoBackend::ClearList()
+{
+ while (!g_available_video_backends.empty())
+ {
+ delete g_available_video_backends.back();
+ g_available_video_backends.pop_back();
+ }
+}
+
+void VideoBackend::ActivateBackend(const std::string& name)
+{
+ if (name.length() == 0) // If nullptr, set it to the default backend (expected behavior)
+ g_video_backend = s_default_backend;
+
+ for (VideoBackend* backend : g_available_video_backends)
+ if (name == backend->GetName())
+ g_video_backend = backend;
+}