Browse Source
Merge pull request #3594 from ReinUsesLisp/vk-instance
Merge pull request #3594 from ReinUsesLisp/vk-instance
yuzu: Drop SDL2 and Qt frontend Vulkan requirementsnce_cpp
committed by
GitHub
19 changed files with 624 additions and 340 deletions
-
2src/common/CMakeLists.txt
-
106src/common/dynamic_library.cpp
-
75src/common/dynamic_library.h
-
41src/core/frontend/emu_window.h
-
2src/video_core/renderer_vulkan/declarations.h
-
264src/video_core/renderer_vulkan/renderer_vulkan.cpp
-
19src/video_core/renderer_vulkan/renderer_vulkan.h
-
92src/video_core/renderer_vulkan/vk_device.cpp
-
21src/video_core/renderer_vulkan/vk_device.h
-
4src/yuzu/CMakeLists.txt
-
92src/yuzu/bootmanager.cpp
-
9src/yuzu/bootmanager.h
-
42src/yuzu/configuration/configure_graphics.cpp
-
6src/yuzu_cmd/emu_window/emu_window_sdl2_gl.cpp
-
4src/yuzu_cmd/emu_window/emu_window_sdl2_gl.h
-
159src/yuzu_cmd/emu_window/emu_window_sdl2_vk.cpp
-
18src/yuzu_cmd/emu_window/emu_window_sdl2_vk.h
-
4src/yuzu_tester/emu_window/emu_window_sdl2_hide.cpp
-
4src/yuzu_tester/emu_window/emu_window_sdl2_hide.h
@ -0,0 +1,106 @@ |
|||
// Copyright 2019 Dolphin Emulator Project
|
|||
// Licensed under GPLv2+
|
|||
// Refer to the license.txt file included.
|
|||
|
|||
#include <cstring>
|
|||
#include <string>
|
|||
#include <utility>
|
|||
|
|||
#include <fmt/format.h>
|
|||
|
|||
#include "common/dynamic_library.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(DynamicLibrary&& rhs) noexcept |
|||
: handle{std::exchange(rhs.handle, nullptr)} {} |
|||
|
|||
DynamicLibrary& DynamicLibrary::operator=(DynamicLibrary&& rhs) noexcept { |
|||
Close(); |
|||
handle = std::exchange(rhs.handle, nullptr); |
|||
return *this; |
|||
} |
|||
|
|||
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 fmt::format("{}-{}-{}.dll", libname, major, minor); |
|||
else if (major >= 0) |
|||
return fmt::format("{}-{}.dll", libname, major); |
|||
else |
|||
return fmt::format("{}.dll", libname); |
|||
#elif defined(__APPLE__)
|
|||
const char* prefix = std::strncmp(libname, "lib", 3) ? "lib" : ""; |
|||
if (major >= 0 && minor >= 0) |
|||
return fmt::format("{}{}.{}.{}.dylib", prefix, libname, major, minor); |
|||
else if (major >= 0) |
|||
return fmt::format("{}{}.{}.dylib", prefix, libname, major); |
|||
else |
|||
return fmt::format("{}{}.dylib", prefix, libname); |
|||
#else
|
|||
const char* prefix = std::strncmp(libname, "lib", 3) ? "lib" : ""; |
|||
if (major >= 0 && minor >= 0) |
|||
return fmt::format("{}{}.so.{}.{}", prefix, libname, major, minor); |
|||
else if (major >= 0) |
|||
return fmt::format("{}{}.so.{}", prefix, libname, major); |
|||
else |
|||
return fmt::format("{}{}.so", prefix, libname); |
|||
#endif
|
|||
} |
|||
|
|||
bool DynamicLibrary::Open(const char* filename) { |
|||
#ifdef _WIN32
|
|||
handle = reinterpret_cast<void*>(LoadLibraryA(filename)); |
|||
#else
|
|||
handle = dlopen(filename, RTLD_NOW); |
|||
#endif
|
|||
return handle != nullptr; |
|||
} |
|||
|
|||
void DynamicLibrary::Close() { |
|||
if (!IsOpen()) |
|||
return; |
|||
|
|||
#ifdef _WIN32
|
|||
FreeLibrary(reinterpret_cast<HMODULE>(handle)); |
|||
#else
|
|||
dlclose(handle); |
|||
#endif
|
|||
handle = nullptr; |
|||
} |
|||
|
|||
void* DynamicLibrary::GetSymbolAddress(const char* name) const { |
|||
#ifdef _WIN32
|
|||
return reinterpret_cast<void*>(GetProcAddress(reinterpret_cast<HMODULE>(handle), name)); |
|||
#else
|
|||
return reinterpret_cast<void*>(dlsym(handle, name)); |
|||
#endif
|
|||
} |
|||
|
|||
} // namespace Common
|
|||
@ -0,0 +1,75 @@ |
|||
// Copyright 2019 Dolphin Emulator Project |
|||
// Licensed under GPLv2+ |
|||
// Refer to the license.txt file included. |
|||
|
|||
#pragma once |
|||
|
|||
#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. |
|||
explicit DynamicLibrary(); |
|||
|
|||
/// Automatically loads the specified library. Call IsOpen() to check validity before use. |
|||
explicit DynamicLibrary(const char* filename); |
|||
|
|||
/// Moves the library. |
|||
DynamicLibrary(DynamicLibrary&&) noexcept; |
|||
DynamicLibrary& operator=(DynamicLibrary&&) noexcept; |
|||
|
|||
/// Delete copies, we can't copy a dynamic library. |
|||
DynamicLibrary(const DynamicLibrary&) = delete; |
|||
DynamicLibrary& operator=(const DynamicLibrary&) = delete; |
|||
|
|||
/// 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 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* handle = nullptr; |
|||
}; |
|||
|
|||
} // namespace Common |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue