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