Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #7869 from stenzek/d3dcommon
D3D: Move sharable D3D11/D3D12 code to common library
- Loading branch information
Showing
50 changed files
with
1,761 additions
and
1,423 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Original file line | Diff line number | Diff line change |
---|---|---|---|
@@ -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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Original file line | Diff line number | Diff line change |
---|---|---|---|
@@ -0,0 +1,67 @@ | |||
// Copyright 2019 Dolphin Emulator Project | |||
// Licensed under GPLv2+ | |||
// Refer to the license.txt file included. | |||
|
|||
#pragma once | |||
#include <atomic> | |||
#include <string> | |||
|
|||
namespace Common | |||
{ | |||
/** | |||
* Provides a platform-independent interface for loading a dynamic library and retrieving symbols. | |||
* The interface maintains an internal reference count to allow one handle to be shared between | |||
* multiple users. | |||
*/ | |||
class DynamicLibrary final | |||
{ | |||
public: | |||
// Default constructor, does not load a library. | |||
DynamicLibrary(); | |||
|
|||
// Automatically loads the specified library. Call IsOpen() to check validity before use. | |||
DynamicLibrary(const char* filename); | |||
|
|||
// Closes the library. | |||
~DynamicLibrary(); | |||
|
|||
// Returns the specified library name with the platform-specific suffix added. | |||
static std::string GetUnprefixedFilename(const char* filename); | |||
|
|||
// Returns the specified library name in platform-specific format. | |||
// Major/minor versions will not be included if set to -1. | |||
// If libname already contains the "lib" prefix, it will not be added again. | |||
// Windows: LIBNAME-MAJOR-MINOR.dll | |||
// Linux: libLIBNAME.so.MAJOR.MINOR | |||
// Mac: libLIBNAME.MAJOR.MINOR.dylib | |||
static std::string GetVersionedFilename(const char* libname, int major = -1, int minor = -1); | |||
|
|||
// Returns true if a module is loaded, otherwise false. | |||
bool IsOpen() const { return m_handle != nullptr; } | |||
|
|||
// Loads (or replaces) the handle with the specified library file name. | |||
// Returns true if the library was loaded and can be used. | |||
bool Open(const char* filename); | |||
|
|||
// Unloads the library, any function pointers from this library are no longer valid. | |||
void Close(); | |||
|
|||
// Returns the address of the specified symbol (function or variable) as an untyped pointer. | |||
// If the specified symbol does not exist in this library, nullptr is returned. | |||
void* GetSymbolAddress(const char* name) const; | |||
|
|||
// Obtains the address of the specified symbol, automatically casting to the correct type. | |||
// Returns true if the symbol was found and assigned, otherwise false. | |||
template <typename T> | |||
bool GetSymbol(const char* name, T* ptr) const | |||
{ | |||
*ptr = reinterpret_cast<T>(GetSymbolAddress(name)); | |||
return *ptr != nullptr; | |||
} | |||
|
|||
private: | |||
// Platform-dependent data type representing a dynamic library handle. | |||
void* m_handle = nullptr; | |||
}; | |||
|
|||
} // namespace Common |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.