summaryrefslogtreecommitdiff
path: root/Source/Core/Common/DynamicLibrary.cpp
diff options
context:
space:
mode:
authorConnor McLaughlin <stenzek@gmail.com>2019-03-29 20:40:06 +1000
committerGitHub <noreply@github.com>2019-03-29 20:40:06 +1000
commitf3fadd730218429a5f6472283d16d30d7e276f8d (patch)
treed1d6577cd52b2d3b3d7872aef4fac80dbd0ce563 /Source/Core/Common/DynamicLibrary.cpp
parentfbe57e8dbef17e583f0ba0208af7bf414a3716bf (diff)
parentd0d010f8549cc902829f567b3b5127d9a0556ca5 (diff)
Merge pull request #7869 from stenzek/d3dcommon
D3D: Move sharable D3D11/D3D12 code to common library
Diffstat (limited to 'Source/Core/Common/DynamicLibrary.cpp')
-rw-r--r--Source/Core/Common/DynamicLibrary.cpp100
1 files changed, 100 insertions, 0 deletions
diff --git a/Source/Core/Common/DynamicLibrary.cpp b/Source/Core/Common/DynamicLibrary.cpp
new file mode 100644
index 0000000000..1c32cc6708
--- /dev/null
+++ b/Source/Core/Common/DynamicLibrary.cpp
@@ -0,0 +1,100 @@
+// Copyright 2019 Dolphin Emulator Project
+// Licensed under GPLv2+
+// Refer to the license.txt file included.
+
+#include "Common/DynamicLibrary.h"
+#include <cstring>
+#include "Common/Assert.h"
+#include "Common/StringUtil.h"
+
+#ifdef _WIN32
+#include <Windows.h>
+#else
+#include <dlfcn.h>
+#endif
+
+namespace Common
+{
+DynamicLibrary::DynamicLibrary() = default;
+
+DynamicLibrary::DynamicLibrary(const char* filename)
+{
+ Open(filename);
+}
+
+DynamicLibrary::~DynamicLibrary()
+{
+ Close();
+}
+
+std::string DynamicLibrary::GetUnprefixedFilename(const char* filename)
+{
+#if defined(_WIN32)
+ return std::string(filename) + ".dll";
+#elif defined(__APPLE__)
+ return std::string(filename) + ".dylib";
+#else
+ return std::string(filename) + ".so";
+#endif
+}
+
+std::string DynamicLibrary::GetVersionedFilename(const char* libname, int major, int minor)
+{
+#if defined(_WIN32)
+ if (major >= 0 && minor >= 0)
+ return StringFromFormat("%s-%d-%d.dll", libname, major, minor);
+ else if (major >= 0)
+ return StringFromFormat("%s-%d.dll", libname, major);
+ else
+ return StringFromFormat("%s.dll", libname);
+#elif defined(__APPLE__)
+ const char* prefix = std::strncmp(libname, "lib", 3) ? "lib" : "";
+ if (major >= 0 && minor >= 0)
+ return StringFromFormat("%s%s.%d.%d.dylib", prefix, libname, major, minor);
+ else if (major >= 0)
+ return StringFromFormat("%s%s.%d.dylib", prefix, libname, major);
+ else
+ return StringFromFormat("%s%s.dylib", prefix, libname);
+#else
+ const char* prefix = std::strncmp(libname, "lib", 3) ? "lib" : "";
+ if (major >= 0 && minor >= 0)
+ return StringFromFormat("%s%s.so.%d.%d", prefix, libname, major, minor);
+ else if (major >= 0)
+ return StringFromFormat("%s%s.so.%d", prefix, libname, major);
+ else
+ return StringFromFormat("%s%s.so", prefix, libname);
+#endif
+}
+
+bool DynamicLibrary::Open(const char* filename)
+{
+#ifdef _WIN32
+ m_handle = reinterpret_cast<void*>(LoadLibraryA(filename));
+#else
+ m_handle = dlopen(filename, RTLD_NOW);
+#endif
+ return m_handle != nullptr;
+}
+
+void DynamicLibrary::Close()
+{
+ if (!IsOpen())
+ return;
+
+#ifdef _WIN32
+ FreeLibrary(reinterpret_cast<HMODULE>(m_handle));
+#else
+ dlclose(m_handle);
+#endif
+ m_handle = nullptr;
+}
+
+void* DynamicLibrary::GetSymbolAddress(const char* name) const
+{
+#ifdef _WIN32
+ return reinterpret_cast<void*>(GetProcAddress(reinterpret_cast<HMODULE>(m_handle), name));
+#else
+ return reinterpret_cast<void*>(dlsym(m_handle, name));
+#endif
+}
+} // namespace Common